From 4640c5e02bc2db4c0c07159a7839d949ebcf9b9b Mon Sep 17 00:00:00 2001 From: changjunqiang <344656718@qq.com> Date: Mon, 15 Jun 2026 09:00:38 +0800 Subject: [PATCH] add --- .gitignore | 24 + .vscode/extensions.json | 3 + README.md | 5 + index.html | 15 + package-lock.json | 2727 +++++++++++++++++ package.json | 24 + {c => public/c}/.vscode/launch.json | 0 {c => public/c}/.vscode/settings.json | 0 {c => public/c}/.vscode/tasks.json | 0 {c => public/c}/ch1/compare.c | 0 {c => public/c}/ch1/compare.exe | Bin {c => public/c}/ch1/compareall.c | 0 {c => public/c}/ch1/first.c | 0 {c => public/c}/ch1/first.exe | Bin {c => public/c}/ch2/bigcheng/bigchengnew.c | 0 {c => public/c}/ch2/bigcheng/bigchengnew.exe | Bin {c => public/c}/ch2/bigcheng/bigchengold.c | 0 {c => public/c}/ch2/bigcheng/bigchengold.exe | Bin {c => public/c}/ch2/ch2.allpai/allpai.c | 0 {c => public/c}/ch2/ch2.allpai/allpai.exe | Bin {c => public/c}/ch2/ch2.allpai/allpaichong.c | 0 .../c}/ch2/ch2.allpai/allpaichong.exe | Bin {c => public/c}/ch2/ch2.allpai/arrpaichong.c | 0 .../c}/ch2/ch2.allpai/arrpaichong.exe | Bin {c => public/c}/ch2/digui/printnumber.c | 0 {c => public/c}/ch2/digui/printnumber.exe | Bin {c => public/c}/ch2/digui/tuxing.c | 0 {c => public/c}/ch2/digui/tuxing.exe | Bin {c => public/c}/ch2/halfsearch/fenzhi.c | 0 {c => public/c}/ch2/halfsearch/fenzhi.exe | Bin {c => public/c}/ch2/halfsearch/fenzhirec.c | 0 {c => public/c}/ch2/halfsearch/fenzhirec.exe | Bin {c => public/c}/ch2/juzhen/juzhennew.c | 0 {c => public/c}/ch2/juzhen/juzhennew.exe | Bin {c => public/c}/ch2/juzhen/juzhenold.c | 0 {c => public/c}/ch2/juzhen/juzhenold.exe | Bin {c => public/c}/ch2/maopao/mp.c | 0 {c => public/c}/ch2/maopao/mp.exe | Bin {c => public/c}/ch2/matrix/macheng.c | 0 {c => public/c}/ch2/mergesort/guibing.c | 0 {c => public/c}/ch2/mergesort/guibing.exe | Bin {c => public/c}/ch2/mergesort/merge.c | 0 {c => public/c}/ch2/mergesort/merge.exe | Bin {c => public/c}/ch2/quicksort/danleft.c | 0 {c => public/c}/ch2/quicksort/danleft.exe | Bin {c => public/c}/ch2/quicksort/danppt.c | 0 {c => public/c}/ch2/quicksort/danppt.exe | Bin {c => public/c}/ch2/quicksort/dantwo.c | 0 {c => public/c}/ch2/quicksort/shuangbian.c | 0 {c => public/c}/ch2/quicksort/shuangbian.exe | Bin {c => public/c}/ch2/richeng/bisan.c | 0 {c => public/c}/ch2/richeng/bisan.exe | Bin {c => public/c}/ch2/shangji/findarrmax.c | 0 {c => public/c}/ch2/shangji/findarrmax.exe | Bin {c => public/c}/ch2/shangji/sanjiao.c | 0 {c => public/c}/ch2/shangji/sanjiao.exe | Bin {c => public/c}/ch2/student/halfsearch.c | 0 {c => public/c}/ch2/student/halfsearch.exe | Bin {c => public/c}/ch2/student/halfsearchnew.c | 0 {c => public/c}/ch2/student/halfsearchnew.exe | Bin {c => public/c}/ch2/student/paichongright.c | 0 {c => public/c}/ch2/student/paichongright.exe | Bin {c => public/c}/ch2/student/ppp.c | 0 {c => public/c}/ch2/student/ppp.exe | Bin {c => public/c}/ch2/student/quanpai.c | 0 {c => public/c}/ch2/student/quanpai.exe | Bin {c => public/c}/ch2/student/sanjiao.c | 0 {c => public/c}/ch2/student/sanjiao.exe | Bin {c => public/c}/ch3/bag01/bag01.c | 0 {c => public/c}/ch3/bag01/bag01.exe | Bin {c => public/c}/ch3/bag01/bagbag.c | 0 {c => public/c}/ch3/bag01/bagevery.c | 0 {c => public/c}/ch3/bag01/bagevery.exe | Bin {c => public/c}/ch3/bag01/yanghui.c | 0 {c => public/c}/ch3/bag01/yanghui.exe | Bin {c => public/c}/ch3/bag01/yanghuiarr.c | 0 {c => public/c}/ch3/bag01/yanghuiarr.exe | Bin {c => public/c}/ch3/homework/lesscoin.c | 0 {c => public/c}/ch3/homework/lesscoin.exe | Bin {c => public/c}/ch3/image/get2Len.c | 0 {c => public/c}/ch3/image/get2Len.exe | Bin {c => public/c}/ch3/image/imgcompress.c | 0 {c => public/c}/ch3/image/imgcompress.exe | Bin {c => public/c}/ch3/image/imgcompress0.c | 0 {c => public/c}/ch3/image/imgcompress0.exe | Bin {c => public/c}/ch3/lcs/lcs1.c | 0 {c => public/c}/ch3/lcs/lcs1.exe | Bin {c => public/c}/ch3/lcs/lcs2.c | 0 {c => public/c}/ch3/lcs/printtable.c | 0 {c => public/c}/ch3/lcs/printtable.exe | Bin {c => public/c}/ch3/matrix/chengJia.c | 0 {c => public/c}/ch3/matrix/chengJia.exe | Bin {c => public/c}/ch3/matrix/duijiaoxian.c | 0 {c => public/c}/ch3/matrix/duijiaoxian.exe | Bin {c => public/c}/ch3/matrix/kuohao.c | 0 {c => public/c}/ch3/matrix/kuohao.exe | Bin {c => public/c}/ch3/matrix/matrixmul.c | 0 {c => public/c}/ch3/matrix/matrixmul.exe | Bin {c => public/c}/ch3/matrix/weishu.c | 0 {c => public/c}/ch3/matrix/weishu.exe | Bin {c => public/c}/ch4/bag/tanbag.c | 0 {c => public/c}/ch4/bag/tanbag.exe | Bin {c => public/c}/ch4/bag/tanbagtest.c | 0 {c => public/c}/ch4/bag/tanbagtest.exe | Bin {c => public/c}/ch4/bestload/loading.c | 0 {c => public/c}/ch4/bestload/loading.exe | Bin {c => public/c}/ch4/bestload/sortAttr.c | 0 {c => public/c}/ch4/bestload/sortAttr.exe | Bin {c => public/c}/ch4/huffman/halfall.c | 0 {c => public/c}/ch4/huffman/halfall.exe | Bin {c => public/c}/ch4/huffman/halfcode.c | 0 {c => public/c}/ch4/huffman/halfcode.exe | Bin {c => public/c}/ch4/huffman/halftree.c | 0 {c => public/c}/ch4/huffman/halftree.exe | Bin {c => public/c}/ch4/huffman/huffman_codes.txt | 0 {c => public/c}/ch4/huffman/treelist.c | 0 {c => public/c}/ch4/huffman/treelist.exe | Bin {c => public/c}/ch4/huodong/fenpei.c | 0 {c => public/c}/ch4/huodong/fenpei.exe | Bin {c => public/c}/ch4/money/getmoney.c | 0 {c => public/c}/ch4/money/getmoney.exe | Bin {c => public/c}/ch4/money/moneytwowei.c | 0 {c => public/c}/ch4/money/moneytwowei.exe | Bin {c => public/c}/ch4/shortest/path.c | 0 {c => public/c}/ch4/shortest/path.exe | Bin {c => public/c}/ch4/shortest/shortpath.c | 0 {c => public/c}/ch4/shortest/shortpath.exe | Bin {c => public/c}/ch5/hui01bag/huisu01bag.c | 0 {c => public/c}/ch5/hui01bag/huisu01bag.exe | Bin {c => public/c}/ch5/loading/huiloading.c | 0 {c => public/c}/ch5/loading/huiloading.exe | Bin {c => public/c}/ch5/loading/loading2.c | 0 {c => public/c}/ch5/loading/loading2.exe | Bin {c => public/c}/ch5/queue/nqueue.c | 0 {c => public/c}/ch5/queue/nqueue.exe | Bin {c => public/c}/ch6/graph/bfs.c | 0 {c => public/c}/ch6/graph/bfs.exe | Bin {c => public/c}/ch6/graph/dfs.c | 0 {c => public/c}/ch6/graph/dfs.exe | Bin {c => public/c}/ch6/tsp/fenzhi/tsp2.c | 0 {c => public/c}/ch6/tsp/fenzhi/tsp2.exe | Bin {c => public/c}/ch6/tsp/huisu/travelroute.c | 0 {c => public/c}/ch6/tsp/huisu/travelroute.exe | Bin {c => public/c}/ch6/xianbag01/bag01fifo.c | 0 {c => public/c}/ch6/xianbag01/bag01fifo.exe | Bin .../c}/ch6/xianbag01/bag01livevalue.c | 0 .../c}/ch6/xianbag01/bag01livevalue.exe | Bin {c => public/c}/final/PaperB/guibing.c | 0 {c => public/c}/final/PaperB/guibing.exe | Bin {c => public/c}/final/nqueenPlus/safequeue.c | 0 .../c}/final/nqueenPlus/safequeue.exe | Bin {c => public/c}/final/nqueenPlus/testnqplus.c | 0 .../c}/final/nqueenPlus/testnqplus.exe | Bin {c => public/c}/final/visit4char.c | 0 {c => public/c}/final/visit4char.exe | Bin {c => public/c}/final/visit4chardigui.c | 0 {c => public/c}/final/visit4chardigui.exe | Bin {c => public/c}/final/visit4num.c | 0 {c => public/c}/final/visit4num.exe | Bin {c => public/c}/test/ab.c | 0 {c => public/c}/test/ab.exe | Bin {c => public/c}/test/ctrip.json | 0 {c => public/c}/test/detail.json | 0 {c => public/c}/test/guan.json | 0 {c => public/c}/test/list.json | 0 {c => public/c}/test/order.json | 0 {c => public/c}/test/ticket.json | 0 {c => public/c}/test/tongdata.json | 0 {c => public/c}/test/xiedata.json | 0 public/favicon.svg | 1 + public/icons.svg | 24 + src/App.vue | 54 + src/__tests__/chapters.test.js | 53 + src/__tests__/sortAnimations.test.js | 118 + src/assets/hero.png | Bin 0 -> 13057 bytes src/assets/vite.svg | 1 + src/assets/vue.svg | 1 + src/components/CodeViewer.vue | 180 ++ src/components/HelloWorld.vue | 95 + src/components/Sidebar.vue | 166 + src/components/SortVisualizer.vue | 463 +++ src/data/chapters.js | 366 +++ src/main.js | 8 + src/router/index.js | 30 + src/style.css | 390 +++ src/utils/codeUtils.js | 55 + src/utils/sortAnimations.js | 291 ++ src/views/ChapterView.vue | 405 +++ src/views/Home.vue | 278 ++ src/views/SortDemo.vue | 258 ++ vite.config.js | 11 + 191 files changed, 6046 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json rename {c => public/c}/.vscode/launch.json (100%) rename {c => public/c}/.vscode/settings.json (100%) rename {c => public/c}/.vscode/tasks.json (100%) rename {c => public/c}/ch1/compare.c (100%) rename {c => public/c}/ch1/compare.exe (100%) rename {c => public/c}/ch1/compareall.c (100%) rename {c => public/c}/ch1/first.c (100%) rename {c => public/c}/ch1/first.exe (100%) rename {c => public/c}/ch2/bigcheng/bigchengnew.c (100%) rename {c => public/c}/ch2/bigcheng/bigchengnew.exe (100%) rename {c => public/c}/ch2/bigcheng/bigchengold.c (100%) rename {c => public/c}/ch2/bigcheng/bigchengold.exe (100%) rename {c => public/c}/ch2/ch2.allpai/allpai.c (100%) rename {c => public/c}/ch2/ch2.allpai/allpai.exe (100%) rename {c => public/c}/ch2/ch2.allpai/allpaichong.c (100%) rename {c => public/c}/ch2/ch2.allpai/allpaichong.exe (100%) rename {c => public/c}/ch2/ch2.allpai/arrpaichong.c (100%) rename {c => public/c}/ch2/ch2.allpai/arrpaichong.exe (100%) rename {c => public/c}/ch2/digui/printnumber.c (100%) rename {c => public/c}/ch2/digui/printnumber.exe (100%) rename {c => public/c}/ch2/digui/tuxing.c (100%) rename {c => public/c}/ch2/digui/tuxing.exe (100%) rename {c => public/c}/ch2/halfsearch/fenzhi.c (100%) rename {c => public/c}/ch2/halfsearch/fenzhi.exe (100%) rename {c => public/c}/ch2/halfsearch/fenzhirec.c (100%) rename {c => public/c}/ch2/halfsearch/fenzhirec.exe (100%) rename {c => public/c}/ch2/juzhen/juzhennew.c (100%) rename {c => public/c}/ch2/juzhen/juzhennew.exe (100%) rename {c => public/c}/ch2/juzhen/juzhenold.c (100%) rename {c => public/c}/ch2/juzhen/juzhenold.exe (100%) rename {c => public/c}/ch2/maopao/mp.c (100%) rename {c => public/c}/ch2/maopao/mp.exe (100%) rename {c => public/c}/ch2/matrix/macheng.c (100%) rename {c => public/c}/ch2/mergesort/guibing.c (100%) rename {c => public/c}/ch2/mergesort/guibing.exe (100%) rename {c => public/c}/ch2/mergesort/merge.c (100%) rename {c => public/c}/ch2/mergesort/merge.exe (100%) rename {c => public/c}/ch2/quicksort/danleft.c (100%) rename {c => public/c}/ch2/quicksort/danleft.exe (100%) rename {c => public/c}/ch2/quicksort/danppt.c (100%) rename {c => public/c}/ch2/quicksort/danppt.exe (100%) rename {c => public/c}/ch2/quicksort/dantwo.c (100%) rename {c => public/c}/ch2/quicksort/shuangbian.c (100%) rename {c => public/c}/ch2/quicksort/shuangbian.exe (100%) rename {c => public/c}/ch2/richeng/bisan.c (100%) rename {c => public/c}/ch2/richeng/bisan.exe (100%) rename {c => public/c}/ch2/shangji/findarrmax.c (100%) rename {c => public/c}/ch2/shangji/findarrmax.exe (100%) rename {c => public/c}/ch2/shangji/sanjiao.c (100%) rename {c => public/c}/ch2/shangji/sanjiao.exe (100%) rename {c => public/c}/ch2/student/halfsearch.c (100%) rename {c => public/c}/ch2/student/halfsearch.exe (100%) rename {c => public/c}/ch2/student/halfsearchnew.c (100%) rename {c => public/c}/ch2/student/halfsearchnew.exe (100%) rename {c => public/c}/ch2/student/paichongright.c (100%) rename {c => public/c}/ch2/student/paichongright.exe (100%) rename {c => public/c}/ch2/student/ppp.c (100%) rename {c => public/c}/ch2/student/ppp.exe (100%) rename {c => public/c}/ch2/student/quanpai.c (100%) rename {c => public/c}/ch2/student/quanpai.exe (100%) rename {c => public/c}/ch2/student/sanjiao.c (100%) rename {c => public/c}/ch2/student/sanjiao.exe (100%) rename {c => public/c}/ch3/bag01/bag01.c (100%) rename {c => public/c}/ch3/bag01/bag01.exe (100%) rename {c => public/c}/ch3/bag01/bagbag.c (100%) rename {c => public/c}/ch3/bag01/bagevery.c (100%) rename {c => public/c}/ch3/bag01/bagevery.exe (100%) rename {c => public/c}/ch3/bag01/yanghui.c (100%) rename {c => public/c}/ch3/bag01/yanghui.exe (100%) rename {c => public/c}/ch3/bag01/yanghuiarr.c (100%) rename {c => public/c}/ch3/bag01/yanghuiarr.exe (100%) rename {c => public/c}/ch3/homework/lesscoin.c (100%) rename {c => public/c}/ch3/homework/lesscoin.exe (100%) rename {c => public/c}/ch3/image/get2Len.c (100%) rename {c => public/c}/ch3/image/get2Len.exe (100%) rename {c => public/c}/ch3/image/imgcompress.c (100%) rename {c => public/c}/ch3/image/imgcompress.exe (100%) rename {c => public/c}/ch3/image/imgcompress0.c (100%) rename {c => public/c}/ch3/image/imgcompress0.exe (100%) rename {c => public/c}/ch3/lcs/lcs1.c (100%) rename {c => public/c}/ch3/lcs/lcs1.exe (100%) rename {c => public/c}/ch3/lcs/lcs2.c (100%) rename {c => public/c}/ch3/lcs/printtable.c (100%) rename {c => public/c}/ch3/lcs/printtable.exe (100%) rename {c => public/c}/ch3/matrix/chengJia.c (100%) rename {c => public/c}/ch3/matrix/chengJia.exe (100%) rename {c => public/c}/ch3/matrix/duijiaoxian.c (100%) rename {c => public/c}/ch3/matrix/duijiaoxian.exe (100%) rename {c => public/c}/ch3/matrix/kuohao.c (100%) rename {c => public/c}/ch3/matrix/kuohao.exe (100%) rename {c => public/c}/ch3/matrix/matrixmul.c (100%) rename {c => public/c}/ch3/matrix/matrixmul.exe (100%) rename {c => public/c}/ch3/matrix/weishu.c (100%) rename {c => public/c}/ch3/matrix/weishu.exe (100%) rename {c => public/c}/ch4/bag/tanbag.c (100%) rename {c => public/c}/ch4/bag/tanbag.exe (100%) rename {c => public/c}/ch4/bag/tanbagtest.c (100%) rename {c => public/c}/ch4/bag/tanbagtest.exe (100%) rename {c => public/c}/ch4/bestload/loading.c (100%) rename {c => public/c}/ch4/bestload/loading.exe (100%) rename {c => public/c}/ch4/bestload/sortAttr.c (100%) rename {c => public/c}/ch4/bestload/sortAttr.exe (100%) rename {c => public/c}/ch4/huffman/halfall.c (100%) rename {c => public/c}/ch4/huffman/halfall.exe (100%) rename {c => public/c}/ch4/huffman/halfcode.c (100%) rename {c => public/c}/ch4/huffman/halfcode.exe (100%) rename {c => public/c}/ch4/huffman/halftree.c (100%) rename {c => public/c}/ch4/huffman/halftree.exe (100%) rename {c => public/c}/ch4/huffman/huffman_codes.txt (100%) rename {c => public/c}/ch4/huffman/treelist.c (100%) rename {c => public/c}/ch4/huffman/treelist.exe (100%) rename {c => public/c}/ch4/huodong/fenpei.c (100%) rename {c => public/c}/ch4/huodong/fenpei.exe (100%) rename {c => public/c}/ch4/money/getmoney.c (100%) rename {c => public/c}/ch4/money/getmoney.exe (100%) rename {c => public/c}/ch4/money/moneytwowei.c (100%) rename {c => public/c}/ch4/money/moneytwowei.exe (100%) rename {c => public/c}/ch4/shortest/path.c (100%) rename {c => public/c}/ch4/shortest/path.exe (100%) rename {c => public/c}/ch4/shortest/shortpath.c (100%) rename {c => public/c}/ch4/shortest/shortpath.exe (100%) rename {c => public/c}/ch5/hui01bag/huisu01bag.c (100%) rename {c => public/c}/ch5/hui01bag/huisu01bag.exe (100%) rename {c => public/c}/ch5/loading/huiloading.c (100%) rename {c => public/c}/ch5/loading/huiloading.exe (100%) rename {c => public/c}/ch5/loading/loading2.c (100%) rename {c => public/c}/ch5/loading/loading2.exe (100%) rename {c => public/c}/ch5/queue/nqueue.c (100%) rename {c => public/c}/ch5/queue/nqueue.exe (100%) rename {c => public/c}/ch6/graph/bfs.c (100%) rename {c => public/c}/ch6/graph/bfs.exe (100%) rename {c => public/c}/ch6/graph/dfs.c (100%) rename {c => public/c}/ch6/graph/dfs.exe (100%) rename {c => public/c}/ch6/tsp/fenzhi/tsp2.c (100%) rename {c => public/c}/ch6/tsp/fenzhi/tsp2.exe (100%) rename {c => public/c}/ch6/tsp/huisu/travelroute.c (100%) rename {c => public/c}/ch6/tsp/huisu/travelroute.exe (100%) rename {c => public/c}/ch6/xianbag01/bag01fifo.c (100%) rename {c => public/c}/ch6/xianbag01/bag01fifo.exe (100%) rename {c => public/c}/ch6/xianbag01/bag01livevalue.c (100%) rename {c => public/c}/ch6/xianbag01/bag01livevalue.exe (100%) rename {c => public/c}/final/PaperB/guibing.c (100%) rename {c => public/c}/final/PaperB/guibing.exe (100%) rename {c => public/c}/final/nqueenPlus/safequeue.c (100%) rename {c => public/c}/final/nqueenPlus/safequeue.exe (100%) rename {c => public/c}/final/nqueenPlus/testnqplus.c (100%) rename {c => public/c}/final/nqueenPlus/testnqplus.exe (100%) rename {c => public/c}/final/visit4char.c (100%) rename {c => public/c}/final/visit4char.exe (100%) rename {c => public/c}/final/visit4chardigui.c (100%) rename {c => public/c}/final/visit4chardigui.exe (100%) rename {c => public/c}/final/visit4num.c (100%) rename {c => public/c}/final/visit4num.exe (100%) rename {c => public/c}/test/ab.c (100%) rename {c => public/c}/test/ab.exe (100%) rename {c => public/c}/test/ctrip.json (100%) rename {c => public/c}/test/detail.json (100%) rename {c => public/c}/test/guan.json (100%) rename {c => public/c}/test/list.json (100%) rename {c => public/c}/test/order.json (100%) rename {c => public/c}/test/ticket.json (100%) rename {c => public/c}/test/tongdata.json (100%) rename {c => public/c}/test/xiedata.json (100%) create mode 100644 public/favicon.svg create mode 100644 public/icons.svg create mode 100644 src/App.vue create mode 100644 src/__tests__/chapters.test.js create mode 100644 src/__tests__/sortAnimations.test.js create mode 100644 src/assets/hero.png create mode 100644 src/assets/vite.svg create mode 100644 src/assets/vue.svg create mode 100644 src/components/CodeViewer.vue create mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/Sidebar.vue create mode 100644 src/components/SortVisualizer.vue create mode 100644 src/data/chapters.js create mode 100644 src/main.js create mode 100644 src/router/index.js create mode 100644 src/style.css create mode 100644 src/utils/codeUtils.js create mode 100644 src/utils/sortAnimations.js create mode 100644 src/views/ChapterView.vue create mode 100644 src/views/Home.vue create mode 100644 src/views/SortDemo.vue create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..1511959 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7c0b240 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2727 @@ +{ + "name": "suanfa", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "suanfa", + "version": "0.0.0", + "dependencies": { + "vue": "^3.5.34", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.6", + "@vue/test-utils": "^2.4.11", + "jsdom": "^29.1.1", + "vite": "^8.0.12", + "vitest": "^4.1.8" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmmirror.com/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmmirror.com/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/@csstools/css-color-parser/-/css-color-parser-4.1.7.tgz", + "integrity": "sha512-CmjJFQTFQx/U/xNJhSjCQ0ilpesPmNQ8+eOUeM/+kDOVW33qsIjeOXc27vrQDdWVkf83ZSWwtg7kXSUvKDJ8cQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", + "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmmirror.com/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmmirror.com/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.7", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/@vitest/expect/-/expect-4.1.8.tgz", + "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/@vitest/mocker/-/mocker-4.1.8.tgz", + "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", + "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/@vitest/runner/-/runner-4.1.8.tgz", + "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.8", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-4.1.8.tgz", + "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "@vitest/utils": "4.1.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/@vitest/spy/-/spy-4.1.8.tgz", + "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/@vitest/utils/-/utils-4.1.8.tgz", + "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.38.tgz", + "integrity": "sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.38", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz", + "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz", + "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.38", + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz", + "integrity": "sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.38.tgz", + "integrity": "sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.38.tgz", + "integrity": "sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.38.tgz", + "integrity": "sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.38", + "@vue/runtime-core": "3.5.38", + "@vue/shared": "3.5.38", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.38.tgz", + "integrity": "sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38" + }, + "peerDependencies": { + "vue": "3.5.38" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.38.tgz", + "integrity": "sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==", + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "2.4.11", + "resolved": "https://registry.npmmirror.com/@vue/test-utils/-/test-utils-2.4.11.tgz", + "integrity": "sha512-GDqaqZsA6m2E5vNzej0aYiIb6BX8xV9pNSbbbXKOfEYwg7ZNblVX8suyqmUBThq8VIrgAJNxn+z72hVtUeiWHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^3.0.0" + }, + "peerDependencies": { + "@vue/compiler-dom": "3.x", + "@vue/server-renderer": "3.x", + "vue": "3.x" + }, + "peerDependenciesMeta": { + "@vue/server-renderer": { + "optional": true + } + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmmirror.com/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-cookie": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.2", + "resolved": "https://registry.npmmirror.com/tldts/-/tldts-7.4.2.tgz", + "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.2" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.2", + "resolved": "https://registry.npmmirror.com/tldts-core/-/tldts-core-7.4.2.tgz", + "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/undici": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/undici/-/undici-7.27.2.tgz", + "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmmirror.com/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/vitest/-/vitest-4.1.8.tgz", + "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.8", + "@vitest/mocker": "4.1.8", + "@vitest/pretty-format": "4.1.8", + "@vitest/runner": "4.1.8", + "@vitest/snapshot": "4.1.8", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.8", + "@vitest/browser-preview": "4.1.8", + "@vitest/browser-webdriverio": "4.1.8", + "@vitest/coverage-istanbul": "4.1.8", + "@vitest/coverage-v8": "4.1.8", + "@vitest/ui": "4.1.8", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vue": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.38.tgz", + "integrity": "sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-sfc": "3.5.38", + "@vue/runtime-dom": "3.5.38", + "@vue/server-renderer": "3.5.38", + "@vue/shared": "3.5.38" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.3.5", + "resolved": "https://registry.npmmirror.com/vue-component-type-helpers/-/vue-component-type-helpers-3.3.5.tgz", + "integrity": "sha512-Fe1jyPJoUGpJOYKOri44jduR7My4yYINOMJISuMAbmrs+L5LbIDUc8NTWZYY3EJLK0yPLuCmcd5zoCsE4k2/KA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..776bbe1 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "suanfa", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "vue": "^3.5.34", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.6", + "@vue/test-utils": "^2.4.11", + "jsdom": "^29.1.1", + "vite": "^8.0.12", + "vitest": "^4.1.8" + } +} diff --git a/c/.vscode/launch.json b/public/c/.vscode/launch.json similarity index 100% rename from c/.vscode/launch.json rename to public/c/.vscode/launch.json diff --git a/c/.vscode/settings.json b/public/c/.vscode/settings.json similarity index 100% rename from c/.vscode/settings.json rename to public/c/.vscode/settings.json diff --git a/c/.vscode/tasks.json b/public/c/.vscode/tasks.json similarity index 100% rename from c/.vscode/tasks.json rename to public/c/.vscode/tasks.json diff --git a/c/ch1/compare.c b/public/c/ch1/compare.c similarity index 100% rename from c/ch1/compare.c rename to public/c/ch1/compare.c diff --git a/c/ch1/compare.exe b/public/c/ch1/compare.exe similarity index 100% rename from c/ch1/compare.exe rename to public/c/ch1/compare.exe diff --git a/c/ch1/compareall.c b/public/c/ch1/compareall.c similarity index 100% rename from c/ch1/compareall.c rename to public/c/ch1/compareall.c diff --git a/c/ch1/first.c b/public/c/ch1/first.c similarity index 100% rename from c/ch1/first.c rename to public/c/ch1/first.c diff --git a/c/ch1/first.exe b/public/c/ch1/first.exe similarity index 100% rename from c/ch1/first.exe rename to public/c/ch1/first.exe diff --git a/c/ch2/bigcheng/bigchengnew.c b/public/c/ch2/bigcheng/bigchengnew.c similarity index 100% rename from c/ch2/bigcheng/bigchengnew.c rename to public/c/ch2/bigcheng/bigchengnew.c diff --git a/c/ch2/bigcheng/bigchengnew.exe b/public/c/ch2/bigcheng/bigchengnew.exe similarity index 100% rename from c/ch2/bigcheng/bigchengnew.exe rename to public/c/ch2/bigcheng/bigchengnew.exe diff --git a/c/ch2/bigcheng/bigchengold.c b/public/c/ch2/bigcheng/bigchengold.c similarity index 100% rename from c/ch2/bigcheng/bigchengold.c rename to public/c/ch2/bigcheng/bigchengold.c diff --git a/c/ch2/bigcheng/bigchengold.exe b/public/c/ch2/bigcheng/bigchengold.exe similarity index 100% rename from c/ch2/bigcheng/bigchengold.exe rename to public/c/ch2/bigcheng/bigchengold.exe diff --git a/c/ch2/ch2.allpai/allpai.c b/public/c/ch2/ch2.allpai/allpai.c similarity index 100% rename from c/ch2/ch2.allpai/allpai.c rename to public/c/ch2/ch2.allpai/allpai.c diff --git a/c/ch2/ch2.allpai/allpai.exe b/public/c/ch2/ch2.allpai/allpai.exe similarity index 100% rename from c/ch2/ch2.allpai/allpai.exe rename to public/c/ch2/ch2.allpai/allpai.exe diff --git a/c/ch2/ch2.allpai/allpaichong.c b/public/c/ch2/ch2.allpai/allpaichong.c similarity index 100% rename from c/ch2/ch2.allpai/allpaichong.c rename to public/c/ch2/ch2.allpai/allpaichong.c diff --git a/c/ch2/ch2.allpai/allpaichong.exe b/public/c/ch2/ch2.allpai/allpaichong.exe similarity index 100% rename from c/ch2/ch2.allpai/allpaichong.exe rename to public/c/ch2/ch2.allpai/allpaichong.exe diff --git a/c/ch2/ch2.allpai/arrpaichong.c b/public/c/ch2/ch2.allpai/arrpaichong.c similarity index 100% rename from c/ch2/ch2.allpai/arrpaichong.c rename to public/c/ch2/ch2.allpai/arrpaichong.c diff --git a/c/ch2/ch2.allpai/arrpaichong.exe b/public/c/ch2/ch2.allpai/arrpaichong.exe similarity index 100% rename from c/ch2/ch2.allpai/arrpaichong.exe rename to public/c/ch2/ch2.allpai/arrpaichong.exe diff --git a/c/ch2/digui/printnumber.c b/public/c/ch2/digui/printnumber.c similarity index 100% rename from c/ch2/digui/printnumber.c rename to public/c/ch2/digui/printnumber.c diff --git a/c/ch2/digui/printnumber.exe b/public/c/ch2/digui/printnumber.exe similarity index 100% rename from c/ch2/digui/printnumber.exe rename to public/c/ch2/digui/printnumber.exe diff --git a/c/ch2/digui/tuxing.c b/public/c/ch2/digui/tuxing.c similarity index 100% rename from c/ch2/digui/tuxing.c rename to public/c/ch2/digui/tuxing.c diff --git a/c/ch2/digui/tuxing.exe b/public/c/ch2/digui/tuxing.exe similarity index 100% rename from c/ch2/digui/tuxing.exe rename to public/c/ch2/digui/tuxing.exe diff --git a/c/ch2/halfsearch/fenzhi.c b/public/c/ch2/halfsearch/fenzhi.c similarity index 100% rename from c/ch2/halfsearch/fenzhi.c rename to public/c/ch2/halfsearch/fenzhi.c diff --git a/c/ch2/halfsearch/fenzhi.exe b/public/c/ch2/halfsearch/fenzhi.exe similarity index 100% rename from c/ch2/halfsearch/fenzhi.exe rename to public/c/ch2/halfsearch/fenzhi.exe diff --git a/c/ch2/halfsearch/fenzhirec.c b/public/c/ch2/halfsearch/fenzhirec.c similarity index 100% rename from c/ch2/halfsearch/fenzhirec.c rename to public/c/ch2/halfsearch/fenzhirec.c diff --git a/c/ch2/halfsearch/fenzhirec.exe b/public/c/ch2/halfsearch/fenzhirec.exe similarity index 100% rename from c/ch2/halfsearch/fenzhirec.exe rename to public/c/ch2/halfsearch/fenzhirec.exe diff --git a/c/ch2/juzhen/juzhennew.c b/public/c/ch2/juzhen/juzhennew.c similarity index 100% rename from c/ch2/juzhen/juzhennew.c rename to public/c/ch2/juzhen/juzhennew.c diff --git a/c/ch2/juzhen/juzhennew.exe b/public/c/ch2/juzhen/juzhennew.exe similarity index 100% rename from c/ch2/juzhen/juzhennew.exe rename to public/c/ch2/juzhen/juzhennew.exe diff --git a/c/ch2/juzhen/juzhenold.c b/public/c/ch2/juzhen/juzhenold.c similarity index 100% rename from c/ch2/juzhen/juzhenold.c rename to public/c/ch2/juzhen/juzhenold.c diff --git a/c/ch2/juzhen/juzhenold.exe b/public/c/ch2/juzhen/juzhenold.exe similarity index 100% rename from c/ch2/juzhen/juzhenold.exe rename to public/c/ch2/juzhen/juzhenold.exe diff --git a/c/ch2/maopao/mp.c b/public/c/ch2/maopao/mp.c similarity index 100% rename from c/ch2/maopao/mp.c rename to public/c/ch2/maopao/mp.c diff --git a/c/ch2/maopao/mp.exe b/public/c/ch2/maopao/mp.exe similarity index 100% rename from c/ch2/maopao/mp.exe rename to public/c/ch2/maopao/mp.exe diff --git a/c/ch2/matrix/macheng.c b/public/c/ch2/matrix/macheng.c similarity index 100% rename from c/ch2/matrix/macheng.c rename to public/c/ch2/matrix/macheng.c diff --git a/c/ch2/mergesort/guibing.c b/public/c/ch2/mergesort/guibing.c similarity index 100% rename from c/ch2/mergesort/guibing.c rename to public/c/ch2/mergesort/guibing.c diff --git a/c/ch2/mergesort/guibing.exe b/public/c/ch2/mergesort/guibing.exe similarity index 100% rename from c/ch2/mergesort/guibing.exe rename to public/c/ch2/mergesort/guibing.exe diff --git a/c/ch2/mergesort/merge.c b/public/c/ch2/mergesort/merge.c similarity index 100% rename from c/ch2/mergesort/merge.c rename to public/c/ch2/mergesort/merge.c diff --git a/c/ch2/mergesort/merge.exe b/public/c/ch2/mergesort/merge.exe similarity index 100% rename from c/ch2/mergesort/merge.exe rename to public/c/ch2/mergesort/merge.exe diff --git a/c/ch2/quicksort/danleft.c b/public/c/ch2/quicksort/danleft.c similarity index 100% rename from c/ch2/quicksort/danleft.c rename to public/c/ch2/quicksort/danleft.c diff --git a/c/ch2/quicksort/danleft.exe b/public/c/ch2/quicksort/danleft.exe similarity index 100% rename from c/ch2/quicksort/danleft.exe rename to public/c/ch2/quicksort/danleft.exe diff --git a/c/ch2/quicksort/danppt.c b/public/c/ch2/quicksort/danppt.c similarity index 100% rename from c/ch2/quicksort/danppt.c rename to public/c/ch2/quicksort/danppt.c diff --git a/c/ch2/quicksort/danppt.exe b/public/c/ch2/quicksort/danppt.exe similarity index 100% rename from c/ch2/quicksort/danppt.exe rename to public/c/ch2/quicksort/danppt.exe diff --git a/c/ch2/quicksort/dantwo.c b/public/c/ch2/quicksort/dantwo.c similarity index 100% rename from c/ch2/quicksort/dantwo.c rename to public/c/ch2/quicksort/dantwo.c diff --git a/c/ch2/quicksort/shuangbian.c b/public/c/ch2/quicksort/shuangbian.c similarity index 100% rename from c/ch2/quicksort/shuangbian.c rename to public/c/ch2/quicksort/shuangbian.c diff --git a/c/ch2/quicksort/shuangbian.exe b/public/c/ch2/quicksort/shuangbian.exe similarity index 100% rename from c/ch2/quicksort/shuangbian.exe rename to public/c/ch2/quicksort/shuangbian.exe diff --git a/c/ch2/richeng/bisan.c b/public/c/ch2/richeng/bisan.c similarity index 100% rename from c/ch2/richeng/bisan.c rename to public/c/ch2/richeng/bisan.c diff --git a/c/ch2/richeng/bisan.exe b/public/c/ch2/richeng/bisan.exe similarity index 100% rename from c/ch2/richeng/bisan.exe rename to public/c/ch2/richeng/bisan.exe diff --git a/c/ch2/shangji/findarrmax.c b/public/c/ch2/shangji/findarrmax.c similarity index 100% rename from c/ch2/shangji/findarrmax.c rename to public/c/ch2/shangji/findarrmax.c diff --git a/c/ch2/shangji/findarrmax.exe b/public/c/ch2/shangji/findarrmax.exe similarity index 100% rename from c/ch2/shangji/findarrmax.exe rename to public/c/ch2/shangji/findarrmax.exe diff --git a/c/ch2/shangji/sanjiao.c b/public/c/ch2/shangji/sanjiao.c similarity index 100% rename from c/ch2/shangji/sanjiao.c rename to public/c/ch2/shangji/sanjiao.c diff --git a/c/ch2/shangji/sanjiao.exe b/public/c/ch2/shangji/sanjiao.exe similarity index 100% rename from c/ch2/shangji/sanjiao.exe rename to public/c/ch2/shangji/sanjiao.exe diff --git a/c/ch2/student/halfsearch.c b/public/c/ch2/student/halfsearch.c similarity index 100% rename from c/ch2/student/halfsearch.c rename to public/c/ch2/student/halfsearch.c diff --git a/c/ch2/student/halfsearch.exe b/public/c/ch2/student/halfsearch.exe similarity index 100% rename from c/ch2/student/halfsearch.exe rename to public/c/ch2/student/halfsearch.exe diff --git a/c/ch2/student/halfsearchnew.c b/public/c/ch2/student/halfsearchnew.c similarity index 100% rename from c/ch2/student/halfsearchnew.c rename to public/c/ch2/student/halfsearchnew.c diff --git a/c/ch2/student/halfsearchnew.exe b/public/c/ch2/student/halfsearchnew.exe similarity index 100% rename from c/ch2/student/halfsearchnew.exe rename to public/c/ch2/student/halfsearchnew.exe diff --git a/c/ch2/student/paichongright.c b/public/c/ch2/student/paichongright.c similarity index 100% rename from c/ch2/student/paichongright.c rename to public/c/ch2/student/paichongright.c diff --git a/c/ch2/student/paichongright.exe b/public/c/ch2/student/paichongright.exe similarity index 100% rename from c/ch2/student/paichongright.exe rename to public/c/ch2/student/paichongright.exe diff --git a/c/ch2/student/ppp.c b/public/c/ch2/student/ppp.c similarity index 100% rename from c/ch2/student/ppp.c rename to public/c/ch2/student/ppp.c diff --git a/c/ch2/student/ppp.exe b/public/c/ch2/student/ppp.exe similarity index 100% rename from c/ch2/student/ppp.exe rename to public/c/ch2/student/ppp.exe diff --git a/c/ch2/student/quanpai.c b/public/c/ch2/student/quanpai.c similarity index 100% rename from c/ch2/student/quanpai.c rename to public/c/ch2/student/quanpai.c diff --git a/c/ch2/student/quanpai.exe b/public/c/ch2/student/quanpai.exe similarity index 100% rename from c/ch2/student/quanpai.exe rename to public/c/ch2/student/quanpai.exe diff --git a/c/ch2/student/sanjiao.c b/public/c/ch2/student/sanjiao.c similarity index 100% rename from c/ch2/student/sanjiao.c rename to public/c/ch2/student/sanjiao.c diff --git a/c/ch2/student/sanjiao.exe b/public/c/ch2/student/sanjiao.exe similarity index 100% rename from c/ch2/student/sanjiao.exe rename to public/c/ch2/student/sanjiao.exe diff --git a/c/ch3/bag01/bag01.c b/public/c/ch3/bag01/bag01.c similarity index 100% rename from c/ch3/bag01/bag01.c rename to public/c/ch3/bag01/bag01.c diff --git a/c/ch3/bag01/bag01.exe b/public/c/ch3/bag01/bag01.exe similarity index 100% rename from c/ch3/bag01/bag01.exe rename to public/c/ch3/bag01/bag01.exe diff --git a/c/ch3/bag01/bagbag.c b/public/c/ch3/bag01/bagbag.c similarity index 100% rename from c/ch3/bag01/bagbag.c rename to public/c/ch3/bag01/bagbag.c diff --git a/c/ch3/bag01/bagevery.c b/public/c/ch3/bag01/bagevery.c similarity index 100% rename from c/ch3/bag01/bagevery.c rename to public/c/ch3/bag01/bagevery.c diff --git a/c/ch3/bag01/bagevery.exe b/public/c/ch3/bag01/bagevery.exe similarity index 100% rename from c/ch3/bag01/bagevery.exe rename to public/c/ch3/bag01/bagevery.exe diff --git a/c/ch3/bag01/yanghui.c b/public/c/ch3/bag01/yanghui.c similarity index 100% rename from c/ch3/bag01/yanghui.c rename to public/c/ch3/bag01/yanghui.c diff --git a/c/ch3/bag01/yanghui.exe b/public/c/ch3/bag01/yanghui.exe similarity index 100% rename from c/ch3/bag01/yanghui.exe rename to public/c/ch3/bag01/yanghui.exe diff --git a/c/ch3/bag01/yanghuiarr.c b/public/c/ch3/bag01/yanghuiarr.c similarity index 100% rename from c/ch3/bag01/yanghuiarr.c rename to public/c/ch3/bag01/yanghuiarr.c diff --git a/c/ch3/bag01/yanghuiarr.exe b/public/c/ch3/bag01/yanghuiarr.exe similarity index 100% rename from c/ch3/bag01/yanghuiarr.exe rename to public/c/ch3/bag01/yanghuiarr.exe diff --git a/c/ch3/homework/lesscoin.c b/public/c/ch3/homework/lesscoin.c similarity index 100% rename from c/ch3/homework/lesscoin.c rename to public/c/ch3/homework/lesscoin.c diff --git a/c/ch3/homework/lesscoin.exe b/public/c/ch3/homework/lesscoin.exe similarity index 100% rename from c/ch3/homework/lesscoin.exe rename to public/c/ch3/homework/lesscoin.exe diff --git a/c/ch3/image/get2Len.c b/public/c/ch3/image/get2Len.c similarity index 100% rename from c/ch3/image/get2Len.c rename to public/c/ch3/image/get2Len.c diff --git a/c/ch3/image/get2Len.exe b/public/c/ch3/image/get2Len.exe similarity index 100% rename from c/ch3/image/get2Len.exe rename to public/c/ch3/image/get2Len.exe diff --git a/c/ch3/image/imgcompress.c b/public/c/ch3/image/imgcompress.c similarity index 100% rename from c/ch3/image/imgcompress.c rename to public/c/ch3/image/imgcompress.c diff --git a/c/ch3/image/imgcompress.exe b/public/c/ch3/image/imgcompress.exe similarity index 100% rename from c/ch3/image/imgcompress.exe rename to public/c/ch3/image/imgcompress.exe diff --git a/c/ch3/image/imgcompress0.c b/public/c/ch3/image/imgcompress0.c similarity index 100% rename from c/ch3/image/imgcompress0.c rename to public/c/ch3/image/imgcompress0.c diff --git a/c/ch3/image/imgcompress0.exe b/public/c/ch3/image/imgcompress0.exe similarity index 100% rename from c/ch3/image/imgcompress0.exe rename to public/c/ch3/image/imgcompress0.exe diff --git a/c/ch3/lcs/lcs1.c b/public/c/ch3/lcs/lcs1.c similarity index 100% rename from c/ch3/lcs/lcs1.c rename to public/c/ch3/lcs/lcs1.c diff --git a/c/ch3/lcs/lcs1.exe b/public/c/ch3/lcs/lcs1.exe similarity index 100% rename from c/ch3/lcs/lcs1.exe rename to public/c/ch3/lcs/lcs1.exe diff --git a/c/ch3/lcs/lcs2.c b/public/c/ch3/lcs/lcs2.c similarity index 100% rename from c/ch3/lcs/lcs2.c rename to public/c/ch3/lcs/lcs2.c diff --git a/c/ch3/lcs/printtable.c b/public/c/ch3/lcs/printtable.c similarity index 100% rename from c/ch3/lcs/printtable.c rename to public/c/ch3/lcs/printtable.c diff --git a/c/ch3/lcs/printtable.exe b/public/c/ch3/lcs/printtable.exe similarity index 100% rename from c/ch3/lcs/printtable.exe rename to public/c/ch3/lcs/printtable.exe diff --git a/c/ch3/matrix/chengJia.c b/public/c/ch3/matrix/chengJia.c similarity index 100% rename from c/ch3/matrix/chengJia.c rename to public/c/ch3/matrix/chengJia.c diff --git a/c/ch3/matrix/chengJia.exe b/public/c/ch3/matrix/chengJia.exe similarity index 100% rename from c/ch3/matrix/chengJia.exe rename to public/c/ch3/matrix/chengJia.exe diff --git a/c/ch3/matrix/duijiaoxian.c b/public/c/ch3/matrix/duijiaoxian.c similarity index 100% rename from c/ch3/matrix/duijiaoxian.c rename to public/c/ch3/matrix/duijiaoxian.c diff --git a/c/ch3/matrix/duijiaoxian.exe b/public/c/ch3/matrix/duijiaoxian.exe similarity index 100% rename from c/ch3/matrix/duijiaoxian.exe rename to public/c/ch3/matrix/duijiaoxian.exe diff --git a/c/ch3/matrix/kuohao.c b/public/c/ch3/matrix/kuohao.c similarity index 100% rename from c/ch3/matrix/kuohao.c rename to public/c/ch3/matrix/kuohao.c diff --git a/c/ch3/matrix/kuohao.exe b/public/c/ch3/matrix/kuohao.exe similarity index 100% rename from c/ch3/matrix/kuohao.exe rename to public/c/ch3/matrix/kuohao.exe diff --git a/c/ch3/matrix/matrixmul.c b/public/c/ch3/matrix/matrixmul.c similarity index 100% rename from c/ch3/matrix/matrixmul.c rename to public/c/ch3/matrix/matrixmul.c diff --git a/c/ch3/matrix/matrixmul.exe b/public/c/ch3/matrix/matrixmul.exe similarity index 100% rename from c/ch3/matrix/matrixmul.exe rename to public/c/ch3/matrix/matrixmul.exe diff --git a/c/ch3/matrix/weishu.c b/public/c/ch3/matrix/weishu.c similarity index 100% rename from c/ch3/matrix/weishu.c rename to public/c/ch3/matrix/weishu.c diff --git a/c/ch3/matrix/weishu.exe b/public/c/ch3/matrix/weishu.exe similarity index 100% rename from c/ch3/matrix/weishu.exe rename to public/c/ch3/matrix/weishu.exe diff --git a/c/ch4/bag/tanbag.c b/public/c/ch4/bag/tanbag.c similarity index 100% rename from c/ch4/bag/tanbag.c rename to public/c/ch4/bag/tanbag.c diff --git a/c/ch4/bag/tanbag.exe b/public/c/ch4/bag/tanbag.exe similarity index 100% rename from c/ch4/bag/tanbag.exe rename to public/c/ch4/bag/tanbag.exe diff --git a/c/ch4/bag/tanbagtest.c b/public/c/ch4/bag/tanbagtest.c similarity index 100% rename from c/ch4/bag/tanbagtest.c rename to public/c/ch4/bag/tanbagtest.c diff --git a/c/ch4/bag/tanbagtest.exe b/public/c/ch4/bag/tanbagtest.exe similarity index 100% rename from c/ch4/bag/tanbagtest.exe rename to public/c/ch4/bag/tanbagtest.exe diff --git a/c/ch4/bestload/loading.c b/public/c/ch4/bestload/loading.c similarity index 100% rename from c/ch4/bestload/loading.c rename to public/c/ch4/bestload/loading.c diff --git a/c/ch4/bestload/loading.exe b/public/c/ch4/bestload/loading.exe similarity index 100% rename from c/ch4/bestload/loading.exe rename to public/c/ch4/bestload/loading.exe diff --git a/c/ch4/bestload/sortAttr.c b/public/c/ch4/bestload/sortAttr.c similarity index 100% rename from c/ch4/bestload/sortAttr.c rename to public/c/ch4/bestload/sortAttr.c diff --git a/c/ch4/bestload/sortAttr.exe b/public/c/ch4/bestload/sortAttr.exe similarity index 100% rename from c/ch4/bestload/sortAttr.exe rename to public/c/ch4/bestload/sortAttr.exe diff --git a/c/ch4/huffman/halfall.c b/public/c/ch4/huffman/halfall.c similarity index 100% rename from c/ch4/huffman/halfall.c rename to public/c/ch4/huffman/halfall.c diff --git a/c/ch4/huffman/halfall.exe b/public/c/ch4/huffman/halfall.exe similarity index 100% rename from c/ch4/huffman/halfall.exe rename to public/c/ch4/huffman/halfall.exe diff --git a/c/ch4/huffman/halfcode.c b/public/c/ch4/huffman/halfcode.c similarity index 100% rename from c/ch4/huffman/halfcode.c rename to public/c/ch4/huffman/halfcode.c diff --git a/c/ch4/huffman/halfcode.exe b/public/c/ch4/huffman/halfcode.exe similarity index 100% rename from c/ch4/huffman/halfcode.exe rename to public/c/ch4/huffman/halfcode.exe diff --git a/c/ch4/huffman/halftree.c b/public/c/ch4/huffman/halftree.c similarity index 100% rename from c/ch4/huffman/halftree.c rename to public/c/ch4/huffman/halftree.c diff --git a/c/ch4/huffman/halftree.exe b/public/c/ch4/huffman/halftree.exe similarity index 100% rename from c/ch4/huffman/halftree.exe rename to public/c/ch4/huffman/halftree.exe diff --git a/c/ch4/huffman/huffman_codes.txt b/public/c/ch4/huffman/huffman_codes.txt similarity index 100% rename from c/ch4/huffman/huffman_codes.txt rename to public/c/ch4/huffman/huffman_codes.txt diff --git a/c/ch4/huffman/treelist.c b/public/c/ch4/huffman/treelist.c similarity index 100% rename from c/ch4/huffman/treelist.c rename to public/c/ch4/huffman/treelist.c diff --git a/c/ch4/huffman/treelist.exe b/public/c/ch4/huffman/treelist.exe similarity index 100% rename from c/ch4/huffman/treelist.exe rename to public/c/ch4/huffman/treelist.exe diff --git a/c/ch4/huodong/fenpei.c b/public/c/ch4/huodong/fenpei.c similarity index 100% rename from c/ch4/huodong/fenpei.c rename to public/c/ch4/huodong/fenpei.c diff --git a/c/ch4/huodong/fenpei.exe b/public/c/ch4/huodong/fenpei.exe similarity index 100% rename from c/ch4/huodong/fenpei.exe rename to public/c/ch4/huodong/fenpei.exe diff --git a/c/ch4/money/getmoney.c b/public/c/ch4/money/getmoney.c similarity index 100% rename from c/ch4/money/getmoney.c rename to public/c/ch4/money/getmoney.c diff --git a/c/ch4/money/getmoney.exe b/public/c/ch4/money/getmoney.exe similarity index 100% rename from c/ch4/money/getmoney.exe rename to public/c/ch4/money/getmoney.exe diff --git a/c/ch4/money/moneytwowei.c b/public/c/ch4/money/moneytwowei.c similarity index 100% rename from c/ch4/money/moneytwowei.c rename to public/c/ch4/money/moneytwowei.c diff --git a/c/ch4/money/moneytwowei.exe b/public/c/ch4/money/moneytwowei.exe similarity index 100% rename from c/ch4/money/moneytwowei.exe rename to public/c/ch4/money/moneytwowei.exe diff --git a/c/ch4/shortest/path.c b/public/c/ch4/shortest/path.c similarity index 100% rename from c/ch4/shortest/path.c rename to public/c/ch4/shortest/path.c diff --git a/c/ch4/shortest/path.exe b/public/c/ch4/shortest/path.exe similarity index 100% rename from c/ch4/shortest/path.exe rename to public/c/ch4/shortest/path.exe diff --git a/c/ch4/shortest/shortpath.c b/public/c/ch4/shortest/shortpath.c similarity index 100% rename from c/ch4/shortest/shortpath.c rename to public/c/ch4/shortest/shortpath.c diff --git a/c/ch4/shortest/shortpath.exe b/public/c/ch4/shortest/shortpath.exe similarity index 100% rename from c/ch4/shortest/shortpath.exe rename to public/c/ch4/shortest/shortpath.exe diff --git a/c/ch5/hui01bag/huisu01bag.c b/public/c/ch5/hui01bag/huisu01bag.c similarity index 100% rename from c/ch5/hui01bag/huisu01bag.c rename to public/c/ch5/hui01bag/huisu01bag.c diff --git a/c/ch5/hui01bag/huisu01bag.exe b/public/c/ch5/hui01bag/huisu01bag.exe similarity index 100% rename from c/ch5/hui01bag/huisu01bag.exe rename to public/c/ch5/hui01bag/huisu01bag.exe diff --git a/c/ch5/loading/huiloading.c b/public/c/ch5/loading/huiloading.c similarity index 100% rename from c/ch5/loading/huiloading.c rename to public/c/ch5/loading/huiloading.c diff --git a/c/ch5/loading/huiloading.exe b/public/c/ch5/loading/huiloading.exe similarity index 100% rename from c/ch5/loading/huiloading.exe rename to public/c/ch5/loading/huiloading.exe diff --git a/c/ch5/loading/loading2.c b/public/c/ch5/loading/loading2.c similarity index 100% rename from c/ch5/loading/loading2.c rename to public/c/ch5/loading/loading2.c diff --git a/c/ch5/loading/loading2.exe b/public/c/ch5/loading/loading2.exe similarity index 100% rename from c/ch5/loading/loading2.exe rename to public/c/ch5/loading/loading2.exe diff --git a/c/ch5/queue/nqueue.c b/public/c/ch5/queue/nqueue.c similarity index 100% rename from c/ch5/queue/nqueue.c rename to public/c/ch5/queue/nqueue.c diff --git a/c/ch5/queue/nqueue.exe b/public/c/ch5/queue/nqueue.exe similarity index 100% rename from c/ch5/queue/nqueue.exe rename to public/c/ch5/queue/nqueue.exe diff --git a/c/ch6/graph/bfs.c b/public/c/ch6/graph/bfs.c similarity index 100% rename from c/ch6/graph/bfs.c rename to public/c/ch6/graph/bfs.c diff --git a/c/ch6/graph/bfs.exe b/public/c/ch6/graph/bfs.exe similarity index 100% rename from c/ch6/graph/bfs.exe rename to public/c/ch6/graph/bfs.exe diff --git a/c/ch6/graph/dfs.c b/public/c/ch6/graph/dfs.c similarity index 100% rename from c/ch6/graph/dfs.c rename to public/c/ch6/graph/dfs.c diff --git a/c/ch6/graph/dfs.exe b/public/c/ch6/graph/dfs.exe similarity index 100% rename from c/ch6/graph/dfs.exe rename to public/c/ch6/graph/dfs.exe diff --git a/c/ch6/tsp/fenzhi/tsp2.c b/public/c/ch6/tsp/fenzhi/tsp2.c similarity index 100% rename from c/ch6/tsp/fenzhi/tsp2.c rename to public/c/ch6/tsp/fenzhi/tsp2.c diff --git a/c/ch6/tsp/fenzhi/tsp2.exe b/public/c/ch6/tsp/fenzhi/tsp2.exe similarity index 100% rename from c/ch6/tsp/fenzhi/tsp2.exe rename to public/c/ch6/tsp/fenzhi/tsp2.exe diff --git a/c/ch6/tsp/huisu/travelroute.c b/public/c/ch6/tsp/huisu/travelroute.c similarity index 100% rename from c/ch6/tsp/huisu/travelroute.c rename to public/c/ch6/tsp/huisu/travelroute.c diff --git a/c/ch6/tsp/huisu/travelroute.exe b/public/c/ch6/tsp/huisu/travelroute.exe similarity index 100% rename from c/ch6/tsp/huisu/travelroute.exe rename to public/c/ch6/tsp/huisu/travelroute.exe diff --git a/c/ch6/xianbag01/bag01fifo.c b/public/c/ch6/xianbag01/bag01fifo.c similarity index 100% rename from c/ch6/xianbag01/bag01fifo.c rename to public/c/ch6/xianbag01/bag01fifo.c diff --git a/c/ch6/xianbag01/bag01fifo.exe b/public/c/ch6/xianbag01/bag01fifo.exe similarity index 100% rename from c/ch6/xianbag01/bag01fifo.exe rename to public/c/ch6/xianbag01/bag01fifo.exe diff --git a/c/ch6/xianbag01/bag01livevalue.c b/public/c/ch6/xianbag01/bag01livevalue.c similarity index 100% rename from c/ch6/xianbag01/bag01livevalue.c rename to public/c/ch6/xianbag01/bag01livevalue.c diff --git a/c/ch6/xianbag01/bag01livevalue.exe b/public/c/ch6/xianbag01/bag01livevalue.exe similarity index 100% rename from c/ch6/xianbag01/bag01livevalue.exe rename to public/c/ch6/xianbag01/bag01livevalue.exe diff --git a/c/final/PaperB/guibing.c b/public/c/final/PaperB/guibing.c similarity index 100% rename from c/final/PaperB/guibing.c rename to public/c/final/PaperB/guibing.c diff --git a/c/final/PaperB/guibing.exe b/public/c/final/PaperB/guibing.exe similarity index 100% rename from c/final/PaperB/guibing.exe rename to public/c/final/PaperB/guibing.exe diff --git a/c/final/nqueenPlus/safequeue.c b/public/c/final/nqueenPlus/safequeue.c similarity index 100% rename from c/final/nqueenPlus/safequeue.c rename to public/c/final/nqueenPlus/safequeue.c diff --git a/c/final/nqueenPlus/safequeue.exe b/public/c/final/nqueenPlus/safequeue.exe similarity index 100% rename from c/final/nqueenPlus/safequeue.exe rename to public/c/final/nqueenPlus/safequeue.exe diff --git a/c/final/nqueenPlus/testnqplus.c b/public/c/final/nqueenPlus/testnqplus.c similarity index 100% rename from c/final/nqueenPlus/testnqplus.c rename to public/c/final/nqueenPlus/testnqplus.c diff --git a/c/final/nqueenPlus/testnqplus.exe b/public/c/final/nqueenPlus/testnqplus.exe similarity index 100% rename from c/final/nqueenPlus/testnqplus.exe rename to public/c/final/nqueenPlus/testnqplus.exe diff --git a/c/final/visit4char.c b/public/c/final/visit4char.c similarity index 100% rename from c/final/visit4char.c rename to public/c/final/visit4char.c diff --git a/c/final/visit4char.exe b/public/c/final/visit4char.exe similarity index 100% rename from c/final/visit4char.exe rename to public/c/final/visit4char.exe diff --git a/c/final/visit4chardigui.c b/public/c/final/visit4chardigui.c similarity index 100% rename from c/final/visit4chardigui.c rename to public/c/final/visit4chardigui.c diff --git a/c/final/visit4chardigui.exe b/public/c/final/visit4chardigui.exe similarity index 100% rename from c/final/visit4chardigui.exe rename to public/c/final/visit4chardigui.exe diff --git a/c/final/visit4num.c b/public/c/final/visit4num.c similarity index 100% rename from c/final/visit4num.c rename to public/c/final/visit4num.c diff --git a/c/final/visit4num.exe b/public/c/final/visit4num.exe similarity index 100% rename from c/final/visit4num.exe rename to public/c/final/visit4num.exe diff --git a/c/test/ab.c b/public/c/test/ab.c similarity index 100% rename from c/test/ab.c rename to public/c/test/ab.c diff --git a/c/test/ab.exe b/public/c/test/ab.exe similarity index 100% rename from c/test/ab.exe rename to public/c/test/ab.exe diff --git a/c/test/ctrip.json b/public/c/test/ctrip.json similarity index 100% rename from c/test/ctrip.json rename to public/c/test/ctrip.json diff --git a/c/test/detail.json b/public/c/test/detail.json similarity index 100% rename from c/test/detail.json rename to public/c/test/detail.json diff --git a/c/test/guan.json b/public/c/test/guan.json similarity index 100% rename from c/test/guan.json rename to public/c/test/guan.json diff --git a/c/test/list.json b/public/c/test/list.json similarity index 100% rename from c/test/list.json rename to public/c/test/list.json diff --git a/c/test/order.json b/public/c/test/order.json similarity index 100% rename from c/test/order.json rename to public/c/test/order.json diff --git a/c/test/ticket.json b/public/c/test/ticket.json similarity index 100% rename from c/test/ticket.json rename to public/c/test/ticket.json diff --git a/c/test/tongdata.json b/public/c/test/tongdata.json similarity index 100% rename from c/test/tongdata.json rename to public/c/test/tongdata.json diff --git a/c/test/xiedata.json b/public/c/test/xiedata.json similarity index 100% rename from c/test/xiedata.json rename to public/c/test/xiedata.json diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..ea9b841 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/__tests__/chapters.test.js b/src/__tests__/chapters.test.js new file mode 100644 index 0000000..2e88f88 --- /dev/null +++ b/src/__tests__/chapters.test.js @@ -0,0 +1,53 @@ +import { describe, it, expect } from 'vitest' +import { chapters, getAllFiles, getChapterById } from '../data/chapters.js' + +describe('chapters data', () => { + it('should have 6 chapters', () => { + expect(chapters.length).toBe(6) + }) + + it('each chapter should have required fields', () => { + for (const ch of chapters) { + expect(ch.id).toBeTruthy() + expect(ch.title).toBeTruthy() + expect(ch.subtitle).toBeTruthy() + expect(ch.description).toBeTruthy() + expect(ch.icon).toBeTruthy() + expect(Array.isArray(ch.topics)).toBe(true) + } + }) + + it('chapter ids should be ch1 through ch6', () => { + const ids = chapters.map(ch => ch.id) + expect(ids).toEqual(['ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6']) + }) + + it('getChapterById should find correct chapter', () => { + const ch3 = getChapterById('ch3') + expect(ch3.title).toContain('动态规划') + expect(getChapterById('nonexistent')).toBeUndefined() + }) + + it('each chapter should have at least one topic', () => { + for (const ch of chapters) { + expect(ch.topics.length).toBeGreaterThan(0) + } + }) +}) + +describe('getAllFiles', () => { + it('should return all files flattened', () => { + const files = getAllFiles() + expect(files.length).toBeGreaterThan(0) + }) + + it('each file should have path, name, label', () => { + const files = getAllFiles() + for (const f of files) { + expect(f.path).toBeTruthy() + expect(f.name).toBeTruthy() + expect(f.label).toBeTruthy() + expect(f.chapterId).toBeTruthy() + } + }) +}) diff --git a/src/__tests__/sortAnimations.test.js b/src/__tests__/sortAnimations.test.js new file mode 100644 index 0000000..e48ecc2 --- /dev/null +++ b/src/__tests__/sortAnimations.test.js @@ -0,0 +1,118 @@ +import { describe, it, expect } from 'vitest' +import { generateMergeSortSteps, generateQuickSortSteps, generateRandomArray } from '../utils/sortAnimations.js' + +describe('generateMergeSortSteps', () => { + it('should produce steps for a small array', () => { + const arr = [3, 1, 2] + const steps = generateMergeSortSteps(arr) + expect(steps.length).toBeGreaterThan(0) + // 最后一步应标记全部已排序 + const last = steps[steps.length - 1] + expect(last.highlights.sorted).toEqual([0, 1, 2]) + expect(last.description).toContain('完成') + }) + + it('should sort the array correctly', () => { + const arr = [5, 3, 8, 1, 9, 2] + const steps = generateMergeSortSteps(arr) + const last = steps[steps.length - 1] + // 检查最终数组有序 + const sorted = [...last.array].sort((a, b) => a - b) + expect(last.array).toEqual(sorted) + }) + + it('should handle single element array', () => { + const steps = generateMergeSortSteps([42]) + expect(steps.length).toBeGreaterThan(0) + expect(steps[steps.length - 1].highlights.sorted).toEqual([0]) + }) + + it('should handle empty array', () => { + const steps = generateMergeSortSteps([]) + expect(steps.length).toBeGreaterThan(0) + }) + + it('should have description for every step', () => { + const steps = generateMergeSortSteps([4, 2, 7, 1]) + for (const step of steps) { + expect(step.description).toBeTruthy() + expect(typeof step.description).toBe('string') + } + }) + + it('should record array state at each step', () => { + const arr = [4, 2, 7, 1] + const steps = generateMergeSortSteps(arr) + for (const step of steps) { + expect(Array.isArray(step.array)).toBe(true) + expect(step.array.length).toBe(arr.length) + } + }) +}) + +describe('generateQuickSortSteps', () => { + it('should produce steps for a small array', () => { + const arr = [3, 1, 2] + const steps = generateQuickSortSteps(arr) + expect(steps.length).toBeGreaterThan(0) + const last = steps[steps.length - 1] + expect(last.highlights.sorted).toEqual([0, 1, 2]) + expect(last.description).toContain('完成') + }) + + it('should sort the array correctly', () => { + const arr = [5, 3, 8, 1, 9, 2] + const steps = generateQuickSortSteps(arr) + const last = steps[steps.length - 1] + const sorted = [...last.array].sort((a, b) => a - b) + expect(last.array).toEqual(sorted) + }) + + it('should handle single element array', () => { + const steps = generateQuickSortSteps([42]) + expect(steps.length).toBeGreaterThan(0) + expect(steps[steps.length - 1].highlights.sorted).toEqual([0]) + }) + + it('should handle already sorted array', () => { + const arr = [1, 2, 3, 4, 5] + const steps = generateQuickSortSteps(arr) + const last = steps[steps.length - 1] + expect(last.array).toEqual([1, 2, 3, 4, 5]) + }) + + it('should handle reverse sorted array', () => { + const arr = [5, 4, 3, 2, 1] + const steps = generateQuickSortSteps(arr) + const last = steps[steps.length - 1] + expect(last.array).toEqual([1, 2, 3, 4, 5]) + }) + + it('should have description for every step', () => { + const steps = generateQuickSortSteps([4, 2, 7, 1]) + for (const step of steps) { + expect(step.description).toBeTruthy() + } + }) +}) + +describe('generateRandomArray', () => { + it('should generate array of correct size', () => { + const arr = generateRandomArray(10) + expect(arr.length).toBe(10) + }) + + it('should generate positive numbers', () => { + const arr = generateRandomArray(20) + for (const v of arr) { + expect(v).toBeGreaterThanOrEqual(1) + } + }) + + it('should respect maxValue', () => { + const arr = generateRandomArray(50, 10) + for (const v of arr) { + expect(v).toBeLessThanOrEqual(10) + } + }) +}) diff --git a/src/assets/hero.png b/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/src/assets/vite.svg b/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/CodeViewer.vue b/src/components/CodeViewer.vue new file mode 100644 index 0000000..614ed04 --- /dev/null +++ b/src/components/CodeViewer.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..f91553d --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue new file mode 100644 index 0000000..57833f7 --- /dev/null +++ b/src/components/Sidebar.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/components/SortVisualizer.vue b/src/components/SortVisualizer.vue new file mode 100644 index 0000000..04d9cd1 --- /dev/null +++ b/src/components/SortVisualizer.vue @@ -0,0 +1,463 @@ + + + + + diff --git a/src/data/chapters.js b/src/data/chapters.js new file mode 100644 index 0000000..74a5277 --- /dev/null +++ b/src/data/chapters.js @@ -0,0 +1,366 @@ +/** + * 算法分析教学平台 - 章节与代码文件数据 + * 对应教材章节:基础(复杂度分析)、分治法、动态规划、贪心、回溯、分支限界 + */ + +export const chapters = [ + { + id: 'ch1', + title: '第一章 基础 — 复杂度分析', + subtitle: '算法时间复杂度与空间复杂度基础', + description: '本章介绍算法分析的基础知识,包括时间复杂度、空间复杂度的概念,以及通过实验比较不同算法的性能差异。', + icon: '📊', + topics: [ + '时间复杂度概念(O、Ω、Θ)', + '空间复杂度分析', + '递归算法复杂度', + '实验对比分析方法' + ], + files: [ + { path: 'c/ch1/first.c', name: 'first.c', label: '递归打印图案', description: '递归打印矩形/三角形图案,演示递归基本结构' }, + { path: 'c/ch1/compare.c', name: 'compare.c', label: '性能对比(累加 vs 高斯公式)', description: '比较循环累加与高斯求和公式的耗时差异,直观感受算法效率' }, + { path: 'c/ch1/compareall.c', name: 'compareall.c', label: '多项性能对比', description: '更多累加与高斯公式的计时对比实验' } + ] + }, + { + id: 'ch2', + title: '第二章 分治法', + subtitle: 'Divide and Conquer — 分而治之', + description: '分治法将大问题分解为若干规模较小的子问题,递归求解后再合并结果。本章涵盖归并排序、快速排序、二分查找、大整数乘法、矩阵乘法等经典分治算法。', + icon: '🔪', + topics: [ + '分治策略基本思想', + '归并排序', + '快速排序(多种划分方式)', + '二分查找(递归与迭代)', + '大整数乘法', + 'Strassen矩阵乘法', + '递归求最大值', + '全排列生成' + ], + subfolders: [ + { + name: 'mergesort', + label: '归并排序', + files: [ + { path: 'c/ch2/mergesort/guibing.c', name: 'guibing.c', label: '归并排序完整实现', description: '分治归并排序,包含 merge 与 mergeSort 函数' }, + { path: 'c/ch2/mergesort/merge.c', name: 'merge.c', label: '归并操作', description: '合并两个有序子数组的核心 merge 操作' } + ], + demo: { path: '/sort-demo#merge', label: '🎬 动态演示', description: '观看归并排序的完整动画过程' } + }, + { + name: 'quicksort', + label: '快速排序', + files: [ + { path: 'c/ch2/quicksort/danppt.c', name: 'danppt.c', label: '快速排序(单侧指针)', description: '单侧指针遍历划分的快速排序实现' }, + { path: 'c/ch2/quicksort/danleft.c', name: 'danleft.c', label: '快速排序(左指针法)', description: '基于左右指针移动的快速排序变体' }, + { path: 'c/ch2/quicksort/dantwo.c', name: 'dantwo.c', label: '快速排序(双指针法)', description: '另一种双指针快速排序实现' }, + { path: 'c/ch2/quicksort/shuangbian.c', name: 'shuangbian.c', label: '快速排序(双边扫描)', description: '经典的双边扫描分区快速排序' } + ], + demo: { path: '/sort-demo#quick', label: '🎬 动态演示', description: '观看快速排序的完整动画过程' } + }, + { + name: 'halfsearch', + label: '二分查找', + files: [ + { path: 'c/ch2/student/halfsearch.c', name: 'halfsearch.c', label: '二分查找(递归版)', description: '递归实现的二分查找算法' }, + { path: 'c/ch2/student/halfsearchnew.c', name: 'halfsearchnew.c', label: '二分查找(迭代版)', description: '迭代实现的二分查找算法' }, + { path: 'c/ch2/halfsearch/fenzhi.c', name: 'fenzhi.c', label: '分治分割示例', description: '二分分治分割示例' }, + { path: 'c/ch2/halfsearch/fenzhirec.c', name: 'fenzhirec.c', label: '递归查找', description: '递归结构的查找实现' } + ] + }, + { + name: 'bigcheng', + label: '大整数乘法', + files: [ + { path: 'c/ch2/bigcheng/bigchengold.c', name: 'bigchengold.c', label: '大整数乘法(基础版)', description: '低位进位数组模拟乘法' }, + { path: 'c/ch2/bigcheng/bigchengnew.c', name: 'bigchengnew.c', label: '大整数乘法(分治版)', description: '分治递归的大整数乘法实现' } + ] + }, + { + name: 'matrix', + label: '矩阵乘法', + files: [ + { path: 'c/ch2/juzhen/juzhenold.c', name: 'juzhenold.c', label: '矩阵乘法(朴素版)', description: '朴素三层循环矩阵乘法' }, + { path: 'c/ch2/juzhen/juzhennew.c', name: 'juzhennew.c', label: '矩阵乘法(分治版)', description: '分治/Strassen风格的矩阵乘法' }, + { path: 'c/ch2/matrix/macheng.c', name: 'macheng.c', label: '分治矩阵乘法', description: '分块递归矩阵乘法' } + ] + }, + { + name: 'digui', + label: '递归示例', + files: [ + { path: 'c/ch2/digui/printnumber.c', name: 'printnumber.c', label: '递归打印整数', description: '递归按位打印整数(高位到低位)' }, + { path: 'c/ch2/digui/tuxing.c', name: 'tuxing.c', label: '递归图形', description: '递归绘制图形示例' }, + { path: 'c/ch2/shangji/findarrmax.c', name: 'findarrmax.c', label: '递归求最大值', description: '递归查找数组最大值' }, + { path: 'c/ch2/shangji/sanjiao.c', name: 'sanjiao.c', label: '递归三角形', description: '递归打印星号三角形' } + ] + }, + { + name: 'maopao', + label: '冒泡排序', + files: [ + { path: 'c/ch2/maopao/mp.c', name: 'mp.c', label: '冒泡排序', description: '冒泡排序实现并打印中间状态' } + ] + }, + { + name: 'allpai', + label: '全排列', + files: [ + { path: 'c/ch2/ch2.allpai/allpai.c', name: 'allpai.c', label: '全排列生成', description: '递归交换法全排列生成' }, + { path: 'c/ch2/ch2.allpai/allpaichong.c', name: 'allpaichong.c', label: '全排列(去重)', description: '带去重逻辑的全排列生成' }, + { path: 'c/ch2/ch2.allpai/arrpaichong.c', name: 'arrpaichong.c', label: '数组排列去重', description: '数组排列生成与去重' }, + { path: 'c/ch2/student/quanpai.c', name: 'quanpai.c', label: '全排列(学生版)', description: '全排列/排列打印程序' }, + { path: 'c/ch2/student/ppp.c', name: 'ppp.c', label: '全排列(ppp)', description: '递归交换并打印排列' }, + { path: 'c/ch2/student/paichongright.c', name: 'paichongright.c', label: '去重排列', description: '排除重复输出的排列逻辑' } + ] + }, + { + name: 'richeng', + label: '日程表', + files: [ + { path: 'c/ch2/richeng/bisan.c', name: 'bisan.c', label: '循环赛日程表', description: '使用2^k分组复制的赛程表逻辑' } + ] + } + ] + }, + { + id: 'ch3', + title: '第三章 动态规划', + subtitle: 'Dynamic Programming — 最优子结构与重叠子问题', + description: '动态规划通过将问题分解为重叠子问题,并利用最优子结构性质,自底向上求解。本章涵盖0/1背包、最长公共子序列(LCS)、矩阵链乘、图像压缩、最少硬币等经典DP问题。', + icon: '🧩', + topics: [ + '动态规划基本思想', + '最优子结构与重叠子问题', + '0/1背包问题', + '最长公共子序列(LCS)', + '矩阵链乘', + '图像压缩', + '最少硬币问题', + '杨辉三角' + ], + subfolders: [ + { + name: 'bag01', + label: '0/1背包问题', + files: [ + { path: 'c/ch3/bag01/bag01.c', name: 'bag01.c', label: '0/1背包 DP 实现', description: '经典二维DP矩阵解法' }, + { path: 'c/ch3/bag01/bagbag.c', name: 'bagbag.c', label: '背包状态追踪', description: '多种背包实现/状态追踪' }, + { path: 'c/ch3/bag01/bagevery.c', name: 'bagevery.c', label: '背包枚举', description: '背包问题枚举/遍历示例' }, + { path: 'c/ch3/bag01/yanghui.c', name: 'yanghui.c', label: '杨辉三角(二维数组)', description: '使用二维数组打印杨辉三角' }, + { path: 'c/ch3/bag01/yanghuiarr.c', name: 'yanghuiarr.c', label: '杨辉三角(动态分配)', description: '用malloc动态分配版杨辉三角' } + ] + }, + { + name: 'lcs', + label: '最长公共子序列(LCS)', + files: [ + { path: 'c/ch3/lcs/lcs1.c', name: 'lcs1.c', label: 'LCS 实现(一)', description: '构建LCS DP表' }, + { path: 'c/ch3/lcs/lcs2.c', name: 'lcs2.c', label: 'LCS 实现(二)', description: 'LCS动态规划实现,返回长度' }, + { path: 'c/ch3/lcs/printtable.c', name: 'printtable.c', label: 'LCS 路径回溯', description: '打印LCS路径表并回溯输出LCS' } + ] + }, + { + name: 'matrix', + label: '矩阵算法', + files: [ + { path: 'c/ch3/matrix/chengJia.c', name: 'chengJia.c', label: '矩阵乘法', description: '朴素矩阵乘法示例' }, + { path: 'c/ch3/matrix/matrixmul.c', name: 'matrixmul.c', label: '矩阵乘法(标准)', description: '标准矩阵乘法实现' }, + { path: 'c/ch3/matrix/duijiaoxian.c', name: 'duijiaoxian.c', label: '对角线处理', description: '矩阵对角线特性打印' }, + { path: 'c/ch3/matrix/kuohao.c', name: 'kuohao.c', label: '矩阵括号链乘', description: '矩阵链乘括号化DP实现' }, + { path: 'c/ch3/matrix/weishu.c', name: 'weishu.c', label: '位数计算', description: '数字位数/二进制位宽计算' } + ] + }, + { + name: 'image', + label: '图像压缩', + files: [ + { path: 'c/ch3/image/imgcompress.c', name: 'imgcompress.c', label: '图像压缩算法', description: '图像压缩段划分与最优分段' }, + { path: 'c/ch3/image/imgcompress0.c', name: 'imgcompress0.c', label: '图像压缩(基础版)', description: '图像压缩段编码示例' }, + { path: 'c/ch3/image/get2Len.c', name: 'get2Len.c', label: '位长计算', description: '计算二进制位长等辅助函数' } + ] + }, + { + name: 'homework', + label: '课后练习', + files: [ + { path: 'c/ch3/homework/lesscoin.c', name: 'lesscoin.c', label: '最少硬币问题', description: '典型背包/零钱兑换DP实现' } + ] + } + ] + }, + { + id: 'ch4', + title: '第四章 贪心算法', + subtitle: 'Greedy Algorithm — 局部最优与全局最优', + description: '贪心算法在每一步选择中都采取当前最优的选择,希望最终得到全局最优解。本章涵盖活动选择、Huffman编码、背包问题(贪心版)、最优装载、最短路径、找零问题等。', + icon: '🎯', + topics: [ + '贪心策略基本思想', + '活动选择问题', + 'Huffman编码', + '贪心背包(部分背包)', + '最优装载问题', + '最短路径', + '找零问题' + ], + subfolders: [ + { + name: 'huodong', + label: '活动选择', + files: [ + { path: 'c/ch4/huodong/fenpei.c', name: 'fenpei.c', label: '活动分配', description: '活动选择问题的贪心实现' } + ] + }, + { + name: 'huffman', + label: 'Huffman编码', + files: [ + { path: 'c/ch4/huffman/halfall.c', name: 'halfall.c', label: 'Huffman编码主流程', description: '构建Huffman树并生成编码' }, + { path: 'c/ch4/huffman/halfcode.c', name: 'halfcode.c', label: 'Huffman编码生成', description: '从Huffman树回溯得到编码' }, + { path: 'c/ch4/huffman/halftree.c', name: 'halftree.c', label: 'Huffman树构建', description: '节点创建、合并、排序构建Huffman树' }, + { path: 'c/ch4/huffman/treelist.c', name: 'treelist.c', label: 'Huffman节点管理', description: '树节点创建和列表操作' } + ] + }, + { + name: 'bag', + label: '贪心背包', + files: [ + { path: 'c/ch4/bag/tanbag.c', name: 'tanbag.c', label: '贪心背包', description: '部分背包问题的贪心解法' }, + { path: 'c/ch4/bag/tanbagtest.c', name: 'tanbagtest.c', label: '贪心背包测试', description: '贪心背包的测试/驱动' } + ] + }, + { + name: 'bestload', + label: '最优装载', + files: [ + { path: 'c/ch4/bestload/loading.c', name: 'loading.c', label: '最优装载问题', description: '装载问题的贪心实现' }, + { path: 'c/ch4/bestload/sortAttr.c', name: 'sortAttr.c', label: '排序辅助', description: '装载问题排序比较器' } + ] + }, + { + name: 'money', + label: '找零问题', + files: [ + { path: 'c/ch4/money/getmoney.c', name: 'getmoney.c', label: '贪心找零', description: '按面额计算所需最少张数' }, + { path: 'c/ch4/money/moneytwowei.c', name: 'moneytwowei.c', label: '找零(二维)', description: '面额分解的另一版本' } + ] + }, + { + name: 'shortest', + label: '最短路径', + files: [ + { path: 'c/ch4/shortest/path.c', name: 'path.c', label: '最短路径', description: '最短路径算法实现' }, + { path: 'c/ch4/shortest/shortpath.c', name: 'shortpath.c', label: '最短路径(分支界)', description: '分支界/分治的最短路径' } + ] + } + ] + }, + { + id: 'ch5', + title: '第五章 回溯法', + subtitle: 'Backtracking — 搜索与剪枝', + description: '回溯法通过深度优先搜索所有可能的解,并在搜索过程中用剪枝函数避免无效搜索。本章涵盖0/1背包的回溯解法、装载问题、N皇后问题等。', + icon: '🔙', + topics: [ + '回溯法基本思想', + '深度优先搜索', + '剪枝函数(约束函数与限界函数)', + '0/1背包的回溯解法', + '装载问题的回溯解法', + 'N皇后问题' + ], + subfolders: [ + { + name: 'hui01bag', + label: '回溯0/1背包', + files: [ + { path: 'c/ch5/hui01bag/huisu01bag.c', name: 'huisu01bag.c', label: '0/1背包回溯解法', description: '递归回溯搜索最优解' } + ] + }, + { + name: 'loading', + label: '装载问题', + files: [ + { path: 'c/ch5/loading/huiloading.c', name: 'huiloading.c', label: '回溯装载', description: '回溯搜索最佳放置方案' }, + { path: 'c/ch5/loading/loading2.c', name: 'loading2.c', label: '装载实现(二)', description: '装载问题的另一种回溯实现' } + ] + }, + { + name: 'queue', + label: 'N皇后', + files: [ + { path: 'c/ch5/queue/nqueue.c', name: 'nqueue.c', label: 'N皇后问题', description: '回溯法解N皇后问题' } + ] + } + ] + }, + { + id: 'ch6', + title: '第六章 分支限界法', + subtitle: 'Branch and Bound — 剪枝搜索最优解', + description: '分支限界法以广度优先或最小耗费优先的方式搜索解空间树,并用限界函数剪去不可能产生最优解的分支。本章涵盖图的BFS/DFS、0/1背包的分支限界解法、TSP问题等。', + icon: '🌿', + topics: [ + '分支限界法基本思想', + '广度优先搜索与优先队列', + '上界函数与剪枝', + '0/1背包的分支限界解法', + '旅行商问题(TSP)', + '图的BFS与DFS遍历' + ], + subfolders: [ + { + name: 'xianbag01', + label: '分支限界0/1背包', + files: [ + { path: 'c/ch6/xianbag01/bag01fifo.c', name: 'bag01fifo.c', label: '0/1背包(FIFO队列)', description: 'FIFO活结点队列的分支限界实现' }, + { path: 'c/ch6/xianbag01/bag01livevalue.c', name: 'bag01livevalue.c', label: '0/1背包(上界估计)', description: '用上界剪枝搜索最佳值的分支限界实现' } + ] + }, + { + name: 'tsp', + label: '旅行商问题(TSP)', + files: [ + { path: 'c/ch6/tsp/fenzhi/tsp2.c', name: 'tsp2.c', label: 'TSP(分支限界)', description: '分支限界法解旅行商问题' }, + { path: 'c/ch6/tsp/huisu/travelroute.c', name: 'travelroute.c', label: 'TSP(回溯法)', description: '回溯法求解旅行商路径' } + ] + }, + { + name: 'graph', + label: '图遍历', + files: [ + { path: 'c/ch6/graph/bfs.c', name: 'bfs.c', label: '广度优先遍历(BFS)', description: '队列实现的图广度优先遍历' }, + { path: 'c/ch6/graph/dfs.c', name: 'dfs.c', label: '深度优先遍历(DFS)', description: '邻接矩阵/递归的图深度优先遍历' } + ] + } + ] + } +] + +/** + * 获取所有代码文件的扁平列表(含章节信息) + */ +export function getAllFiles() { + const allFiles = [] + for (const chapter of chapters) { + if (chapter.files) { + for (const file of chapter.files) { + allFiles.push({ ...file, chapterId: chapter.id, chapterTitle: chapter.title }) + } + } + if (chapter.subfolders) { + for (const folder of chapter.subfolders) { + for (const file of folder.files) { + allFiles.push({ ...file, chapterId: chapter.id, chapterTitle: chapter.title, folder: folder.label }) + } + } + } + } + return allFiles +} + +export function getChapterById(id) { + return chapters.find(ch => ch.id === id) +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..a355e41 --- /dev/null +++ b/src/main.js @@ -0,0 +1,8 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' +import router from './router/index.js' + +const app = createApp(App) +app.use(router) +app.mount('#app') diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..d8934c1 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,30 @@ +import { createRouter, createWebHistory } from 'vue-router' +import Home from '../views/Home.vue' +import ChapterView from '../views/ChapterView.vue' +import SortDemo from '../views/SortDemo.vue' + +const routes = [ + { + path: '/', + name: 'Home', + component: Home + }, + { + path: '/chapter/:id', + name: 'Chapter', + component: ChapterView, + props: true + }, + { + path: '/sort-demo', + name: 'SortDemo', + component: SortDemo + } +] + +const router = createRouter({ + history: createWebHistory(), + routes +}) + +export default router diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..50f3f08 --- /dev/null +++ b/src/style.css @@ -0,0 +1,390 @@ +/* ============================================ + 算法分析与设计 - 教学辅助平台 主题样式 + ============================================ */ + +:root { + /* 亮色主题 */ + --primary-color: #3b82f6; + --primary-hover: #2563eb; + --sidebar-bg: #f8fafc; + --bg: #ffffff; + --card-bg: #ffffff; + --code-bg: #1e1e2e; + --code-header-bg: #2d2d3f; + --code-text: #cdd6f4; + --border-color: #e2e8f0; + --hover-bg: #f1f5f9; + --active-bg: #eff6ff; + --tag-bg: #f1f5f9; + --text-primary: #1e293b; + --text-secondary: #475569; + --text-tertiary: #94a3b8; + --shadow-sm: 0 1px 2px rgba(0,0,0,0.05); + --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1); + --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1); + + --sans: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + --mono: 'Fira Code', 'JetBrains Mono', 'Consolas', 'Cascadia Code', monospace; + + color-scheme: light; + font: 15px/1.6 var(--sans); + color: var(--text-secondary); + background: var(--bg); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +@media (prefers-color-scheme: dark) { + :root { + --primary-color: #60a5fa; + --primary-hover: #3b82f6; + --sidebar-bg: #1e1e2e; + --bg: #18181b; + --card-bg: #27272a; + --code-bg: #1e1e2e; + --code-header-bg: #2d2d3f; + --code-text: #cdd6f4; + --border-color: #3f3f46; + --hover-bg: #2a2a2e; + --active-bg: #1e3a5f; + --tag-bg: #2a2a2e; + --text-primary: #f4f4f5; + --text-secondary: #a1a1aa; + --text-tertiary: #71717a; + --shadow-sm: 0 1px 2px rgba(0,0,0,0.3); + --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.4); + --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.4); + color-scheme: dark; + } +} + +/* 全局重置 */ +*, *::before, *::after { + box-sizing: border-box; +} + +body { + margin: 0; + padding: 0; + background: var(--bg); +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--sans); + color: var(--text-primary); + line-height: 1.3; + margin: 0; +} + +p { + margin: 0; +} + +a { + color: var(--primary-color); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* 布局 */ +.app-layout { + display: flex; + min-height: 100vh; +} + +.main-content { + flex: 1; + min-width: 0; + padding: 24px; + background: var(--bg); + overflow-x: hidden; +} + +/* 滚动条 */ +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: var(--border-color); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--text-tertiary); +} + +/* 回到顶部按钮 */ +.back-to-top { + position: fixed; + bottom: 32px; + right: 32px; + width: 44px; + height: 44px; + border-radius: 50%; + background: var(--primary-color); + color: white; + border: none; + font-size: 20px; + cursor: pointer; + box-shadow: var(--shadow-md); + transition: all 0.2s; + z-index: 100; + display: flex; + align-items: center; + justify-content: center; +} + +.back-to-top:hover { + background: var(--primary-hover); + transform: translateY(-2px); + box-shadow: var(--shadow-lg); +} + +/* 代码语法高亮颜色 */ +.hl-keyword { + color: #c678dd; + font-weight: 600; +} + +.hl-comment { + color: #6a9955; + font-style: italic; +} + +.hl-string { + color: #98c379; +} + +.hl-number { + color: #d19a66; +} + +.hl-preprocessor { + color: #61afef; + font-weight: 600; +} + +/* 代码内容行号样式 */ +.code-content code { + font-family: var(--mono); + font-size: 13px; + line-height: 1.6; + white-space: pre; + tab-size: 4; +} + +/* 响应式 */ +@media (max-width: 768px) { + .app-layout { + flex-direction: column; + } + .main-content { + padding: 16px; + } +} + +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#app { + width: 1126px; + max-width: 100%; + margin: 0 auto; + text-align: center; + border-inline: 1px solid var(--border); + min-height: 100svh; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/src/utils/codeUtils.js b/src/utils/codeUtils.js new file mode 100644 index 0000000..1d8f58e --- /dev/null +++ b/src/utils/codeUtils.js @@ -0,0 +1,55 @@ +/** + * 读取服务器上的代码文件内容 + * 由于是静态站点,我们通过 fetch 请求加载 .c 文件 + */ +export async function loadCodeFile(path) { + try { + const response = await fetch(`/${path}`) + if (!response.ok) { + throw new Error(`Failed to load ${path}: ${response.status}`) + } + return await response.text() + } catch (error) { + console.error('加载代码文件失败:', error) + return `// 无法加载文件: ${path}\n// 请确保文件存在且路径正确` + } +} + +/** + * C语言关键字高亮 + */ +export function highlightC(code) { + const keywords = [ + 'auto', 'break', 'case', 'char', 'const', 'continue', 'default', 'do', + 'double', 'else', 'enum', 'extern', 'float', 'for', 'goto', 'if', + 'int', 'long', 'register', 'return', 'short', 'signed', 'sizeof', 'static', + 'struct', 'switch', 'typedef', 'union', 'unsigned', 'void', 'volatile', 'while', + 'include', 'define', 'ifdef', 'ifndef', 'endif', 'main', 'printf', 'scanf' + ] + + // 先转义 HTML + let escaped = code + .replace(/&/g, '&') + .replace(//g, '>') + + // 关键字高亮 + const keywordPattern = new RegExp(`\\b(${keywords.join('|')})\\b`, 'g') + escaped = escaped.replace(keywordPattern, '$1') + + // 注释高亮 (// 和 /* */) + escaped = escaped.replace(/(\/\/.*)/g, '$1') + escaped = escaped.replace(/(\/\*[\s\S]*?\*\/)/g, '$1') + + // 字符串高亮 + escaped = escaped.replace(/"([^"\\]*(\\.[^"\\]*)*)"/g, '"$1"') + escaped = escaped.replace(/'([^'\\]*(\\.[^'\\]*)*)'/g, '\'$1\'') + + // 数字高亮 + escaped = escaped.replace(/\b(\d+\.?\d*)\b/g, '$1') + + // 预处理指令高亮 + escaped = escaped.replace(/(^#\s*\w+.*)/gm, '$1') + + return escaped +} diff --git a/src/utils/sortAnimations.js b/src/utils/sortAnimations.js new file mode 100644 index 0000000..0337b0f --- /dev/null +++ b/src/utils/sortAnimations.js @@ -0,0 +1,291 @@ +/** + * 排序算法可视化 - 动画步骤生成器 + * 记录每一步的数组状态和操作描述,供可视化组件播放 + */ + +/** + * 生成归并排序的动画步骤 + * @param {number[]} arr - 原始数组 + * @returns {object[]} steps - 动画步骤数组 + */ +export function generateMergeSortSteps(arr) { + const steps = [] + const array = [...arr] + const n = array.length + // 辅助数组用于归并 + const temp = new Array(n) + + // 记录初始状态 + recordStep(steps, array, { description: '初始数组' }) + + function mergeSort(lo, hi) { + if (lo >= hi) { + recordStep(steps, array, { + sorted: [lo], + range: [lo, hi], + description: `单个元素 [${array[lo]}], 无需排序` + }) + return + } + + const mid = Math.floor((lo + hi) / 2) + recordStep(steps, array, { + range: [lo, hi], + description: `拆分: [${lo}..${hi}] → [${lo}..${mid}] 和 [${mid+1}..${hi}]` + }) + + mergeSort(lo, mid) + mergeSort(mid + 1, hi) + + // 归并 + merge(lo, mid, hi) + } + + function merge(lo, mid, hi) { + // 复制到辅助数组 + for (let i = lo; i <= hi; i++) { + temp[i] = array[i] + } + + recordStep(steps, array, { + range: [lo, hi], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + description: `开始归并 [${lo}..${mid}] 和 [${mid+1}..${hi}]` + }) + + let i = lo, j = mid + 1 + + for (let k = lo; k <= hi; k++) { + if (i > mid) { + // 左边已取完 + recordStep(steps, array, { + range: [lo, hi], + comparing: [i > mid ? i - 1 : i, j], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + description: `左半部分已取完, 取右半部分元素 ${temp[j]}` + }) + array[k] = temp[j++] + recordStep(steps, array, { + range: [lo, hi], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + sortedIndices: getSortedRange(lo, k), + description: `放置元素 ${array[k]} 到位置 ${k}` + }) + } else if (j > hi) { + // 右边已取完 + recordStep(steps, array, { + range: [lo, hi], + comparing: [i, j > hi ? j - 1 : j], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + description: `右半部分已取完, 取左半部分元素 ${temp[i]}` + }) + array[k] = temp[i++] + recordStep(steps, array, { + range: [lo, hi], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + sortedIndices: getSortedRange(lo, k), + description: `放置元素 ${array[k]} 到位置 ${k}` + }) + } else if (temp[i] <= temp[j]) { + // 左 <= 右, 取左边的 + recordStep(steps, array, { + range: [lo, hi], + comparing: [i, j], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + description: `比较 ${temp[i]} ≤ ${temp[j]}, 取左半部分元素 ${temp[i]}` + }) + array[k] = temp[i++] + recordStep(steps, array, { + range: [lo, hi], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + sortedIndices: getSortedRange(lo, k), + description: `放置元素 ${array[k]} 到位置 ${k}` + }) + } else { + // 左 > 右, 取右边的 + recordStep(steps, array, { + range: [lo, hi], + comparing: [i, j], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + description: `比较 ${temp[i]} > ${temp[j]}, 取右半部分元素 ${temp[j]}` + }) + array[k] = temp[j++] + recordStep(steps, array, { + range: [lo, hi], + merging: { left: [lo, mid], right: [mid + 1, hi] }, + sortedIndices: getSortedRange(lo, k), + description: `放置元素 ${array[k]} 到位置 ${k}` + }) + } + } + + // 标记整个范围为已排好序 + const sortedIndices = [] + for (let k = lo; k <= hi; k++) sortedIndices.push(k) + recordStep(steps, array, { + sorted: sortedIndices, + range: [lo, hi], + description: `归并完成: [${lo}..${hi}] 已排好序` + }) + } + + function getSortedRange(lo, k) { + const indices = [] + for (let i = lo; i <= k; i++) indices.push(i) + return indices + } + + mergeSort(0, n - 1) + + // 最终完成 + const allSorted = array.map((_, i) => i) + recordStep(steps, array, { + sorted: allSorted, + description: '✅ 归并排序完成!' + }) + + return steps +} + +/** + * 生成快速排序的动画步骤 + * @param {number[]} arr - 原始数组 + * @returns {object[]} steps - 动画步骤数组 + */ +export function generateQuickSortSteps(arr) { + const steps = [] + const array = [...arr] + const n = array.length + + recordStep(steps, array, { description: '初始数组' }) + + function quickSort(lo, hi) { + if (lo >= hi) { + if (lo === hi) { + recordStep(steps, array, { + sorted: [lo], + pivot: lo, + description: `单个元素 [${array[lo]}], 已就位` + }) + } + return + } + + recordStep(steps, array, { + range: [lo, hi], + description: `对区间 [${lo}..${hi}] 执行快速排序` + }) + + const pivotIndex = partition(lo, hi) + + // 标记 pivot 为已排好序 + recordStep(steps, array, { + sorted: [pivotIndex], + range: [lo, hi], + description: `基准元素 ${array[pivotIndex]} 已就位于位置 ${pivotIndex}` + }) + + quickSort(lo, pivotIndex - 1) + quickSort(pivotIndex + 1, hi) + } + + function partition(lo, hi) { + // 选择最右边的元素作为 pivot + const pivotValue = array[hi] + let i = lo - 1 + + recordStep(steps, array, { + range: [lo, hi], + pivot: hi, + description: `选择基准元素 pivot = ${pivotValue} (位置 ${hi})` + }) + + for (let j = lo; j < hi; j++) { + recordStep(steps, array, { + range: [lo, hi], + pivot: hi, + comparing: [j, hi], + description: `比较 array[${j}] = ${array[j]} 与 pivot = ${pivotValue}` + }) + + if (array[j] <= pivotValue) { + i++ + if (i !== j) { + // 交换 + ;[array[i], array[j]] = [array[j], array[i]] + recordStep(steps, array, { + range: [lo, hi], + pivot: hi, + swapping: [i, j], + description: `${array[j]} ≤ ${pivotValue}, 交换位置 ${i} 和 ${j}` + }) + } else { + recordStep(steps, array, { + range: [lo, hi], + pivot: hi, + description: `${array[j]} ≤ ${pivotValue}, i = j = ${i}, 无需交换` + }) + } + } + } + + // 将 pivot 放到正确位置 + if (i + 1 !== hi) { + ;[array[i + 1], array[hi]] = [array[hi], array[i + 1]] + recordStep(steps, array, { + range: [lo, hi], + swapping: [i + 1, hi], + pivot: i + 1, + description: `将基准元素 ${pivotValue} 放到正确位置 ${i + 1}` + }) + } else { + recordStep(steps, array, { + range: [lo, hi], + pivot: hi, + description: `基准元素已在正确位置 ${hi}` + }) + } + + return i + 1 + } + + quickSort(0, n - 1) + + const allSorted = array.map((_, i) => i) + recordStep(steps, array, { + sorted: allSorted, + description: '✅ 快速排序完成!' + }) + + return steps +} + +/** + * 生成随机数组 + * @param {number} size + * @param {number} maxValue + * @returns {number[]} + */ +export function generateRandomArray(size = 10, maxValue = 50) { + const arr = [] + for (let i = 0; i < size; i++) { + arr.push(Math.floor(Math.random() * maxValue) + 1) + } + return arr +} + +function recordStep(steps, array, info) { + steps.push({ + array: [...array], + highlights: { + comparing: info.comparing || null, + swapping: info.swapping || null, + pivot: info.pivot ?? null, + sorted: info.sorted || null, + sortedIndices: info.sortedIndices || null, + range: info.range || null, + merging: info.merging || null + }, + description: info.description || '' + }) +} diff --git a/src/views/ChapterView.vue b/src/views/ChapterView.vue new file mode 100644 index 0000000..789e127 --- /dev/null +++ b/src/views/ChapterView.vue @@ -0,0 +1,405 @@ + + + + + diff --git a/src/views/Home.vue b/src/views/Home.vue new file mode 100644 index 0000000..ad8316a --- /dev/null +++ b/src/views/Home.vue @@ -0,0 +1,278 @@ + + + + + diff --git a/src/views/SortDemo.vue b/src/views/SortDemo.vue new file mode 100644 index 0000000..1a2d582 --- /dev/null +++ b/src/views/SortDemo.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..3995e34 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], + test: { + environment: 'jsdom', + globals: true, + }, +})