diff --git a/client/package.json b/client/package.json
index c8f52bd..50892d9 100644
--- a/client/package.json
+++ b/client/package.json
@@ -14,6 +14,7 @@
"@fontsource/noto-sans-sc": "^5.0.0",
"@fontsource/playfair-display": "^5.0.0",
"@types/markdown-it": "^14.1.2",
+ "dplayer": "^1.25.0",
"echarts": "^6.0.0",
"highlight": "^0.2.4",
"highlight.js": "^11.11.1",
diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml
index fba3176..c08d1ca 100644
--- a/client/pnpm-lock.yaml
+++ b/client/pnpm-lock.yaml
@@ -23,6 +23,9 @@ importers:
'@types/markdown-it':
specifier: ^14.1.2
version: 14.1.2
+ dplayer:
+ specifier: ^1.25.0
+ version: 1.25.0(webpack@4.47.0)
echarts:
specifier: ^6.0.0
version: 6.0.0
@@ -648,22 +651,160 @@ packages:
'@vue/shared@3.5.26':
resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==}
+ '@webassemblyjs/ast@1.9.0':
+ resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.9.0':
+ resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==}
+
+ '@webassemblyjs/helper-api-error@1.9.0':
+ resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==}
+
+ '@webassemblyjs/helper-buffer@1.9.0':
+ resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==}
+
+ '@webassemblyjs/helper-code-frame@1.9.0':
+ resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==}
+
+ '@webassemblyjs/helper-fsm@1.9.0':
+ resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==}
+
+ '@webassemblyjs/helper-module-context@1.9.0':
+ resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.9.0':
+ resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==}
+
+ '@webassemblyjs/helper-wasm-section@1.9.0':
+ resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==}
+
+ '@webassemblyjs/ieee754@1.9.0':
+ resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==}
+
+ '@webassemblyjs/leb128@1.9.0':
+ resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==}
+
+ '@webassemblyjs/utf8@1.9.0':
+ resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==}
+
+ '@webassemblyjs/wasm-edit@1.9.0':
+ resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==}
+
+ '@webassemblyjs/wasm-gen@1.9.0':
+ resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==}
+
+ '@webassemblyjs/wasm-opt@1.9.0':
+ resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==}
+
+ '@webassemblyjs/wasm-parser@1.9.0':
+ resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==}
+
+ '@webassemblyjs/wast-parser@1.9.0':
+ resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==}
+
+ '@webassemblyjs/wast-printer@1.9.0':
+ resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ acorn@6.4.2:
+ resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ acorn@8.17.0:
+ resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv-errors@1.0.1:
+ resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==}
+ peerDependencies:
+ ajv: '>=5.0.0'
+
+ ajv-keywords@3.5.2:
+ resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ peerDependencies:
+ ajv: ^6.9.1
+
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
alien-signals@1.0.13:
resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==}
+ ansi-escapes@3.2.0:
+ resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==}
+ engines: {node: '>=4'}
+
+ ansi-regex@2.1.1:
+ resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+ engines: {node: '>=0.10.0'}
+
+ ansi-regex@3.0.1:
+ resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==}
+ engines: {node: '>=4'}
+
+ ansi-regex@4.1.1:
+ resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
+ engines: {node: '>=6'}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ anymatch@2.0.0:
+ resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==}
+
anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
+ aproba@1.2.0:
+ resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==}
+
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ arr-diff@4.0.0:
+ resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+ engines: {node: '>=0.10.0'}
+
+ arr-flatten@1.1.0:
+ resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+ engines: {node: '>=0.10.0'}
+
+ arr-union@3.1.0:
+ resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+ engines: {node: '>=0.10.0'}
+
+ array-unique@0.3.2:
+ resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+ engines: {node: '>=0.10.0'}
+
+ asn1.js@4.10.1:
+ resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==}
+
+ assert@1.5.1:
+ resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==}
+
+ assign-symbols@1.0.0:
+ resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+ engines: {node: '>=0.10.0'}
+
+ async-each@1.0.6:
+ resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==}
+
atob@2.1.2:
resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
engines: {node: '>= 4.5.0'}
@@ -676,28 +817,95 @@ packages:
peerDependencies:
postcss: ^8.1.0
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axios@0.18.0:
+ resolution: {integrity: sha512-14hgP2oTu6SPu+26Ofye6Se8u5Mmjc07a0ACHTJ5POKFU1Mtxz2IxSvaWy1O+QnbSa8XHy1gYz2E1l+G26XJdA==}
+ deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ balloon-css@0.5.2:
+ resolution: {integrity: sha512-zheJpzwyNrG4t39vusA67v3BYg1HTVXOF8cErPEHzWK88PEOFwgo6Ea9VHOgOWNMgeuOtFVtB73NE2NWl9uDyQ==}
+
base64-arraybuffer@1.0.2:
resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
engines: {node: '>= 0.6.0'}
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ base@0.11.2:
+ resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+ engines: {node: '>=0.10.0'}
+
baseline-browser-mapping@2.9.14:
resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==}
hasBin: true
+ big.js@5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+ binary-extensions@1.13.1:
+ resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==}
+ engines: {node: '>=0.10.0'}
+
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
+ bindings@1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+
+ bluebird@3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+
+ bn.js@4.12.4:
+ resolution: {integrity: sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==}
+
+ bn.js@5.2.4:
+ resolution: {integrity: sha512-QL7sb18rJ1PbdsKsqPA0guxL563vIMwRHgzNrW/uzQuRGN1Cjqd/wonUBAVqHox9KwzHA6vCbM0lXx3k4iQMow==}
+
+ brace-expansion@1.1.15:
+ resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==}
+
brace-expansion@2.0.2:
resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+ braces@2.3.2:
+ resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+ engines: {node: '>=0.10.0'}
+
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+ brorand@1.1.0:
+ resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+
+ browserify-aes@1.2.0:
+ resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
+
+ browserify-cipher@1.0.1:
+ resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
+
+ browserify-des@1.0.2:
+ resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
+
+ browserify-rsa@4.1.1:
+ resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==}
+ engines: {node: '>= 0.10'}
+
+ browserify-sign@4.2.6:
+ resolution: {integrity: sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==}
+ engines: {node: '>= 0.10'}
+
+ browserify-zlib@0.2.0:
+ resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
+
browserslist@4.28.1:
resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -708,10 +916,45 @@ packages:
engines: {node: '>= 0.4.0'}
hasBin: true
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer-xor@1.0.3:
+ resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
+
+ buffer@4.9.2:
+ resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==}
+
+ builtin-status-codes@3.0.0:
+ resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
+
+ cacache@12.0.4:
+ resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==}
+
+ cache-base@1.0.1:
+ resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+ engines: {node: '>=0.10.0'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.9:
+ resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
+ camelcase@4.1.0:
+ resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==}
+ engines: {node: '>=4'}
+
caniuse-lite@1.0.30001764:
resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==}
@@ -719,13 +962,62 @@ packages:
resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==}
engines: {node: '>=10.0.0'}
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
+ chokidar@2.1.8:
+ resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==}
+
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
+ chownr@1.1.4:
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
+ cipher-base@1.0.7:
+ resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==}
+ engines: {node: '>= 0.10'}
+
+ class-utils@0.3.6:
+ resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+ engines: {node: '>=0.10.0'}
+
+ cli-cursor@2.1.0:
+ resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==}
+ engines: {node: '>=4'}
+
+ cli-width@2.2.1:
+ resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
+
+ cliui@4.1.0:
+ resolution: {integrity: sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==}
+
+ code-point-at@1.1.0:
+ resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==}
+ engines: {node: '>=0.10.0'}
+
codemirror@6.0.2:
resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==}
+ collection-visit@1.0.0:
+ resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+ engines: {node: '>=0.10.0'}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -733,12 +1025,59 @@ packages:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
+ commondir@1.0.1:
+ resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+
+ component-emitter@1.3.1:
+ resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ concat-stream@1.6.2:
+ resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
+ engines: {'0': node >= 0.8}
+
+ console-browserify@1.2.0:
+ resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
+
+ constants-browserify@1.0.0:
+ resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
+
+ copy-concurrently@1.0.5:
+ resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==}
+ deprecated: This package is no longer supported.
+
+ copy-descriptor@0.1.1:
+ resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+ engines: {node: '>=0.10.0'}
+
core-js@3.49.0:
resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==}
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ create-ecdh@4.0.4:
+ resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
+
+ create-hash@1.2.0:
+ resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+
+ create-hmac@1.1.7:
+ resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+
crelt@1.0.6:
resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
+ cross-spawn@6.0.6:
+ resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==}
+ engines: {node: '>=4.8'}
+
+ crypto-browserify@3.12.1:
+ resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==}
+ engines: {node: '>= 0.10'}
+
css-line-break@2.1.0:
resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==}
@@ -753,24 +1092,97 @@ packages:
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+ cyclist@1.0.2:
+ resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==}
+
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+
+ decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ define-property@0.2.5:
+ resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+ engines: {node: '>=0.10.0'}
+
+ define-property@1.0.0:
+ resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+ engines: {node: '>=0.10.0'}
+
+ define-property@2.0.2:
+ resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+ engines: {node: '>=0.10.0'}
+
+ des.js@1.1.0:
+ resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
+
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ diffie-hellman@5.0.3:
+ resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
+
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ domain-browser@1.2.0:
+ resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==}
+ engines: {node: '>=0.4', npm: '>=1.2'}
+
dompurify@2.5.9:
resolution: {integrity: sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==}
+ dplayer@1.25.0:
+ resolution: {integrity: sha512-TG2IKT4IXH5trE3DKeeOqmGlewheHT5R30ya4jhMrjysc1rrCPMJYnmsBfiTS8h6613YZeriFIDHZHEEi/rs3Q==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexify@3.7.1:
+ resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==}
+
echarts@6.0.0:
resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==}
electron-to-chromium@1.5.267:
resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
+ elliptic@6.6.1:
+ resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
+
+ emojis-list@3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
+ enhanced-resolve@4.5.0:
+ resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==}
+ engines: {node: '>=6.9.0'}
+
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
@@ -779,6 +1191,22 @@ packages:
resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==}
engines: {node: '>=0.12'}
+ errno@0.1.8:
+ resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+ hasBin: true
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.2:
+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
+ engines: {node: '>= 0.4'}
+
esbuild@0.25.12:
resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
engines: {node: '>=18'}
@@ -788,13 +1216,70 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ eslint-scope@4.0.3:
+ resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==}
+ engines: {node: '>=4.0.0'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ evp_bytestokey@1.0.3:
+ resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+
+ execa@1.0.0:
+ resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==}
+ engines: {node: '>=6'}
+
+ expand-brackets@2.1.4:
+ resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+ engines: {node: '>=0.10.0'}
+
+ extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+
+ extend-shallow@3.0.2:
+ resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+ engines: {node: '>=0.10.0'}
+
+ external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+
+ extglob@2.0.4:
+ resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+ engines: {node: '>=0.10.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
fastq@1.20.1:
resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
@@ -810,13 +1295,80 @@ packages:
fflate@0.8.3:
resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==}
+ figgy-pudding@3.5.2:
+ resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==}
+ deprecated: This module is no longer supported.
+
+ figures@2.0.0:
+ resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==}
+ engines: {node: '>=4'}
+
+ file-uri-to-path@1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+
+ fill-range@4.0.0:
+ resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+ engines: {node: '>=0.10.0'}
+
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
+ find-cache-dir@2.1.0:
+ resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==}
+ engines: {node: '>=6'}
+
+ find-up@2.1.0:
+ resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==}
+ engines: {node: '>=4'}
+
+ find-up@3.0.0:
+ resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+ engines: {node: '>=6'}
+
+ flush-write-stream@1.1.1:
+ resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==}
+
+ follow-redirects@1.16.0:
+ resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ for-in@1.0.2:
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+ engines: {node: '>=0.10.0'}
+
fraction.js@5.3.4:
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
+ fragment-cache@0.2.1:
+ resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+ engines: {node: '>=0.10.0'}
+
+ from2@2.3.0:
+ resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==}
+
+ fs-write-stream-atomic@1.0.10:
+ resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==}
+ deprecated: This package is no longer supported.
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@1.2.13:
+ resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==}
+ engines: {node: '>= 4.0'}
+ os: [darwin]
+ deprecated: Upgrade to fsevents v2 to mitigate potential security issues
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -825,6 +1377,28 @@ packages:
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ get-caller-file@1.0.3:
+ resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@4.1.0:
+ resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
+ engines: {node: '>=6'}
+
+ get-value@2.0.6:
+ resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+ engines: {node: '>=0.10.0'}
+
+ glob-parent@3.1.0:
+ resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==}
+
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -833,10 +1407,70 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+
+ global-modules-path@2.3.1:
+ resolution: {integrity: sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ has-value@0.3.1:
+ resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+ engines: {node: '>=0.10.0'}
+
+ has-value@1.0.0:
+ resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+ engines: {node: '>=0.10.0'}
+
+ has-values@0.1.4:
+ resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+ engines: {node: '>=0.10.0'}
+
+ has-values@1.0.0:
+ resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+ engines: {node: '>=0.10.0'}
+
+ hash-base@3.0.5:
+ resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==}
+ engines: {node: '>= 0.10'}
+
+ hash-base@3.1.2:
+ resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==}
+ engines: {node: '>= 0.8'}
+
+ hash.js@1.1.7:
+ resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
+ engines: {node: '>= 0.4'}
+
he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
@@ -849,37 +1483,201 @@ packages:
resolution: {integrity: sha512-TEcWU6BolpDYIaVD91KmaYe/kRZwOmQlLWZGO8DK+Cs555+7mawk2KUnF/dBwcLnrvlCDk/xC+BXfz7Zva+Jfg==}
deprecated: Not maintained anymore
+ hmac-drbg@1.0.1:
+ resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+
html2canvas@1.4.1:
resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==}
engines: {node: '>=8.0.0'}
+ https-browserify@1.0.0:
+ resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ iferr@0.1.5:
+ resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==}
+
+ import-local@1.0.0:
+ resolution: {integrity: sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ infer-owner@1.0.4:
+ resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.3:
+ resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ inquirer@6.5.2:
+ resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==}
+ engines: {node: '>=6.0.0'}
+
+ interpret@1.4.0:
+ resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
+ engines: {node: '>= 0.10'}
+
+ invert-kv@2.0.0:
+ resolution: {integrity: sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==}
+ engines: {node: '>=4'}
+
+ is-accessor-descriptor@1.0.2:
+ resolution: {integrity: sha512-AIbwAcazqP3R65dGvqk1V+a+vE5Fg1yu/ZKMOiBWSUIXXiwQkYmXQcVa2O0nh0tSDKDFKxG2mY7dB1Sr4hEP1g==}
+ engines: {node: '>= 0.4'}
+
+ is-binary-path@1.0.1:
+ resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==}
+ engines: {node: '>=0.10.0'}
+
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
+ is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
is-core-module@2.16.1:
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
+ is-data-descriptor@1.0.1:
+ resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+ engines: {node: '>= 0.4'}
+
+ is-descriptor@0.1.8:
+ resolution: {integrity: sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ==}
+ engines: {node: '>= 0.4'}
+
+ is-descriptor@1.0.4:
+ resolution: {integrity: sha512-bv5z95W0dDtLfKwDfkTNxaRxmISBD3eQBKJeVxv2AQ7MjuUnDNG7cIQqvFtMOUYhsILWHhMayWdoGqNqYYYjww==}
+ engines: {node: '>= 0.4'}
+
+ is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+
+ is-extendable@1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
+ is-fullwidth-code-point@1.0.0:
+ resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@2.0.0:
+ resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
+ engines: {node: '>=4'}
+
+ is-glob@3.1.0:
+ resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==}
+ engines: {node: '>=0.10.0'}
+
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
+ is-number@3.0.0:
+ resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+ engines: {node: '>=0.10.0'}
+
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+
+ is-stream@1.1.0:
+ resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+
+ is-wsl@1.1.0:
+ resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==}
+ engines: {node: '>=4'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isobject@2.1.0:
+ resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+ engines: {node: '>=0.10.0'}
+
+ isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+
jiti@1.21.7:
resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
hasBin: true
+ json-parse-better-errors@1.0.2:
+ resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
jspdf@2.5.2:
resolution: {integrity: sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==}
+ kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@4.0.0:
+ resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
+ lcid@2.0.0:
+ resolution: {integrity: sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==}
+ engines: {node: '>=6'}
+
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
@@ -890,10 +1688,32 @@ packages:
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
+ loader-runner@2.4.0:
+ resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==}
+ engines: {node: '>=4.3.0 <5.0.0 || >=5.10'}
+
+ loader-utils@1.4.2:
+ resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
+ engines: {node: '>=4.0.0'}
+
+ locate-path@2.0.0:
+ resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
+ engines: {node: '>=4'}
+
+ locate-path@3.0.0:
+ resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+ engines: {node: '>=6'}
+
+ lodash@4.18.1:
+ resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
+
lru-cache@11.2.4:
resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==}
engines: {node: 20 || >=22}
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
lucide-vue-next@0.446.0:
resolution: {integrity: sha512-ddx9NRczKulV4a2GcbY9F5l/zuUW0ARB4mRc+kOzFur9XvvrVxVmAmhqVChZUlj9Wmraopn8ujDfhxB6FlVfIw==}
peerDependencies:
@@ -907,6 +1727,22 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ make-dir@2.1.0:
+ resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+ engines: {node: '>=6'}
+
+ map-age-cleaner@0.1.3:
+ resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==}
+ engines: {node: '>=6'}
+
+ map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+
+ map-visit@1.0.0:
+ resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+ engines: {node: '>=0.10.0'}
+
markdown-it-image-figures@2.1.1:
resolution: {integrity: sha512-mwXSQ2nPeVUzCMIE3HlLvjRioopiqyJLNph0pyx38yf9mpqFDhNGnMpAXF9/A2Xv0oiF2cVyg9xwfF0HNAz05g==}
engines: {node: '>=12.0.0'}
@@ -923,61 +1759,277 @@ packages:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
md-editor-v3@6.3.1:
resolution: {integrity: sha512-k9ynxS6Pexs+yNBuuWZ4cDpqvv/zD9p9lbPFGlCqhsCYyFJL7p/mYjUGNH3l8lsQJOUqlgbZe4Kta0ajN030Ug==}
peerDependencies:
vue: ^3.5.3
+ md5.js@1.3.5:
+ resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+
mdurl@2.0.0:
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
medium-zoom@1.1.0:
resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==}
+ mem@4.3.0:
+ resolution: {integrity: sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==}
+ engines: {node: '>=6'}
+
+ memory-fs@0.4.1:
+ resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==}
+
+ memory-fs@0.5.0:
+ resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==}
+ engines: {node: '>=4.3.0 <5.0.0 || >=5.10'}
+
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
+ micromatch@3.1.10:
+ resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==}
+ engines: {node: '>=0.10.0'}
+
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
+ miller-rabin@4.0.1:
+ resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
+ hasBin: true
+
+ mimic-fn@1.2.0:
+ resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==}
+ engines: {node: '>=4'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mini-css-extract-plugin@0.4.0:
+ resolution: {integrity: sha512-2Zik6PhUZ/MbiboG6SDS9UTPL4XXy4qnyGjSdCIWRrr8xb6PwLtHE+AYOjkXJWdF0OG8vo/yrJ8CgS5WbMpzIg==}
+ engines: {node: '>= 6.11.5'}
+ peerDependencies:
+ webpack: ^4.4.0
+
+ minimalistic-assert@1.0.1:
+ resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+
+ minimalistic-crypto-utils@1.0.1:
+ resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mississippi@3.0.0:
+ resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==}
+ engines: {node: '>=4.0.0'}
+
+ mixin-deep@1.3.2:
+ resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+ engines: {node: '>=0.10.0'}
+
+ mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+
+ move-concurrently@1.0.1:
+ resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==}
+ deprecated: This package is no longer supported.
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+ mute-stream@0.0.7:
+ resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==}
+
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+ nan@2.28.0:
+ resolution: {integrity: sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==}
+
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanomatch@1.2.13:
+ resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+ engines: {node: '>=0.10.0'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ nice-try@1.0.5:
+ resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
+
+ node-libs-browser@2.2.1:
+ resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==}
+
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+ normalize-path@2.1.1:
+ resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
+ engines: {node: '>=0.10.0'}
+
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
+ npm-run-path@2.0.2:
+ resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==}
+ engines: {node: '>=4'}
+
+ number-is-nan@1.0.1:
+ resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==}
+ engines: {node: '>=0.10.0'}
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
+ object-copy@0.1.0:
+ resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+ engines: {node: '>=0.10.0'}
+
object-hash@3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object-visit@1.0.1:
+ resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+ engines: {node: '>=0.10.0'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.pick@1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@2.0.1:
+ resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==}
+ engines: {node: '>=4'}
+
+ os-browserify@0.3.0:
+ resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
+
+ os-locale@3.1.0:
+ resolution: {integrity: sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==}
+ engines: {node: '>=6'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
+ p-defer@1.0.0:
+ resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==}
+ engines: {node: '>=4'}
+
+ p-finally@1.0.0:
+ resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
+ engines: {node: '>=4'}
+
+ p-is-promise@2.1.0:
+ resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==}
+ engines: {node: '>=6'}
+
+ p-limit@1.3.0:
+ resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
+ engines: {node: '>=4'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-locate@2.0.0:
+ resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==}
+ engines: {node: '>=4'}
+
+ p-locate@3.0.0:
+ resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+ engines: {node: '>=6'}
+
+ p-try@1.0.0:
+ resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==}
+ engines: {node: '>=4'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ pako@1.0.11:
+ resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+
+ parallel-transform@1.2.0:
+ resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==}
+
+ parse-asn1@5.1.9:
+ resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==}
+ engines: {node: '>= 0.10'}
+
+ pascalcase@0.1.1:
+ resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+ engines: {node: '>=0.10.0'}
+
+ path-browserify@0.0.1:
+ resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==}
+
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ path-dirname@1.0.2:
+ resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==}
+
+ path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@2.0.1:
+ resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
+ engines: {node: '>=4'}
+
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ pbkdf2@3.1.6:
+ resolution: {integrity: sha512-BT6eelPB1EyGHo8pC0o9Bl6k6SYVhKO1jEbd3lcTrtr7XHdjP8BW1YpfCV3G9Kwkxgattk+S5q2/RvuttCsS1g==}
+ engines: {node: '>= 0.10'}
+
performance-now@2.1.0:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
@@ -996,10 +2048,30 @@ packages:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
+ pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+
pirates@4.0.7:
resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
engines: {node: '>= 6'}
+ pkg-dir@2.0.0:
+ resolution: {integrity: sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==}
+ engines: {node: '>=4'}
+
+ pkg-dir@3.0.0:
+ resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==}
+ engines: {node: '>=6'}
+
+ posix-character-classes@0.1.1:
+ resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+ engines: {node: '>=0.10.0'}
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
postcss-import@15.1.0:
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
@@ -1047,19 +2119,80 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+
+ promise-inflight@1.0.1:
+ resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
+ peerDependencies:
+ bluebird: '*'
+ peerDependenciesMeta:
+ bluebird:
+ optional: true
+
+ promise-polyfill@8.0.0:
+ resolution: {integrity: sha512-QGmPnw2hDEaRS6freHynJ7nfS1nDg0/P0c/CGglA43utoJjYQMiY9ojEpK0HaJ4wbUztdmwqQRlEfGWdsEQ5uQ==}
+
+ prr@1.0.1:
+ resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+
+ public-encrypt@4.0.3:
+ resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
+
+ pump@2.0.1:
+ resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==}
+
+ pump@3.0.4:
+ resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==}
+
+ pumpify@1.5.1:
+ resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==}
+
punycode.js@2.3.1:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
+ punycode@1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qs@6.15.3:
+ resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==}
+ engines: {node: '>=0.6'}
+
+ querystring-es3@0.2.1:
+ resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
+ engines: {node: '>=0.4.x'}
+
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
raf@3.4.1:
resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==}
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ randomfill@1.0.4:
+ resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
+
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+ readdirp@2.2.1:
+ resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==}
+ engines: {node: '>=0.10'}
+
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -1067,11 +2200,53 @@ packages:
regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+ regex-not@1.0.2:
+ resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+ engines: {node: '>=0.10.0'}
+
+ remove-trailing-separator@1.1.0:
+ resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==}
+
+ repeat-element@1.1.4:
+ resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+ engines: {node: '>=0.10.0'}
+
+ repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+ engines: {node: '>=0.10'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-main-filename@1.0.1:
+ resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==}
+
+ resolve-cwd@2.0.0:
+ resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==}
+ engines: {node: '>=4'}
+
+ resolve-from@3.0.0:
+ resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==}
+ engines: {node: '>=4'}
+
+ resolve-url@0.2.1:
+ resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+ deprecated: https://github.com/lydell/resolve-url#deprecated
+
resolve@1.22.11:
resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
engines: {node: '>= 0.4'}
hasBin: true
+ restore-cursor@2.0.0:
+ resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==}
+ engines: {node: '>=4'}
+
+ ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
+
reusify@1.1.0:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
@@ -1080,22 +2255,198 @@ packages:
resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==}
engines: {node: '>= 0.8.15'}
+ rimraf@2.7.1:
+ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ ripemd160@2.0.3:
+ resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==}
+ engines: {node: '>= 0.8'}
+
rollup@4.55.1:
resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ run-queue@1.0.3:
+ resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==}
+
+ rxjs@6.6.7:
+ resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
+ engines: {npm: '>=2.0.0'}
+
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-regex@1.1.0:
+ resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ schema-utils@1.0.0:
+ resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==}
+ engines: {node: '>= 4'}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ serialize-javascript@4.0.0:
+ resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
+
+ set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-value@2.0.1:
+ resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+ engines: {node: '>=0.10.0'}
+
+ setimmediate@1.0.5:
+ resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+
+ sha.js@2.4.12:
+ resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==}
+ engines: {node: '>= 0.10'}
+ hasBin: true
+
+ shebang-command@1.2.0:
+ resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
+ engines: {node: '>=0.10.0'}
+
+ shebang-regex@1.0.0:
+ resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
+ engines: {node: '>=0.10.0'}
+
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.1:
+ resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ snapdragon-node@2.1.1:
+ resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon-util@3.0.1:
+ resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon@0.8.2:
+ resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+ engines: {node: '>=0.10.0'}
+
+ source-list-map@2.0.1:
+ resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==}
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ source-map-resolve@0.5.3:
+ resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+ deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map-url@0.4.1:
+ resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+ deprecated: See https://github.com/lydell/source-map-url#deprecated
+
+ source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ split-string@3.1.0:
+ resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+ engines: {node: '>=0.10.0'}
+
+ ssri@6.0.2:
+ resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==}
+
stackblur-canvas@2.7.0:
resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==}
engines: {node: '>=0.1.14'}
+ static-extend@0.1.2:
+ resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+ engines: {node: '>=0.10.0'}
+
+ stream-browserify@2.0.2:
+ resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==}
+
+ stream-each@1.2.3:
+ resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==}
+
+ stream-http@2.8.3:
+ resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==}
+
+ stream-shift@1.0.3:
+ resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+
+ string-width@1.0.2:
+ resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==}
+ engines: {node: '>=0.10.0'}
+
+ string-width@2.1.1:
+ resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==}
+ engines: {node: '>=4'}
+
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@3.0.1:
+ resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+ engines: {node: '>=0.10.0'}
+
+ strip-ansi@4.0.0:
+ resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==}
+ engines: {node: '>=4'}
+
+ strip-ansi@5.2.0:
+ resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
+ engines: {node: '>=6'}
+
+ strip-eof@1.0.0:
+ resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==}
+ engines: {node: '>=0.10.0'}
+
style-mod@4.1.3:
resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==}
@@ -1104,6 +2455,10 @@ packages:
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
@@ -1117,6 +2472,21 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
+ tapable@1.1.3:
+ resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
+ engines: {node: '>=6'}
+
+ terser-webpack-plugin@1.4.6:
+ resolution: {integrity: sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==}
+ engines: {node: '>= 6.9.0'}
+ peerDependencies:
+ webpack: ^4.0.0
+
+ terser@4.8.1:
+ resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
text-segmentation@1.0.3:
resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==}
@@ -1127,20 +2497,66 @@ packages:
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ through2@2.0.5:
+ resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ timers-browserify@2.0.12:
+ resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==}
+ engines: {node: '>=0.6.0'}
+
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
+ tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+
+ to-arraybuffer@1.0.1:
+ resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==}
+
+ to-buffer@1.2.2:
+ resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==}
+ engines: {node: '>= 0.4'}
+
+ to-object-path@0.3.0:
+ resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+ engines: {node: '>=0.10.0'}
+
+ to-regex-range@2.1.1:
+ resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+ engines: {node: '>=0.10.0'}
+
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
+ to-regex@3.0.2:
+ resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+ engines: {node: '>=0.10.0'}
+
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
tslib@2.3.0:
resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+ tty-browserify@0.0.0:
+ resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
typescript@5.6.3:
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
@@ -1149,18 +2565,60 @@ packages:
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
+ union-value@1.0.1:
+ resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+ engines: {node: '>=0.10.0'}
+
+ unique-filename@1.1.1:
+ resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
+
+ unique-slug@2.0.2:
+ resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==}
+
+ unset-value@1.0.0:
+ resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+ engines: {node: '>=0.10.0'}
+
+ upath@1.2.0:
+ resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
+ engines: {node: '>=4'}
+
update-browserslist-db@1.2.3:
resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ urix@0.1.0:
+ resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+ deprecated: Please see https://github.com/lydell/urix#deprecated
+
+ url@0.11.4:
+ resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
+ engines: {node: '>= 0.4'}
+
+ use@3.1.1:
+ resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+ engines: {node: '>=0.10.0'}
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ util@0.10.4:
+ resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==}
+
+ util@0.11.1:
+ resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==}
+
utrie@1.0.2:
resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==}
+ v8-compile-cache@2.4.0:
+ resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==}
+
vite@6.4.1:
resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -1201,6 +2659,9 @@ packages:
yaml:
optional: true
+ vm-browserify@1.1.2:
+ resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
+
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
@@ -1232,11 +2693,80 @@ packages:
w3c-keyname@2.2.8:
resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+ watchpack-chokidar2@2.0.1:
+ resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==}
+
+ watchpack@1.7.5:
+ resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==}
+
+ webpack-cli@3.0.4:
+ resolution: {integrity: sha512-r5R0hMck4GxUS6a3TXClwi1KhQfnHZRtIfXqsSytQZG4kawKMhTtd5//uNZGoGks/h61Zv5jMnR6jwx15Qf8dA==}
+ engines: {node: '>=6.11.5'}
+ hasBin: true
+ peerDependencies:
+ webpack: ^4.x.x
+
+ webpack-sources@1.4.3:
+ resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==}
+
+ webpack@4.47.0:
+ resolution: {integrity: sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==}
+ engines: {node: '>=6.11.5'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ webpack-command: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+ webpack-command:
+ optional: true
+
+ which-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+
+ which-typed-array@1.1.22:
+ resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==}
+ engines: {node: '>= 0.4'}
+
+ which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+
+ worker-farm@1.7.0:
+ resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==}
+
+ wrap-ansi@2.1.0:
+ resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==}
+ engines: {node: '>=0.10.0'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
xss@1.0.15:
resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==}
engines: {node: '>= 0.10.0'}
hasBin: true
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ y18n@3.2.2:
+ resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==}
+
+ y18n@4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yargs-parser@9.0.2:
+ resolution: {integrity: sha512-CswCfdOgCr4MMsT1GzbEJ7Z2uYudWyrGX8Bgh/0eyCzj/DXWdKq6a/ADufkzI1WAOIW6jYaXJvRyLhDO0kfqBw==}
+
+ yargs@11.1.1:
+ resolution: {integrity: sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==}
+
zrender@6.0.0:
resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==}
@@ -1898,19 +3428,179 @@ snapshots:
'@vue/shared@3.5.26': {}
+ '@webassemblyjs/ast@1.9.0':
+ dependencies:
+ '@webassemblyjs/helper-module-context': 1.9.0
+ '@webassemblyjs/helper-wasm-bytecode': 1.9.0
+ '@webassemblyjs/wast-parser': 1.9.0
+
+ '@webassemblyjs/floating-point-hex-parser@1.9.0': {}
+
+ '@webassemblyjs/helper-api-error@1.9.0': {}
+
+ '@webassemblyjs/helper-buffer@1.9.0': {}
+
+ '@webassemblyjs/helper-code-frame@1.9.0':
+ dependencies:
+ '@webassemblyjs/wast-printer': 1.9.0
+
+ '@webassemblyjs/helper-fsm@1.9.0': {}
+
+ '@webassemblyjs/helper-module-context@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+
+ '@webassemblyjs/helper-wasm-bytecode@1.9.0': {}
+
+ '@webassemblyjs/helper-wasm-section@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/helper-buffer': 1.9.0
+ '@webassemblyjs/helper-wasm-bytecode': 1.9.0
+ '@webassemblyjs/wasm-gen': 1.9.0
+
+ '@webassemblyjs/ieee754@1.9.0':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.9.0':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.9.0': {}
+
+ '@webassemblyjs/wasm-edit@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/helper-buffer': 1.9.0
+ '@webassemblyjs/helper-wasm-bytecode': 1.9.0
+ '@webassemblyjs/helper-wasm-section': 1.9.0
+ '@webassemblyjs/wasm-gen': 1.9.0
+ '@webassemblyjs/wasm-opt': 1.9.0
+ '@webassemblyjs/wasm-parser': 1.9.0
+ '@webassemblyjs/wast-printer': 1.9.0
+
+ '@webassemblyjs/wasm-gen@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/helper-wasm-bytecode': 1.9.0
+ '@webassemblyjs/ieee754': 1.9.0
+ '@webassemblyjs/leb128': 1.9.0
+ '@webassemblyjs/utf8': 1.9.0
+
+ '@webassemblyjs/wasm-opt@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/helper-buffer': 1.9.0
+ '@webassemblyjs/wasm-gen': 1.9.0
+ '@webassemblyjs/wasm-parser': 1.9.0
+
+ '@webassemblyjs/wasm-parser@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/helper-api-error': 1.9.0
+ '@webassemblyjs/helper-wasm-bytecode': 1.9.0
+ '@webassemblyjs/ieee754': 1.9.0
+ '@webassemblyjs/leb128': 1.9.0
+ '@webassemblyjs/utf8': 1.9.0
+
+ '@webassemblyjs/wast-parser@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/floating-point-hex-parser': 1.9.0
+ '@webassemblyjs/helper-api-error': 1.9.0
+ '@webassemblyjs/helper-code-frame': 1.9.0
+ '@webassemblyjs/helper-fsm': 1.9.0
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/wast-printer@1.9.0':
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/wast-parser': 1.9.0
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ acorn@6.4.2: {}
+
+ acorn@8.17.0: {}
+
+ ajv-errors@1.0.1(ajv@6.15.0):
+ dependencies:
+ ajv: 6.15.0
+
+ ajv-keywords@3.5.2(ajv@6.15.0):
+ dependencies:
+ ajv: 6.15.0
+
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
alien-signals@1.0.13: {}
+ ansi-escapes@3.2.0: {}
+
+ ansi-regex@2.1.1: {}
+
+ ansi-regex@3.0.1: {}
+
+ ansi-regex@4.1.1: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
any-promise@1.3.0: {}
+ anymatch@2.0.0:
+ dependencies:
+ micromatch: 3.1.10
+ normalize-path: 2.1.1
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
anymatch@3.1.3:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
+ aproba@1.2.0: {}
+
arg@5.0.2: {}
argparse@2.0.1: {}
+ arr-diff@4.0.0: {}
+
+ arr-flatten@1.1.0: {}
+
+ arr-union@3.1.0: {}
+
+ array-unique@0.3.2: {}
+
+ asn1.js@4.10.1:
+ dependencies:
+ bn.js: 4.12.4
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+
+ assert@1.5.1:
+ dependencies:
+ object.assign: 4.1.7
+ util: 0.10.4
+
+ assign-symbols@1.0.0: {}
+
+ async-each@1.0.6:
+ optional: true
+
atob@2.1.2: {}
autoprefixer@10.4.23(postcss@8.5.6):
@@ -1922,22 +3612,129 @@ snapshots:
postcss: 8.5.6
postcss-value-parser: 4.2.0
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ axios@0.18.0:
+ dependencies:
+ follow-redirects: 1.16.0
+ is-buffer: 1.1.6
+ transitivePeerDependencies:
+ - debug
+
balanced-match@1.0.2: {}
+ balloon-css@0.5.2: {}
+
base64-arraybuffer@1.0.2: {}
+ base64-js@1.5.1: {}
+
+ base@0.11.2:
+ dependencies:
+ cache-base: 1.0.1
+ class-utils: 0.3.6
+ component-emitter: 1.3.1
+ define-property: 1.0.0
+ isobject: 3.0.1
+ mixin-deep: 1.3.2
+ pascalcase: 0.1.1
+
baseline-browser-mapping@2.9.14: {}
+ big.js@5.2.2: {}
+
+ binary-extensions@1.13.1:
+ optional: true
+
binary-extensions@2.3.0: {}
+ bindings@1.5.0:
+ dependencies:
+ file-uri-to-path: 1.0.0
+ optional: true
+
+ bluebird@3.7.2: {}
+
+ bn.js@4.12.4: {}
+
+ bn.js@5.2.4: {}
+
+ brace-expansion@1.1.15:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
brace-expansion@2.0.2:
dependencies:
balanced-match: 1.0.2
+ braces@2.3.2:
+ dependencies:
+ arr-flatten: 1.1.0
+ array-unique: 0.3.2
+ extend-shallow: 2.0.1
+ fill-range: 4.0.0
+ isobject: 3.0.1
+ repeat-element: 1.1.4
+ snapdragon: 0.8.2
+ snapdragon-node: 2.1.1
+ split-string: 3.1.0
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
braces@3.0.3:
dependencies:
fill-range: 7.1.1
+ brorand@1.1.0: {}
+
+ browserify-aes@1.2.0:
+ dependencies:
+ buffer-xor: 1.0.3
+ cipher-base: 1.0.7
+ create-hash: 1.2.0
+ evp_bytestokey: 1.0.3
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ browserify-cipher@1.0.1:
+ dependencies:
+ browserify-aes: 1.2.0
+ browserify-des: 1.0.2
+ evp_bytestokey: 1.0.3
+
+ browserify-des@1.0.2:
+ dependencies:
+ cipher-base: 1.0.7
+ des.js: 1.1.0
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ browserify-rsa@4.1.1:
+ dependencies:
+ bn.js: 5.2.4
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+
+ browserify-sign@4.2.6:
+ dependencies:
+ bn.js: 5.2.4
+ browserify-rsa: 4.1.1
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ elliptic: 6.6.1
+ inherits: 2.0.4
+ parse-asn1: 5.1.9
+ readable-stream: 2.3.8
+ safe-buffer: 5.2.1
+
+ browserify-zlib@0.2.0:
+ dependencies:
+ pako: 1.0.11
+
browserslist@4.28.1:
dependencies:
baseline-browser-mapping: 2.9.14
@@ -1948,8 +3745,69 @@ snapshots:
btoa@1.2.1: {}
+ buffer-from@1.1.2: {}
+
+ buffer-xor@1.0.3: {}
+
+ buffer@4.9.2:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ isarray: 1.0.0
+
+ builtin-status-codes@3.0.0: {}
+
+ cacache@12.0.4:
+ dependencies:
+ bluebird: 3.7.2
+ chownr: 1.1.4
+ figgy-pudding: 3.5.2
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ infer-owner: 1.0.4
+ lru-cache: 5.1.1
+ mississippi: 3.0.0
+ mkdirp: 0.5.6
+ move-concurrently: 1.0.1
+ promise-inflight: 1.0.1(bluebird@3.7.2)
+ rimraf: 2.7.1
+ ssri: 6.0.2
+ unique-filename: 1.1.1
+ y18n: 4.0.3
+
+ cache-base@1.0.1:
+ dependencies:
+ collection-visit: 1.0.0
+ component-emitter: 1.3.1
+ get-value: 2.0.6
+ has-value: 1.0.0
+ isobject: 3.0.1
+ set-value: 2.0.1
+ to-object-path: 0.3.0
+ union-value: 1.0.1
+ unset-value: 1.0.0
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.9:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
camelcase-css@2.0.1: {}
+ camelcase@4.1.0: {}
+
caniuse-lite@1.0.30001764: {}
canvg@3.0.11:
@@ -1964,6 +3822,33 @@ snapshots:
svg-pathdata: 6.0.3
optional: true
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ chardet@0.7.0: {}
+
+ chokidar@2.1.8:
+ dependencies:
+ anymatch: 2.0.0
+ async-each: 1.0.6
+ braces: 2.3.2
+ glob-parent: 3.1.0
+ inherits: 2.0.4
+ is-binary-path: 1.0.1
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ path-is-absolute: 1.0.1
+ readdirp: 2.2.1
+ upath: 1.2.0
+ optionalDependencies:
+ fsevents: 1.2.13
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
@@ -1976,6 +3861,37 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
+ chownr@1.1.4: {}
+
+ chrome-trace-event@1.0.4: {}
+
+ cipher-base@1.0.7:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ to-buffer: 1.2.2
+
+ class-utils@0.3.6:
+ dependencies:
+ arr-union: 3.1.0
+ define-property: 0.2.5
+ isobject: 3.0.1
+ static-extend: 0.1.2
+
+ cli-cursor@2.1.0:
+ dependencies:
+ restore-cursor: 2.0.0
+
+ cli-width@2.2.1: {}
+
+ cliui@4.1.0:
+ dependencies:
+ string-width: 2.1.1
+ strip-ansi: 4.0.0
+ wrap-ansi: 2.1.0
+
+ code-point-at@1.1.0: {}
+
codemirror@6.0.2:
dependencies:
'@codemirror/autocomplete': 6.20.0
@@ -1986,15 +3902,101 @@ snapshots:
'@codemirror/state': 6.5.4
'@codemirror/view': 6.39.11
+ collection-visit@1.0.0:
+ dependencies:
+ map-visit: 1.0.0
+ object-visit: 1.0.1
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-name@1.1.3: {}
+
commander@2.20.3: {}
commander@4.1.1: {}
+ commondir@1.0.1: {}
+
+ component-emitter@1.3.1: {}
+
+ concat-map@0.0.1: {}
+
+ concat-stream@1.6.2:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ typedarray: 0.0.6
+
+ console-browserify@1.2.0: {}
+
+ constants-browserify@1.0.0: {}
+
+ copy-concurrently@1.0.5:
+ dependencies:
+ aproba: 1.2.0
+ fs-write-stream-atomic: 1.0.10
+ iferr: 0.1.5
+ mkdirp: 0.5.6
+ rimraf: 2.7.1
+ run-queue: 1.0.3
+
+ copy-descriptor@0.1.1: {}
+
core-js@3.49.0:
optional: true
+ core-util-is@1.0.3: {}
+
+ create-ecdh@4.0.4:
+ dependencies:
+ bn.js: 4.12.4
+ elliptic: 6.6.1
+
+ create-hash@1.2.0:
+ dependencies:
+ cipher-base: 1.0.7
+ inherits: 2.0.4
+ md5.js: 1.3.5
+ ripemd160: 2.0.3
+ sha.js: 2.4.12
+
+ create-hmac@1.1.7:
+ dependencies:
+ cipher-base: 1.0.7
+ create-hash: 1.2.0
+ inherits: 2.0.4
+ ripemd160: 2.0.3
+ safe-buffer: 5.2.1
+ sha.js: 2.4.12
+
crelt@1.0.6: {}
+ cross-spawn@6.0.6:
+ dependencies:
+ nice-try: 1.0.5
+ path-key: 2.0.1
+ semver: 5.7.2
+ shebang-command: 1.2.0
+ which: 1.3.1
+
+ crypto-browserify@3.12.1:
+ dependencies:
+ browserify-cipher: 1.0.1
+ browserify-sign: 4.2.6
+ create-ecdh: 4.0.4
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ diffie-hellman: 5.0.3
+ hash-base: 3.0.5
+ inherits: 2.0.4
+ pbkdf2: 3.1.6
+ public-encrypt: 4.0.3
+ randombytes: 2.1.0
+ randomfill: 1.0.4
+
css-line-break@2.1.0:
dependencies:
utrie: 1.0.2
@@ -2005,15 +4007,87 @@ snapshots:
csstype@3.2.3: {}
+ cyclist@1.0.2: {}
+
de-indent@1.0.2: {}
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ decamelize@1.2.0: {}
+
+ decode-uri-component@0.2.2: {}
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ define-property@0.2.5:
+ dependencies:
+ is-descriptor: 0.1.8
+
+ define-property@1.0.0:
+ dependencies:
+ is-descriptor: 1.0.4
+
+ define-property@2.0.2:
+ dependencies:
+ is-descriptor: 1.0.4
+ isobject: 3.0.1
+
+ des.js@1.1.0:
+ dependencies:
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+
didyoumean@1.2.2: {}
+ diffie-hellman@5.0.3:
+ dependencies:
+ bn.js: 4.12.4
+ miller-rabin: 4.0.1
+ randombytes: 2.1.0
+
dlv@1.1.3: {}
+ domain-browser@1.2.0: {}
+
dompurify@2.5.9:
optional: true
+ dplayer@1.25.0(webpack@4.47.0):
+ dependencies:
+ axios: 0.18.0
+ balloon-css: 0.5.2
+ mini-css-extract-plugin: 0.4.0(webpack@4.47.0)
+ promise-polyfill: 8.0.0
+ webpack-cli: 3.0.4(webpack@4.47.0)
+ transitivePeerDependencies:
+ - debug
+ - webpack
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexify@3.7.1:
+ dependencies:
+ end-of-stream: 1.4.5
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ stream-shift: 1.0.3
+
echarts@6.0.0:
dependencies:
tslib: 2.3.0
@@ -2021,10 +4095,44 @@ snapshots:
electron-to-chromium@1.5.267: {}
+ elliptic@6.6.1:
+ dependencies:
+ bn.js: 4.12.4
+ brorand: 1.1.0
+ hash.js: 1.1.7
+ hmac-drbg: 1.0.1
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+
+ emojis-list@3.0.0: {}
+
+ end-of-stream@1.4.5:
+ dependencies:
+ once: 1.4.0
+
+ enhanced-resolve@4.5.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ memory-fs: 0.5.0
+ tapable: 1.1.3
+
entities@4.5.0: {}
entities@7.0.0: {}
+ errno@0.1.8:
+ dependencies:
+ prr: 1.0.1
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-object-atoms@1.1.2:
+ dependencies:
+ es-errors: 1.3.0
+
esbuild@0.25.12:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.12
@@ -2056,8 +4164,82 @@ snapshots:
escalade@3.2.0: {}
+ escape-string-regexp@1.0.5: {}
+
+ eslint-scope@4.0.3:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
+ estraverse@5.3.0: {}
+
estree-walker@2.0.2: {}
+ events@3.3.0: {}
+
+ evp_bytestokey@1.0.3:
+ dependencies:
+ md5.js: 1.3.5
+ safe-buffer: 5.2.1
+
+ execa@1.0.0:
+ dependencies:
+ cross-spawn: 6.0.6
+ get-stream: 4.1.0
+ is-stream: 1.1.0
+ npm-run-path: 2.0.2
+ p-finally: 1.0.0
+ signal-exit: 3.0.7
+ strip-eof: 1.0.0
+
+ expand-brackets@2.1.4:
+ dependencies:
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ posix-character-classes: 0.1.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ extend-shallow@2.0.1:
+ dependencies:
+ is-extendable: 0.1.1
+
+ extend-shallow@3.0.2:
+ dependencies:
+ assign-symbols: 1.0.0
+ is-extendable: 1.0.1
+
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ extglob@2.0.4:
+ dependencies:
+ array-unique: 0.3.2
+ define-property: 1.0.0
+ expand-brackets: 2.1.4
+ extend-shallow: 2.0.1
+ fragment-cache: 0.2.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ fast-deep-equal@3.1.3: {}
+
fast-glob@3.3.3:
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -2066,6 +4248,8 @@ snapshots:
merge2: 1.4.1
micromatch: 4.0.8
+ fast-json-stable-stringify@2.1.0: {}
+
fastq@1.20.1:
dependencies:
reusify: 1.1.0
@@ -2076,17 +4260,116 @@ snapshots:
fflate@0.8.3: {}
+ figgy-pudding@3.5.2: {}
+
+ figures@2.0.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ file-uri-to-path@1.0.0:
+ optional: true
+
+ fill-range@4.0.0:
+ dependencies:
+ extend-shallow: 2.0.1
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ to-regex-range: 2.1.1
+
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
+ find-cache-dir@2.1.0:
+ dependencies:
+ commondir: 1.0.1
+ make-dir: 2.1.0
+ pkg-dir: 3.0.0
+
+ find-up@2.1.0:
+ dependencies:
+ locate-path: 2.0.0
+
+ find-up@3.0.0:
+ dependencies:
+ locate-path: 3.0.0
+
+ flush-write-stream@1.1.1:
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+
+ follow-redirects@1.16.0: {}
+
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
+
+ for-in@1.0.2: {}
+
fraction.js@5.3.4: {}
+ fragment-cache@0.2.1:
+ dependencies:
+ map-cache: 0.2.2
+
+ from2@2.3.0:
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+
+ fs-write-stream-atomic@1.0.10:
+ dependencies:
+ graceful-fs: 4.2.11
+ iferr: 0.1.5
+ imurmurhash: 0.1.4
+ readable-stream: 2.3.8
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@1.2.13:
+ dependencies:
+ bindings: 1.5.0
+ nan: 2.28.0
+ optional: true
+
fsevents@2.3.3:
optional: true
function-bind@1.1.2: {}
+ get-caller-file@1.0.3: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.4
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.2
+
+ get-stream@4.1.0:
+ dependencies:
+ pump: 3.0.4
+
+ get-value@2.0.6: {}
+
+ glob-parent@3.1.0:
+ dependencies:
+ is-glob: 3.1.0
+ path-dirname: 1.0.2
+ optional: true
+
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
@@ -2095,39 +4378,242 @@ snapshots:
dependencies:
is-glob: 4.0.3
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.5
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ global-modules-path@2.3.1: {}
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ has-flag@3.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ has-value@0.3.1:
+ dependencies:
+ get-value: 2.0.6
+ has-values: 0.1.4
+ isobject: 2.1.0
+
+ has-value@1.0.0:
+ dependencies:
+ get-value: 2.0.6
+ has-values: 1.0.0
+ isobject: 3.0.1
+
+ has-values@0.1.4: {}
+
+ has-values@1.0.0:
+ dependencies:
+ is-number: 3.0.0
+ kind-of: 4.0.0
+
+ hash-base@3.0.5:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ hash-base@3.1.2:
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ safe-buffer: 5.2.1
+ to-buffer: 1.2.2
+
+ hash.js@1.1.7:
+ dependencies:
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
+ hasown@2.0.4:
+ dependencies:
+ function-bind: 1.1.2
+
he@1.2.0: {}
highlight.js@11.11.1: {}
highlight@0.2.4: {}
+ hmac-drbg@1.0.1:
+ dependencies:
+ hash.js: 1.1.7
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+
html2canvas@1.4.1:
dependencies:
css-line-break: 2.1.0
text-segmentation: 1.0.3
+ https-browserify@1.0.0: {}
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ iferr@0.1.5: {}
+
+ import-local@1.0.0:
+ dependencies:
+ pkg-dir: 2.0.0
+ resolve-cwd: 2.0.0
+
+ imurmurhash@0.1.4: {}
+
+ infer-owner@1.0.4: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.3: {}
+
+ inherits@2.0.4: {}
+
+ inquirer@6.5.2:
+ dependencies:
+ ansi-escapes: 3.2.0
+ chalk: 2.4.2
+ cli-cursor: 2.1.0
+ cli-width: 2.2.1
+ external-editor: 3.1.0
+ figures: 2.0.0
+ lodash: 4.18.1
+ mute-stream: 0.0.7
+ run-async: 2.4.1
+ rxjs: 6.6.7
+ string-width: 2.1.1
+ strip-ansi: 5.2.0
+ through: 2.3.8
+
+ interpret@1.4.0: {}
+
+ invert-kv@2.0.0: {}
+
+ is-accessor-descriptor@1.0.2:
+ dependencies:
+ hasown: 2.0.4
+
+ is-binary-path@1.0.1:
+ dependencies:
+ binary-extensions: 1.13.1
+ optional: true
+
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
+ is-buffer@1.1.6: {}
+
+ is-callable@1.2.7: {}
+
is-core-module@2.16.1:
dependencies:
hasown: 2.0.2
+ is-data-descriptor@1.0.1:
+ dependencies:
+ hasown: 2.0.4
+
+ is-descriptor@0.1.8:
+ dependencies:
+ is-accessor-descriptor: 1.0.2
+ is-data-descriptor: 1.0.1
+
+ is-descriptor@1.0.4:
+ dependencies:
+ is-accessor-descriptor: 1.0.2
+ is-data-descriptor: 1.0.1
+
+ is-extendable@0.1.1: {}
+
+ is-extendable@1.0.1:
+ dependencies:
+ is-plain-object: 2.0.4
+
is-extglob@2.1.1: {}
+ is-fullwidth-code-point@1.0.0:
+ dependencies:
+ number-is-nan: 1.0.1
+
+ is-fullwidth-code-point@2.0.0: {}
+
+ is-glob@3.1.0:
+ dependencies:
+ is-extglob: 2.1.1
+ optional: true
+
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
+ is-number@3.0.0:
+ dependencies:
+ kind-of: 3.2.2
+
is-number@7.0.0: {}
+ is-plain-object@2.0.4:
+ dependencies:
+ isobject: 3.0.1
+
+ is-stream@1.1.0: {}
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.22
+
+ is-windows@1.0.2: {}
+
+ is-wsl@1.1.0: {}
+
+ isarray@1.0.0: {}
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ isobject@2.1.0:
+ dependencies:
+ isarray: 1.0.0
+
+ isobject@3.0.1: {}
+
jiti@1.21.7: {}
+ json-parse-better-errors@1.0.2: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
jspdf@2.5.2:
dependencies:
'@babel/runtime': 7.29.7
@@ -2140,6 +4626,20 @@ snapshots:
dompurify: 2.5.9
html2canvas: 1.4.1
+ kind-of@3.2.2:
+ dependencies:
+ is-buffer: 1.1.6
+
+ kind-of@4.0.0:
+ dependencies:
+ is-buffer: 1.1.6
+
+ kind-of@6.0.3: {}
+
+ lcid@2.0.0:
+ dependencies:
+ invert-kv: 2.0.0
+
lilconfig@3.1.3: {}
lines-and-columns@1.2.4: {}
@@ -2148,8 +4648,32 @@ snapshots:
dependencies:
uc.micro: 2.1.0
+ loader-runner@2.4.0: {}
+
+ loader-utils@1.4.2:
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 1.0.2
+
+ locate-path@2.0.0:
+ dependencies:
+ p-locate: 2.0.0
+ path-exists: 3.0.0
+
+ locate-path@3.0.0:
+ dependencies:
+ p-locate: 3.0.0
+ path-exists: 3.0.0
+
+ lodash@4.18.1: {}
+
lru-cache@11.2.4: {}
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
lucide-vue-next@0.446.0(vue@3.5.26(typescript@5.6.3)):
dependencies:
vue: 3.5.26(typescript@5.6.3)
@@ -2162,6 +4686,21 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ make-dir@2.1.0:
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.2
+
+ map-age-cleaner@0.1.3:
+ dependencies:
+ p-defer: 1.0.0
+
+ map-cache@0.2.2: {}
+
+ map-visit@1.0.0:
+ dependencies:
+ object-visit: 1.0.1
+
markdown-it-image-figures@2.1.1(markdown-it@14.1.0):
dependencies:
markdown-it: 14.1.0
@@ -2179,6 +4718,8 @@ snapshots:
punycode.js: 2.3.1
uc.micro: 2.1.0
+ math-intrinsics@1.1.0: {}
+
md-editor-v3@6.3.1(vue@3.5.26(typescript@5.6.3)):
dependencies:
'@codemirror/autocomplete': 6.20.0
@@ -2204,43 +4745,312 @@ snapshots:
vue: 3.5.26(typescript@5.6.3)
xss: 1.0.15
+ md5.js@1.3.5:
+ dependencies:
+ hash-base: 3.0.5
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
mdurl@2.0.0: {}
medium-zoom@1.1.0: {}
+ mem@4.3.0:
+ dependencies:
+ map-age-cleaner: 0.1.3
+ mimic-fn: 2.1.0
+ p-is-promise: 2.1.0
+
+ memory-fs@0.4.1:
+ dependencies:
+ errno: 0.1.8
+ readable-stream: 2.3.8
+
+ memory-fs@0.5.0:
+ dependencies:
+ errno: 0.1.8
+ readable-stream: 2.3.8
+
merge2@1.4.1: {}
+ micromatch@3.1.10:
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ extglob: 2.0.4
+ fragment-cache: 0.2.1
+ kind-of: 6.0.3
+ nanomatch: 1.2.13
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
+ miller-rabin@4.0.1:
+ dependencies:
+ bn.js: 4.12.4
+ brorand: 1.1.0
+
+ mimic-fn@1.2.0: {}
+
+ mimic-fn@2.1.0: {}
+
+ mini-css-extract-plugin@0.4.0(webpack@4.47.0):
+ dependencies:
+ loader-utils: 1.4.2
+ webpack: 4.47.0
+ webpack-sources: 1.4.3
+
+ minimalistic-assert@1.0.1: {}
+
+ minimalistic-crypto-utils@1.0.1: {}
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.15
+
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.2
+ minimist@1.2.8: {}
+
+ mississippi@3.0.0:
+ dependencies:
+ concat-stream: 1.6.2
+ duplexify: 3.7.1
+ end-of-stream: 1.4.5
+ flush-write-stream: 1.1.1
+ from2: 2.3.0
+ parallel-transform: 1.2.0
+ pump: 3.0.4
+ pumpify: 1.5.1
+ stream-each: 1.2.3
+ through2: 2.0.5
+
+ mixin-deep@1.3.2:
+ dependencies:
+ for-in: 1.0.2
+ is-extendable: 1.0.1
+
+ mkdirp@0.5.6:
+ dependencies:
+ minimist: 1.2.8
+
+ move-concurrently@1.0.1:
+ dependencies:
+ aproba: 1.2.0
+ copy-concurrently: 1.0.5
+ fs-write-stream-atomic: 1.0.10
+ mkdirp: 0.5.6
+ rimraf: 2.7.1
+ run-queue: 1.0.3
+
+ ms@2.0.0: {}
+
muggle-string@0.4.1: {}
+ mute-stream@0.0.7: {}
+
mz@2.7.0:
dependencies:
any-promise: 1.3.0
object-assign: 4.1.1
thenify-all: 1.6.0
+ nan@2.28.0:
+ optional: true
+
nanoid@3.3.11: {}
+ nanomatch@1.2.13:
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ fragment-cache: 0.2.1
+ is-windows: 1.0.2
+ kind-of: 6.0.3
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ neo-async@2.6.2: {}
+
+ nice-try@1.0.5: {}
+
+ node-libs-browser@2.2.1:
+ dependencies:
+ assert: 1.5.1
+ browserify-zlib: 0.2.0
+ buffer: 4.9.2
+ console-browserify: 1.2.0
+ constants-browserify: 1.0.0
+ crypto-browserify: 3.12.1
+ domain-browser: 1.2.0
+ events: 3.3.0
+ https-browserify: 1.0.0
+ os-browserify: 0.3.0
+ path-browserify: 0.0.1
+ process: 0.11.10
+ punycode: 1.4.1
+ querystring-es3: 0.2.1
+ readable-stream: 2.3.8
+ stream-browserify: 2.0.2
+ stream-http: 2.8.3
+ string_decoder: 1.3.0
+ timers-browserify: 2.0.12
+ tty-browserify: 0.0.0
+ url: 0.11.4
+ util: 0.11.1
+ vm-browserify: 1.1.2
+
node-releases@2.0.27: {}
+ normalize-path@2.1.1:
+ dependencies:
+ remove-trailing-separator: 1.1.0
+ optional: true
+
normalize-path@3.0.0: {}
+ npm-run-path@2.0.2:
+ dependencies:
+ path-key: 2.0.1
+
+ number-is-nan@1.0.1: {}
+
object-assign@4.1.1: {}
+ object-copy@0.1.0:
+ dependencies:
+ copy-descriptor: 0.1.1
+ define-property: 0.2.5
+ kind-of: 3.2.2
+
object-hash@3.0.0: {}
+ object-inspect@1.13.4: {}
+
+ object-keys@1.1.1: {}
+
+ object-visit@1.0.1:
+ dependencies:
+ isobject: 3.0.1
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.pick@1.3.0:
+ dependencies:
+ isobject: 3.0.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@2.0.1:
+ dependencies:
+ mimic-fn: 1.2.0
+
+ os-browserify@0.3.0: {}
+
+ os-locale@3.1.0:
+ dependencies:
+ execa: 1.0.0
+ lcid: 2.0.0
+ mem: 4.3.0
+
+ os-tmpdir@1.0.2: {}
+
+ p-defer@1.0.0: {}
+
+ p-finally@1.0.0: {}
+
+ p-is-promise@2.1.0: {}
+
+ p-limit@1.3.0:
+ dependencies:
+ p-try: 1.0.0
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-locate@2.0.0:
+ dependencies:
+ p-limit: 1.3.0
+
+ p-locate@3.0.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-try@1.0.0: {}
+
+ p-try@2.2.0: {}
+
+ pako@1.0.11: {}
+
+ parallel-transform@1.2.0:
+ dependencies:
+ cyclist: 1.0.2
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+
+ parse-asn1@5.1.9:
+ dependencies:
+ asn1.js: 4.10.1
+ browserify-aes: 1.2.0
+ evp_bytestokey: 1.0.3
+ pbkdf2: 3.1.6
+ safe-buffer: 5.2.1
+
+ pascalcase@0.1.1: {}
+
+ path-browserify@0.0.1: {}
+
path-browserify@1.0.1: {}
+ path-dirname@1.0.2:
+ optional: true
+
+ path-exists@3.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@2.0.1: {}
+
path-parse@1.0.7: {}
+ pbkdf2@3.1.6:
+ dependencies:
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ ripemd160: 2.0.3
+ safe-buffer: 5.2.1
+ sha.js: 2.4.12
+ to-buffer: 1.2.2
+
performance-now@2.1.0:
optional: true
@@ -2252,8 +5062,22 @@ snapshots:
pify@2.3.0: {}
+ pify@4.0.1: {}
+
pirates@4.0.7: {}
+ pkg-dir@2.0.0:
+ dependencies:
+ find-up: 2.1.0
+
+ pkg-dir@3.0.0:
+ dependencies:
+ find-up: 3.0.0
+
+ posix-character-classes@0.1.1: {}
+
+ possible-typed-array-names@1.1.0: {}
+
postcss-import@15.1.0(postcss@8.5.6):
dependencies:
postcss: 8.5.6
@@ -2291,8 +5115,56 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ process-nextick-args@2.0.1: {}
+
+ process@0.11.10: {}
+
+ promise-inflight@1.0.1(bluebird@3.7.2):
+ optionalDependencies:
+ bluebird: 3.7.2
+
+ promise-polyfill@8.0.0: {}
+
+ prr@1.0.1: {}
+
+ public-encrypt@4.0.3:
+ dependencies:
+ bn.js: 4.12.4
+ browserify-rsa: 4.1.1
+ create-hash: 1.2.0
+ parse-asn1: 5.1.9
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+
+ pump@2.0.1:
+ dependencies:
+ end-of-stream: 1.4.5
+ once: 1.4.0
+
+ pump@3.0.4:
+ dependencies:
+ end-of-stream: 1.4.5
+ once: 1.4.0
+
+ pumpify@1.5.1:
+ dependencies:
+ duplexify: 3.7.1
+ inherits: 2.0.4
+ pump: 2.0.1
+
punycode.js@2.3.1: {}
+ punycode@1.4.1: {}
+
+ punycode@2.3.1: {}
+
+ qs@6.15.3:
+ dependencies:
+ es-define-property: 1.0.1
+ side-channel: 1.1.1
+
+ querystring-es3@0.2.1: {}
+
queue-microtask@1.2.3: {}
raf@3.4.1:
@@ -2300,10 +5172,38 @@ snapshots:
performance-now: 2.1.0
optional: true
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ randomfill@1.0.4:
+ dependencies:
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+
read-cache@1.0.0:
dependencies:
pify: 2.3.0
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ readdirp@2.2.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ micromatch: 3.1.10
+ readable-stream: 2.3.8
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
@@ -2311,17 +5211,57 @@ snapshots:
regenerator-runtime@0.13.11:
optional: true
+ regex-not@1.0.2:
+ dependencies:
+ extend-shallow: 3.0.2
+ safe-regex: 1.1.0
+
+ remove-trailing-separator@1.1.0:
+ optional: true
+
+ repeat-element@1.1.4: {}
+
+ repeat-string@1.6.1: {}
+
+ require-directory@2.1.1: {}
+
+ require-main-filename@1.0.1: {}
+
+ resolve-cwd@2.0.0:
+ dependencies:
+ resolve-from: 3.0.0
+
+ resolve-from@3.0.0: {}
+
+ resolve-url@0.2.1: {}
+
resolve@1.22.11:
dependencies:
is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ restore-cursor@2.0.0:
+ dependencies:
+ onetime: 2.0.1
+ signal-exit: 3.0.7
+
+ ret@0.1.15: {}
+
reusify@1.1.0: {}
rgbcolor@1.0.1:
optional: true
+ rimraf@2.7.1:
+ dependencies:
+ glob: 7.2.3
+
+ ripemd160@2.0.3:
+ dependencies:
+ hash-base: 3.1.2
+ inherits: 2.0.4
+
rollup@4.55.1:
dependencies:
'@types/estree': 1.0.8
@@ -2353,15 +5293,219 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.55.1
fsevents: 2.3.3
+ run-async@2.4.1: {}
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
+ run-queue@1.0.3:
+ dependencies:
+ aproba: 1.2.0
+
+ rxjs@6.6.7:
+ dependencies:
+ tslib: 1.14.1
+
+ safe-buffer@5.1.2: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-regex@1.1.0:
+ dependencies:
+ ret: 0.1.15
+
+ safer-buffer@2.1.2: {}
+
+ schema-utils@1.0.0:
+ dependencies:
+ ajv: 6.15.0
+ ajv-errors: 1.0.1(ajv@6.15.0)
+ ajv-keywords: 3.5.2(ajv@6.15.0)
+
+ semver@5.7.2: {}
+
+ serialize-javascript@4.0.0:
+ dependencies:
+ randombytes: 2.1.0
+
+ set-blocking@2.0.0: {}
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-value@2.0.1:
+ dependencies:
+ extend-shallow: 2.0.1
+ is-extendable: 0.1.1
+ is-plain-object: 2.0.4
+ split-string: 3.1.0
+
+ setimmediate@1.0.5: {}
+
+ sha.js@2.4.12:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ to-buffer: 1.2.2
+
+ shebang-command@1.2.0:
+ dependencies:
+ shebang-regex: 1.0.0
+
+ shebang-regex@1.0.0: {}
+
+ side-channel-list@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.1
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ snapdragon-node@2.1.1:
+ dependencies:
+ define-property: 1.0.0
+ isobject: 3.0.1
+ snapdragon-util: 3.0.1
+
+ snapdragon-util@3.0.1:
+ dependencies:
+ kind-of: 3.2.2
+
+ snapdragon@0.8.2:
+ dependencies:
+ base: 0.11.2
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ map-cache: 0.2.2
+ source-map: 0.5.7
+ source-map-resolve: 0.5.3
+ use: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ source-list-map@2.0.1: {}
+
source-map-js@1.2.1: {}
+ source-map-resolve@0.5.3:
+ dependencies:
+ atob: 2.1.2
+ decode-uri-component: 0.2.2
+ resolve-url: 0.2.1
+ source-map-url: 0.4.1
+ urix: 0.1.0
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map-url@0.4.1: {}
+
+ source-map@0.5.7: {}
+
+ source-map@0.6.1: {}
+
+ split-string@3.1.0:
+ dependencies:
+ extend-shallow: 3.0.2
+
+ ssri@6.0.2:
+ dependencies:
+ figgy-pudding: 3.5.2
+
stackblur-canvas@2.7.0:
optional: true
+ static-extend@0.1.2:
+ dependencies:
+ define-property: 0.2.5
+ object-copy: 0.1.0
+
+ stream-browserify@2.0.2:
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+
+ stream-each@1.2.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ stream-shift: 1.0.3
+
+ stream-http@2.8.3:
+ dependencies:
+ builtin-status-codes: 3.0.0
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ to-arraybuffer: 1.0.1
+ xtend: 4.0.2
+
+ stream-shift@1.0.3: {}
+
+ string-width@1.0.2:
+ dependencies:
+ code-point-at: 1.1.0
+ is-fullwidth-code-point: 1.0.0
+ strip-ansi: 3.0.1
+
+ string-width@2.1.1:
+ dependencies:
+ is-fullwidth-code-point: 2.0.0
+ strip-ansi: 4.0.0
+
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@3.0.1:
+ dependencies:
+ ansi-regex: 2.1.1
+
+ strip-ansi@4.0.0:
+ dependencies:
+ ansi-regex: 3.0.1
+
+ strip-ansi@5.2.0:
+ dependencies:
+ ansi-regex: 4.1.1
+
+ strip-eof@1.0.0: {}
+
style-mod@4.1.3: {}
sucrase@3.35.1:
@@ -2374,6 +5518,10 @@ snapshots:
tinyglobby: 0.2.15
ts-interface-checker: 0.1.13
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
supports-preserve-symlinks-flag@1.0.0: {}
svg-pathdata@6.0.3:
@@ -2407,6 +5555,28 @@ snapshots:
- tsx
- yaml
+ tapable@1.1.3: {}
+
+ terser-webpack-plugin@1.4.6(webpack@4.47.0):
+ dependencies:
+ cacache: 12.0.4
+ find-cache-dir: 2.1.0
+ is-wsl: 1.1.0
+ schema-utils: 1.0.0
+ serialize-javascript: 4.0.0
+ source-map: 0.6.1
+ terser: 4.8.1
+ webpack: 4.47.0
+ webpack-sources: 1.4.3
+ worker-farm: 1.7.0
+
+ terser@4.8.1:
+ dependencies:
+ acorn: 8.17.0
+ commander: 2.20.3
+ source-map: 0.6.1
+ source-map-support: 0.5.21
+
text-segmentation@1.0.3:
dependencies:
utrie: 1.0.2
@@ -2419,35 +5589,132 @@ snapshots:
dependencies:
any-promise: 1.3.0
+ through2@2.0.5:
+ dependencies:
+ readable-stream: 2.3.8
+ xtend: 4.0.2
+
+ through@2.3.8: {}
+
+ timers-browserify@2.0.12:
+ dependencies:
+ setimmediate: 1.0.5
+
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
+ to-arraybuffer@1.0.1: {}
+
+ to-buffer@1.2.2:
+ dependencies:
+ isarray: 2.0.5
+ safe-buffer: 5.2.1
+ typed-array-buffer: 1.0.3
+
+ to-object-path@0.3.0:
+ dependencies:
+ kind-of: 3.2.2
+
+ to-regex-range@2.1.1:
+ dependencies:
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
+ to-regex@3.0.2:
+ dependencies:
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ regex-not: 1.0.2
+ safe-regex: 1.1.0
+
ts-interface-checker@0.1.13: {}
+ tslib@1.14.1: {}
+
tslib@2.3.0: {}
+ tty-browserify@0.0.0: {}
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typedarray@0.0.6: {}
+
typescript@5.6.3: {}
uc.micro@2.1.0: {}
+ union-value@1.0.1:
+ dependencies:
+ arr-union: 3.1.0
+ get-value: 2.0.6
+ is-extendable: 0.1.1
+ set-value: 2.0.1
+
+ unique-filename@1.1.1:
+ dependencies:
+ unique-slug: 2.0.2
+
+ unique-slug@2.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+
+ unset-value@1.0.0:
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+
+ upath@1.2.0:
+ optional: true
+
update-browserslist-db@1.2.3(browserslist@4.28.1):
dependencies:
browserslist: 4.28.1
escalade: 3.2.0
picocolors: 1.1.1
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ urix@0.1.0: {}
+
+ url@0.11.4:
+ dependencies:
+ punycode: 1.4.1
+ qs: 6.15.3
+
+ use@3.1.1: {}
+
util-deprecate@1.0.2: {}
+ util@0.10.4:
+ dependencies:
+ inherits: 2.0.3
+
+ util@0.11.1:
+ dependencies:
+ inherits: 2.0.3
+
utrie@1.0.2:
dependencies:
base64-arraybuffer: 1.0.2
+ v8-compile-cache@2.4.0: {}
+
vite@6.4.1(jiti@1.21.7):
dependencies:
esbuild: 0.25.12
@@ -2460,6 +5727,8 @@ snapshots:
fsevents: 2.3.3
jiti: 1.21.7
+ vm-browserify@1.1.2: {}
+
vscode-uri@3.1.0: {}
vue-echarts@8.0.1(echarts@6.0.0)(vue@3.5.26(typescript@5.6.3)):
@@ -2490,11 +5759,130 @@ snapshots:
w3c-keyname@2.2.8: {}
+ watchpack-chokidar2@2.0.1:
+ dependencies:
+ chokidar: 2.1.8
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ watchpack@1.7.5:
+ dependencies:
+ graceful-fs: 4.2.11
+ neo-async: 2.6.2
+ optionalDependencies:
+ chokidar: 3.6.0
+ watchpack-chokidar2: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ webpack-cli@3.0.4(webpack@4.47.0):
+ dependencies:
+ chalk: 2.4.2
+ cross-spawn: 6.0.6
+ enhanced-resolve: 4.5.0
+ global-modules-path: 2.3.1
+ import-local: 1.0.0
+ inquirer: 6.5.2
+ interpret: 1.4.0
+ loader-utils: 1.4.2
+ supports-color: 5.5.0
+ v8-compile-cache: 2.4.0
+ webpack: 4.47.0
+ yargs: 11.1.1
+
+ webpack-sources@1.4.3:
+ dependencies:
+ source-list-map: 2.0.1
+ source-map: 0.6.1
+
+ webpack@4.47.0:
+ dependencies:
+ '@webassemblyjs/ast': 1.9.0
+ '@webassemblyjs/helper-module-context': 1.9.0
+ '@webassemblyjs/wasm-edit': 1.9.0
+ '@webassemblyjs/wasm-parser': 1.9.0
+ acorn: 6.4.2
+ ajv: 6.15.0
+ ajv-keywords: 3.5.2(ajv@6.15.0)
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 4.5.0
+ eslint-scope: 4.0.3
+ json-parse-better-errors: 1.0.2
+ loader-runner: 2.4.0
+ loader-utils: 1.4.2
+ memory-fs: 0.4.1
+ micromatch: 3.1.10
+ mkdirp: 0.5.6
+ neo-async: 2.6.2
+ node-libs-browser: 2.2.1
+ schema-utils: 1.0.0
+ tapable: 1.1.3
+ terser-webpack-plugin: 1.4.6(webpack@4.47.0)
+ watchpack: 1.7.5
+ webpack-sources: 1.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ which-module@2.0.1: {}
+
+ which-typed-array@1.1.22:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@1.3.1:
+ dependencies:
+ isexe: 2.0.0
+
+ worker-farm@1.7.0:
+ dependencies:
+ errno: 0.1.8
+
+ wrap-ansi@2.1.0:
+ dependencies:
+ string-width: 1.0.2
+ strip-ansi: 3.0.1
+
+ wrappy@1.0.2: {}
+
xss@1.0.15:
dependencies:
commander: 2.20.3
cssfilter: 0.0.10
+ xtend@4.0.2: {}
+
+ y18n@3.2.2: {}
+
+ y18n@4.0.3: {}
+
+ yallist@3.1.1: {}
+
+ yargs-parser@9.0.2:
+ dependencies:
+ camelcase: 4.1.0
+
+ yargs@11.1.1:
+ dependencies:
+ cliui: 4.1.0
+ decamelize: 1.2.0
+ find-up: 2.1.0
+ get-caller-file: 1.0.3
+ os-locale: 3.1.0
+ require-directory: 2.1.1
+ require-main-filename: 1.0.1
+ set-blocking: 2.0.0
+ string-width: 2.1.1
+ which-module: 2.0.1
+ y18n: 3.2.2
+ yargs-parser: 9.0.2
+
zrender@6.0.0:
dependencies:
tslib: 2.3.0
diff --git a/client/src/App.vue b/client/src/App.vue
index 5bfb2d4..9b6a4da 100644
--- a/client/src/App.vue
+++ b/client/src/App.vue
@@ -5,7 +5,7 @@
in child components (like BlogDetail TOC) because it changes the
scrolling context.
-->
-
+
@@ -24,7 +24,7 @@
@@ -69,10 +69,12 @@ const isAdminOrLogin = computed(() => {
return path.startsWith('/admin') || path === '/login'
})
-// Check if current route is Admin or Login page
-const isAdminOrLoginOrBlog = computed(() => {
+// 全宽布局页面(不受 max-w-7xl 限制)
+const isFullWidthPage = computed(() => {
const path = route.path
- return path.startsWith('/admin') || path === '/login' || path.startsWith('/blog/')
+ return path.startsWith('/admin') || path === '/login'
+ || path.startsWith('/blog/')
+ || path.startsWith('/works/')
})
// 应用网站配置到页面标题和meta标签
diff --git a/client/src/components/DPlayerModal.vue b/client/src/components/DPlayerModal.vue
new file mode 100644
index 0000000..e16535e
--- /dev/null
+++ b/client/src/components/DPlayerModal.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
{{ title }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/src/components/Header.vue b/client/src/components/Header.vue
index bb68e2d..b0bf878 100644
--- a/client/src/components/Header.vue
+++ b/client/src/components/Header.vue
@@ -42,6 +42,14 @@
>
作品
+
+
+
+
@@ -153,6 +165,7 @@ import { useRoute, useRouter } from 'vue-router'
import { fetchWork, Work } from '../services/api'
import { useScrollAnimation } from '../composables/useScrollAnimation'
import Icon from '../components/Icon.vue'
+import DPlayerModal from '../components/DPlayerModal.vue'
const route = useRoute()
const router = useRouter()
@@ -173,6 +186,7 @@ const work = ref({
const loading = ref(true)
const error = ref('')
+const videoModalOpen = ref(false)
const { initObserver } = useScrollAnimation()
diff --git a/client/src/pages/Works.vue b/client/src/pages/Works.vue
index 3d46c0e..4ef28f4 100644
--- a/client/src/pages/Works.vue
+++ b/client/src/pages/Works.vue
@@ -1,7 +1,6 @@
diff --git a/client/src/pages/admin/VideoAlbumForm.vue b/client/src/pages/admin/VideoAlbumForm.vue
new file mode 100644
index 0000000..87e36b8
--- /dev/null
+++ b/client/src/pages/admin/VideoAlbumForm.vue
@@ -0,0 +1,84 @@
+
+
+
+
{{ isEditing ? '编辑视频专辑' : '新建视频专辑' }}
+
+ 取消
+ {{ submitting ? '提交中...' : '保存' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/src/pages/admin/VideoAlbums.vue b/client/src/pages/admin/VideoAlbums.vue
new file mode 100644
index 0000000..72be4e5
--- /dev/null
+++ b/client/src/pages/admin/VideoAlbums.vue
@@ -0,0 +1,52 @@
+
+
+
+
视频专辑
+ + 新建专辑
+
+
+
+
+ | ID | 名称 | 分类 | 视频数 | 状态 | 操作 |
+
+
+
+ | #{{ item.id }} |
+ {{ item.name }} |
+ {{ item.categoryName || '-' }} |
+ {{ item.videoCount ?? 0 }} |
+ {{ item.isActive ? '启用' : '禁用' }} |
+
+ 编辑
+ 删除
+ |
+
+
+
+
+
+
+
+
diff --git a/client/src/pages/admin/VideoCategories.vue b/client/src/pages/admin/VideoCategories.vue
new file mode 100644
index 0000000..202d91b
--- /dev/null
+++ b/client/src/pages/admin/VideoCategories.vue
@@ -0,0 +1,52 @@
+
+
+
+
视频分类
+ + 新建分类
+
+
+
+
+ | ID | 名称 | Slug | 排序 | 操作 |
+
+
+
+ | #{{ item.id }} |
+ {{ item.name }} |
+ {{ item.slug }} |
+ {{ item.sortOrder }} |
+
+ 编辑
+ 删除
+ |
+
+
+
+
暂无分类
+
+
+
+
+
diff --git a/client/src/pages/admin/VideoCategoryForm.vue b/client/src/pages/admin/VideoCategoryForm.vue
new file mode 100644
index 0000000..eca88d3
--- /dev/null
+++ b/client/src/pages/admin/VideoCategoryForm.vue
@@ -0,0 +1,54 @@
+
+
+
+
{{ isEditing ? '编辑视频分类' : '新建视频分类' }}
+
+ 取消
+ {{ submitting ? '提交中...' : '保存' }}
+
+
+
+
+
+
+
diff --git a/client/src/pages/admin/VideoForm.vue b/client/src/pages/admin/VideoForm.vue
new file mode 100644
index 0000000..3826af4
--- /dev/null
+++ b/client/src/pages/admin/VideoForm.vue
@@ -0,0 +1,67 @@
+
+
+
+
{{ isEditing ? '编辑视频' : '新建视频' }}
+
+ 取消
+ {{ submitting ? '提交中...' : '保存' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/src/pages/admin/Videos.vue b/client/src/pages/admin/Videos.vue
new file mode 100644
index 0000000..0eb0df8
--- /dev/null
+++ b/client/src/pages/admin/Videos.vue
@@ -0,0 +1,51 @@
+
+
+
+
视频管理
+ + 新建视频
+
+
+
+
+ | 标题 | 分类 | 状态 | 创建时间 | 操作 |
+
+
+
+ | {{ item.title }} |
+ {{ item.categoryName || '-' }} |
+ {{ item.isPublished ? '已发布' : '草稿' }} |
+ {{ item.createdAt }} |
+
+ 编辑
+ 删除
+ |
+
+
+
+
+
+
+
+
diff --git a/client/src/pages/admin/WorkForm.vue b/client/src/pages/admin/WorkForm.vue
index e248259..7fc8584 100644
--- a/client/src/pages/admin/WorkForm.vue
+++ b/client/src/pages/admin/WorkForm.vue
@@ -63,6 +63,32 @@
{{ errors.heroImg }}
+
+
+
@@ -233,6 +259,12 @@
+
+
@@ -242,6 +274,9 @@ import { useRouter, useRoute } from 'vue-router'
import { useToast } from '../../composables/useToast'
import { createWork, updateWork, fetchWork } from '../../services/api'
import ImageUpload from '../../components/admin/ImageUpload.vue'
+import VideoUpload from '../../components/admin/VideoUpload.vue'
+import VideoPickerModal from '../../components/admin/VideoPickerModal.vue'
+import type { VideoItem } from '../../services/api'
const router = useRouter()
const route = useRoute()
@@ -251,6 +286,23 @@ const toast = useToast()
const isSubmitting = ref(false)
const isEditing = computed(() => !!route.params.id)
const errors = reactive>({})
+/** 视频来源:upload 独立上传 / library 视频库 */
+const videoSource = ref<'upload' | 'library'>('upload')
+const showVideoPicker = ref(false)
+const selectedVideoTitle = ref('')
+
+/** 从视频库选择后回调 */
+const handleVideoPick = (video: VideoItem) => {
+ form.videoId = video.id
+ form.heroVideo = ''
+ selectedVideoTitle.value = video.title
+}
+
+/** 清除视频库选择 */
+const clearLibraryVideo = () => {
+ form.videoId = ''
+ selectedVideoTitle.value = ''
+}
// Form data
const form = reactive({
@@ -258,6 +310,8 @@ const form = reactive({
category: '',
year: '',
heroImg: '',
+ heroVideo: '',
+ videoId: '',
desc: '',
techStack: [] as { category: string; items: string[] }[],
gallery: [] as string[],
@@ -365,6 +419,13 @@ const handleSubmit = async () => {
isSubmitting.value = true
try {
+ // 互斥:上传与视频库二选一
+ if (videoSource.value === 'upload') {
+ form.videoId = ''
+ } else {
+ form.heroVideo = ''
+ }
+
if (isEditing.value) {
// Update existing work
await updateWork(route.params.id as string, form)
@@ -401,6 +462,14 @@ onMounted(async () => {
form.category = work.category
form.year = work.year
form.heroImg = work.heroImg
+ form.heroVideo = work.heroVideo || ''
+ form.videoId = work.videoId || ''
+ if (form.videoId) {
+ videoSource.value = 'library'
+ selectedVideoTitle.value = form.videoId
+ } else if (form.heroVideo) {
+ videoSource.value = 'upload'
+ }
form.desc = work.desc
form.techStack = work.techStack || []
form.gallery = work.gallery || []
diff --git a/client/src/router.ts b/client/src/router.ts
index aef5939..7bbb48f 100644
--- a/client/src/router.ts
+++ b/client/src/router.ts
@@ -73,6 +73,9 @@ const routes = [
{ path: '/columns/:id', name: 'column-detail', component: () => import('./pages/ColumnDetail.vue'), meta: { title: '', dynamic: true } },
{ path: '/works', name: 'works', component: () => import('./pages/Works.vue'), meta: { title: '作品' } },
{ path: '/works/:id', name: 'work-detail', component: () => import('./pages/WorkDetail.vue'), meta: { title: '', dynamic: true } },
+ { path: '/videos', name: 'videos', component: () => import('./pages/Videos.vue'), meta: { title: '视频' } },
+ { path: '/videos/albums/:id', name: 'video-album-detail', component: () => import('./pages/VideoAlbumDetail.vue'), meta: { title: '', dynamic: true } },
+ { path: '/videos/:id', name: 'video-detail', component: () => import('./pages/VideoDetail.vue'), meta: { title: '', dynamic: true } },
{ path: '/snippets', name: 'snippets', component: () => import('./pages/Snippets.vue'), meta: { title: '代码' } },
{ path: '/services', name: 'services', component: () => import('./pages/Services.vue'), meta: { title: '合作' } },
{ path: '/about', name: 'about', component: () => import('./pages/About.vue'), meta: { title: '关于' } },
@@ -121,6 +124,17 @@ const routes = [
{ path: 'works', name: 'admin-works', component: () => import('./pages/admin/Works.vue') },
{ path: 'works/create', name: 'admin-works-create', component: () => import('./pages/admin/WorkForm.vue') },
{ path: 'works/:id/edit', name: 'admin-works-edit', component: () => import('./pages/admin/WorkForm.vue') },
+
+ // 视频管理
+ { path: 'video-categories', name: 'admin-video-categories', component: () => import('./pages/admin/VideoCategories.vue') },
+ { path: 'video-categories/create', name: 'admin-video-categories-create', component: () => import('./pages/admin/VideoCategoryForm.vue') },
+ { path: 'video-categories/:id/edit', name: 'admin-video-categories-edit', component: () => import('./pages/admin/VideoCategoryForm.vue') },
+ { path: 'video-albums', name: 'admin-video-albums', component: () => import('./pages/admin/VideoAlbums.vue') },
+ { path: 'video-albums/create', name: 'admin-video-albums-create', component: () => import('./pages/admin/VideoAlbumForm.vue') },
+ { path: 'video-albums/:id/edit', name: 'admin-video-albums-edit', component: () => import('./pages/admin/VideoAlbumForm.vue') },
+ { path: 'videos', name: 'admin-videos', component: () => import('./pages/admin/Videos.vue') },
+ { path: 'videos/create', name: 'admin-videos-create', component: () => import('./pages/admin/VideoForm.vue') },
+ { path: 'videos/:id/edit', name: 'admin-videos-edit', component: () => import('./pages/admin/VideoForm.vue') },
// 代码片段管理
{ path: 'snippets', name: 'admin-snippets', component: () => import('./pages/admin/Snippets.vue') },
diff --git a/client/src/services/api.ts b/client/src/services/api.ts
index 469775a..3ea41c7 100644
--- a/client/src/services/api.ts
+++ b/client/src/services/api.ts
@@ -136,6 +136,9 @@ export interface Work {
category: string
year: string
heroImg: string
+ heroVideo?: string
+ videoId?: string
+ videoUrl?: string
desc: string
techStack: { category: string; items: string[] }[]
gallery: string[]
@@ -143,6 +146,48 @@ export interface Work {
next: string
}
+// 视频模块类型
+export interface VideoCategory {
+ id: number
+ name: string
+ slug: string
+ description: string
+ sortOrder: number
+ createdAt: string
+ updatedAt: string
+ videoCount?: number
+ albumCount?: number
+}
+
+export interface VideoAlbum {
+ id: number
+ name: string
+ description: string
+ cover: string
+ categoryId: number
+ categoryName?: string
+ isActive: number
+ sortOrder: number
+ createdAt: string
+ updatedAt: string
+ videoCount?: number
+}
+
+export interface VideoItem {
+ id: string
+ title: string
+ description: string
+ videoUrl: string
+ cover: string
+ poster: string
+ categoryId: number
+ categoryName?: string
+ duration: number
+ isPublished: number
+ createdAt: string
+ updatedAt: string
+}
+
// 分类相关类型
export interface Category {
id: number
@@ -2064,3 +2109,131 @@ export const deleteAttachmentCategory = async (id: number): Promise => {
throw error
}
}
+
+// ========== 视频模块 API ==========
+
+export const fetchVideoCategories = async (): Promise => {
+ const result = await fetchJson(`${API_BASE}/video-categories`)
+ return Array.isArray(result) ? result : []
+}
+
+export const fetchVideoAlbums = async (categoryId?: number): Promise => {
+ const q = categoryId ? `?categoryId=${categoryId}` : ''
+ const result = await fetchJson(`${API_BASE}/video-albums${q}`)
+ return Array.isArray(result) ? result : []
+}
+
+export const fetchVideoAlbum = async (id: number): Promise => {
+ const result = await fetchJson(`${API_BASE}/video-albums/${id}`)
+ if (!result) throw new Error('Album not found')
+ return result
+}
+
+export const fetchAlbumVideos = async (albumId: number): Promise => {
+ const result = await fetchJson(`${API_BASE}/video-albums/${albumId}/videos`)
+ return Array.isArray(result) ? result : []
+}
+
+export const fetchVideos = async (categoryId?: number): Promise => {
+ const q = categoryId ? `?categoryId=${categoryId}` : ''
+ const result = await fetchJson(`${API_BASE}/videos${q}`)
+ return Array.isArray(result) ? result : []
+}
+
+export const fetchVideo = async (id: string): Promise => {
+ const result = await fetchJson(`${API_BASE}/videos/${id}`)
+ if (!result) throw new Error('Video not found')
+ return result
+}
+
+export const getAdminVideoCategories = async (): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/video-categories`, { headers: getAuthHeaders() })
+ const result = await parseApiResponse(response)
+ return Array.isArray(result) ? result : []
+}
+
+export const createVideoCategory = async (data: Partial): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/video-categories`, {
+ method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(data),
+ })
+ return await parseApiResponse(response)
+}
+
+export const updateVideoCategory = async (id: number, data: Partial): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/video-categories/${id}`, {
+ method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(data),
+ })
+ return await parseApiResponse(response)
+}
+
+export const deleteVideoCategory = async (id: number): Promise => {
+ await parseApiResponse(await authFetch(`${API_BASE}/admin/video-categories/${id}`, {
+ method: 'DELETE', headers: getAuthHeaders(),
+ }))
+}
+
+export const getAdminVideoAlbums = async (categoryId?: number): Promise => {
+ const q = categoryId ? `?categoryId=${categoryId}` : ''
+ const response = await authFetch(`${API_BASE}/admin/video-albums${q}`, { headers: getAuthHeaders() })
+ const result = await parseApiResponse(response)
+ return Array.isArray(result) ? result : []
+}
+
+export const createVideoAlbum = async (data: Partial & { videoIds?: string[] }): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/video-albums`, {
+ method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(data),
+ })
+ return await parseApiResponse(response)
+}
+
+export const updateVideoAlbum = async (id: number, data: Partial & { videoIds?: string[] }): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/video-albums/${id}`, {
+ method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(data),
+ })
+ return await parseApiResponse(response)
+}
+
+export const deleteVideoAlbum = async (id: number): Promise => {
+ await parseApiResponse(await authFetch(`${API_BASE}/admin/video-albums/${id}`, {
+ method: 'DELETE', headers: getAuthHeaders(),
+ }))
+}
+
+export const getAlbumVideoIds = async (albumId: number): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/video-albums/${albumId}/video-ids`, { headers: getAuthHeaders() })
+ const result = await parseApiResponse(response)
+ return Array.isArray(result) ? result : []
+}
+
+export const getAdminVideos = async (categoryId?: number): Promise => {
+ const q = categoryId ? `?categoryId=${categoryId}` : ''
+ const response = await authFetch(`${API_BASE}/admin/videos${q}`, { headers: getAuthHeaders() })
+ const result = await parseApiResponse(response)
+ return Array.isArray(result) ? result : []
+}
+
+export const getAdminVideo = async (id: string): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/videos/${id}`, { headers: getAuthHeaders() })
+ return await parseApiResponse(response)
+}
+
+export const createVideo = async (data: Partial): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/videos`, {
+ method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(data),
+ })
+ return await parseApiResponse(response)
+}
+
+export const updateVideo = async (id: string, data: Partial): Promise => {
+ const response = await authFetch(`${API_BASE}/admin/videos/${id}`, {
+ method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(data),
+ })
+ return await parseApiResponse(response)
+}
+
+export const deleteVideo = async (id: string): Promise => {
+ await parseApiResponse(await authFetch(`${API_BASE}/admin/videos/${id}`, {
+ method: 'DELETE', headers: getAuthHeaders(),
+ }))
+}
+
diff --git a/client/src/types/dplayer.d.ts b/client/src/types/dplayer.d.ts
new file mode 100644
index 0000000..cc74e21
--- /dev/null
+++ b/client/src/types/dplayer.d.ts
@@ -0,0 +1,17 @@
+declare module 'dplayer' {
+ interface DPlayerVideoOptions {
+ url: string
+ pic?: string
+ }
+ interface DPlayerOptions {
+ container: HTMLElement
+ video: DPlayerVideoOptions
+ autoplay?: boolean
+ theme?: string
+ lang?: string
+ }
+ export default class DPlayer {
+ constructor(options: DPlayerOptions)
+ destroy(): void
+ }
+}
diff --git a/server/handlers/video.go b/server/handlers/video.go
new file mode 100644
index 0000000..db1ceec
--- /dev/null
+++ b/server/handlers/video.go
@@ -0,0 +1,335 @@
+package handlers
+
+import (
+ "strconv"
+ "time"
+
+ "github.com/gin-gonic/gin"
+ "github.com/niangaodev/art-code/models"
+ "github.com/niangaodev/art-code/repositories"
+ "github.com/niangaodev/art-code/utils"
+)
+
+// ========== 公开 API ==========
+
+// GetVideoCategories 获取视频分类列表
+func GetVideoCategories(c *gin.Context) {
+ list, err := repositories.GetVideoCategories()
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoCategoriesResponse(list))
+}
+
+// GetVideoAlbums 获取视频专辑列表
+func GetVideoAlbums(c *gin.Context) {
+ categoryID, _ := strconv.ParseUint(c.Query("categoryId"), 10, 32)
+ list, err := repositories.GetActiveVideoAlbums(uint(categoryID))
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoAlbumsResponse(list))
+}
+
+// GetVideoAlbumByID 获取专辑详情
+func GetVideoAlbumByID(c *gin.Context) {
+ id, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid album ID")
+ return
+ }
+ album, err := repositories.GetVideoAlbumByID(uint(id))
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ if album == nil || album.IsActive != 1 {
+ utils.Error(c, 404, "Album not found")
+ return
+ }
+ utils.Success(c, repositories.BuildVideoAlbumResponse(album))
+}
+
+// GetAlbumVideos 获取专辑内视频
+func GetAlbumVideos(c *gin.Context) {
+ id, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid album ID")
+ return
+ }
+ list, err := repositories.GetVideosByAlbumID(uint(id), true)
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideosResponse(list))
+}
+
+// GetVideos 获取视频列表
+func GetVideos(c *gin.Context) {
+ categoryID, _ := strconv.ParseUint(c.Query("categoryId"), 10, 32)
+ list, err := repositories.GetVideos(uint(categoryID), true)
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideosResponse(list))
+}
+
+// GetVideoByID 获取视频详情
+func GetVideoByID(c *gin.Context) {
+ id := c.Param("id")
+ video, err := repositories.GetVideoByID(id)
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ if video == nil || video.IsPublished != 1 {
+ utils.Error(c, 404, "Video not found")
+ return
+ }
+ utils.Success(c, repositories.BuildVideoResponse(video))
+}
+
+// ========== 管理 API — 分类 ==========
+
+func AdminGetVideoCategories(c *gin.Context) {
+ list, err := repositories.GetVideoCategories()
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoCategoriesResponse(list))
+}
+
+func AdminCreateVideoCategory(c *gin.Context) {
+ var item models.VideoCategory
+ if err := c.ShouldBindJSON(&item); err != nil {
+ utils.Error(c, 400, err.Error())
+ return
+ }
+ if err := repositories.CreateVideoCategory(&item); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoCategoryResponse(&item))
+}
+
+func AdminUpdateVideoCategory(c *gin.Context) {
+ id, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid category ID")
+ return
+ }
+ var item models.VideoCategory
+ if err := c.ShouldBindJSON(&item); err != nil {
+ utils.Error(c, 400, err.Error())
+ return
+ }
+ item.ID = uint(id)
+ if err := repositories.UpdateVideoCategory(&item); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoCategoryResponse(&item))
+}
+
+func AdminDeleteVideoCategory(c *gin.Context) {
+ id, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid category ID")
+ return
+ }
+ if err := repositories.DeleteVideoCategory(uint(id)); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.SuccessWithMsg(c, "Category deleted", nil)
+}
+
+// ========== 管理 API — 专辑 ==========
+
+func AdminGetVideoAlbums(c *gin.Context) {
+ categoryID, _ := strconv.ParseUint(c.Query("categoryId"), 10, 32)
+ list, err := repositories.GetVideoAlbums(uint(categoryID))
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoAlbumsResponse(list))
+}
+
+func AdminCreateVideoAlbum(c *gin.Context) {
+ var item models.VideoAlbum
+ if err := c.ShouldBindJSON(&item); err != nil {
+ utils.Error(c, 400, err.Error())
+ return
+ }
+ if err := repositories.CreateVideoAlbum(&item); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoAlbumResponse(&item))
+}
+
+func AdminUpdateVideoAlbum(c *gin.Context) {
+ id, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid album ID")
+ return
+ }
+ var req struct {
+ models.VideoAlbum
+ VideoIDs []string `json:"videoIds"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ utils.Error(c, 400, err.Error())
+ return
+ }
+ req.VideoAlbum.ID = uint(id)
+ if err := repositories.UpdateVideoAlbum(&req.VideoAlbum); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ if req.VideoIDs != nil {
+ if err := repositories.SyncAlbumVideos(uint(id), req.VideoIDs); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ }
+ utils.Success(c, repositories.BuildVideoAlbumResponse(&req.VideoAlbum))
+}
+
+func AdminDeleteVideoAlbum(c *gin.Context) {
+ id, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid album ID")
+ return
+ }
+ if err := repositories.DeleteVideoAlbum(uint(id)); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.SuccessWithMsg(c, "Album deleted", nil)
+}
+
+func AdminAddVideoToAlbum(c *gin.Context) {
+ albumID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid album ID")
+ return
+ }
+ var req struct {
+ VideoID string `json:"videoId"`
+ SortOrder uint `json:"sortOrder"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ utils.Error(c, 400, err.Error())
+ return
+ }
+ if err := repositories.AddVideoToAlbum(uint(albumID), req.VideoID, req.SortOrder); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.SuccessWithMsg(c, "Video added to album", nil)
+}
+
+func AdminRemoveVideoFromAlbum(c *gin.Context) {
+ albumID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid album ID")
+ return
+ }
+ videoID := c.Param("videoId")
+ if err := repositories.RemoveVideoFromAlbum(uint(albumID), videoID); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.SuccessWithMsg(c, "Video removed from album", nil)
+}
+
+func AdminGetAlbumVideoIDs(c *gin.Context) {
+ albumID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ utils.Error(c, 400, "Invalid album ID")
+ return
+ }
+ videos, err := repositories.GetVideosByAlbumID(uint(albumID), false)
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ ids := make([]string, 0, len(videos))
+ for _, v := range videos {
+ ids = append(ids, v.ID)
+ }
+ utils.Success(c, ids)
+}
+
+// ========== 管理 API — 视频 ==========
+
+func AdminGetVideos(c *gin.Context) {
+ categoryID, _ := strconv.ParseUint(c.Query("categoryId"), 10, 32)
+ list, err := repositories.GetVideos(uint(categoryID), false)
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideosResponse(list))
+}
+
+func AdminCreateVideo(c *gin.Context) {
+ var item models.Video
+ if err := c.ShouldBindJSON(&item); err != nil {
+ utils.Error(c, 400, err.Error())
+ return
+ }
+ if item.ID == "" {
+ item.ID = "video_" + strconv.FormatInt(time.Now().UnixNano(), 10)
+ }
+ if err := repositories.CreateVideo(&item); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoResponse(&item))
+}
+
+func AdminUpdateVideo(c *gin.Context) {
+ id := c.Param("id")
+ var item models.Video
+ if err := c.ShouldBindJSON(&item); err != nil {
+ utils.Error(c, 400, err.Error())
+ return
+ }
+ item.ID = id
+ if err := repositories.UpdateVideo(&item); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.Success(c, repositories.BuildVideoResponse(&item))
+}
+
+func AdminDeleteVideo(c *gin.Context) {
+ id := c.Param("id")
+ if err := repositories.DeleteVideo(id); err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ utils.SuccessWithMsg(c, "Video deleted", nil)
+}
+
+func AdminGetVideoByID(c *gin.Context) {
+ id := c.Param("id")
+ video, err := repositories.GetVideoByID(id)
+ if err != nil {
+ utils.ServerError(c, err)
+ return
+ }
+ if video == nil {
+ utils.Error(c, 404, "Video not found")
+ return
+ }
+ utils.Success(c, repositories.BuildVideoResponse(video))
+}
diff --git a/server/main.go b/server/main.go
index ff74de6..88e783e 100644
--- a/server/main.go
+++ b/server/main.go
@@ -27,6 +27,7 @@ func main() {
repositories.MigratePostUserID()
repositories.MigrateUserAvatar()
repositories.MigrateUserProfileFields()
+ repositories.MigrateVideoModule()
// 初始化ip2region (如果文件不存在,将降级为普通IP记录)
// 函数会自动从环境变量或可执行文件目录查找 ip2region.xdb
@@ -59,6 +60,14 @@ func main() {
api.GET("/works", handlers.GetWorks)
api.GET("/works/:id", handlers.GetWorkByID)
+ // 视频路由
+ api.GET("/video-categories", handlers.GetVideoCategories)
+ api.GET("/video-albums", handlers.GetVideoAlbums)
+ api.GET("/video-albums/:id", handlers.GetVideoAlbumByID)
+ api.GET("/video-albums/:id/videos", handlers.GetAlbumVideos)
+ api.GET("/videos", handlers.GetVideos)
+ api.GET("/videos/:id", handlers.GetVideoByID)
+
// 博客路由
api.GET("/posts", handlers.GetPosts)
api.GET("/posts/:id", handlers.GetPost)
@@ -146,6 +155,26 @@ func main() {
authAdmin.PUT("/works/:id", middleware.PermissionMiddleware("works", "update"), handlers.AdminUpdateWork)
authAdmin.DELETE("/works/:id", middleware.PermissionMiddleware("works", "delete"), handlers.AdminDeleteWork)
+ // 视频管理
+ authAdmin.GET("/video-categories", middleware.PermissionMiddleware("videos", "read"), handlers.AdminGetVideoCategories)
+ authAdmin.POST("/video-categories", middleware.PermissionMiddleware("videos", "create"), handlers.AdminCreateVideoCategory)
+ authAdmin.PUT("/video-categories/:id", middleware.PermissionMiddleware("videos", "update"), handlers.AdminUpdateVideoCategory)
+ authAdmin.DELETE("/video-categories/:id", middleware.PermissionMiddleware("videos", "delete"), handlers.AdminDeleteVideoCategory)
+
+ authAdmin.GET("/video-albums", middleware.PermissionMiddleware("videos", "read"), handlers.AdminGetVideoAlbums)
+ authAdmin.POST("/video-albums", middleware.PermissionMiddleware("videos", "create"), handlers.AdminCreateVideoAlbum)
+ authAdmin.PUT("/video-albums/:id", middleware.PermissionMiddleware("videos", "update"), handlers.AdminUpdateVideoAlbum)
+ authAdmin.DELETE("/video-albums/:id", middleware.PermissionMiddleware("videos", "delete"), handlers.AdminDeleteVideoAlbum)
+ authAdmin.GET("/video-albums/:id/video-ids", middleware.PermissionMiddleware("videos", "read"), handlers.AdminGetAlbumVideoIDs)
+ authAdmin.POST("/video-albums/:id/videos", middleware.PermissionMiddleware("videos", "update"), handlers.AdminAddVideoToAlbum)
+ authAdmin.DELETE("/video-albums/:id/videos/:videoId", middleware.PermissionMiddleware("videos", "update"), handlers.AdminRemoveVideoFromAlbum)
+
+ authAdmin.GET("/videos", middleware.PermissionMiddleware("videos", "read"), handlers.AdminGetVideos)
+ authAdmin.GET("/videos/:id", middleware.PermissionMiddleware("videos", "read"), handlers.AdminGetVideoByID)
+ authAdmin.POST("/videos", middleware.PermissionMiddleware("videos", "create"), handlers.AdminCreateVideo)
+ authAdmin.PUT("/videos/:id", middleware.PermissionMiddleware("videos", "update"), handlers.AdminUpdateVideo)
+ authAdmin.DELETE("/videos/:id", middleware.PermissionMiddleware("videos", "delete"), handlers.AdminDeleteVideo)
+
// 代码片段管理
authAdmin.GET("/snippets", middleware.PermissionMiddleware("snippets", "read"), handlers.AdminGetSnippets)
authAdmin.POST("/snippets", middleware.PermissionMiddleware("snippets", "create"), handlers.AdminCreateSnippet)
diff --git a/server/models/video.go b/server/models/video.go
new file mode 100644
index 0000000..ad04853
--- /dev/null
+++ b/server/models/video.go
@@ -0,0 +1,164 @@
+package models
+
+import (
+ "time"
+
+ "gorm.io/gorm"
+)
+
+// VideoCategory 视频分类模型
+type VideoCategory struct {
+ ID uint `json:"id" gorm:"primaryKey;column:id"`
+ Name string `json:"name" gorm:"column:name"`
+ Slug string `json:"slug" gorm:"column:slug;uniqueIndex"`
+ Description string `json:"description" gorm:"column:description;type:text"`
+ SortOrder uint `json:"sortOrder" gorm:"column:sort_order;default:0"`
+ CreatedAt int64 `json:"createdAt" gorm:"column:created_at"`
+ UpdatedAt int64 `json:"updatedAt" gorm:"column:updated_at"`
+ DeletedAt int64 `json:"deletedAt" gorm:"column:deleted_at;default:0"`
+}
+
+func (VideoCategory) TableName() string { return "video_categories" }
+
+func (vc *VideoCategory) BeforeCreate(tx *gorm.DB) error {
+ now := time.Now().Unix()
+ if vc.CreatedAt == 0 {
+ vc.CreatedAt = now
+ }
+ if vc.UpdatedAt == 0 {
+ vc.UpdatedAt = now
+ }
+ return nil
+}
+
+func (vc *VideoCategory) BeforeUpdate(tx *gorm.DB) error {
+ vc.UpdatedAt = time.Now().Unix()
+ return nil
+}
+
+// VideoCategoryResponse 视频分类 API 响应
+type VideoCategoryResponse struct {
+ ID uint `json:"id"`
+ Name string `json:"name"`
+ Slug string `json:"slug"`
+ Description string `json:"description"`
+ SortOrder uint `json:"sortOrder"`
+ CreatedAt string `json:"createdAt"`
+ UpdatedAt string `json:"updatedAt"`
+ VideoCount int64 `json:"videoCount,omitempty"`
+ AlbumCount int64 `json:"albumCount,omitempty"`
+}
+
+// VideoAlbum 视频专辑模型
+type VideoAlbum struct {
+ ID uint `json:"id" gorm:"primaryKey;column:id"`
+ Name string `json:"name" gorm:"column:name"`
+ Description string `json:"description" gorm:"column:description;type:text"`
+ Cover string `json:"cover" gorm:"column:cover"`
+ CategoryID uint `json:"categoryId" gorm:"column:category_id;index"`
+ IsActive int `json:"isActive" gorm:"column:is_active;default:1"`
+ SortOrder uint `json:"sortOrder" gorm:"column:sort_order;default:0"`
+ CreatedAt int64 `json:"createdAt" gorm:"column:created_at"`
+ UpdatedAt int64 `json:"updatedAt" gorm:"column:updated_at"`
+ DeletedAt int64 `json:"deletedAt" gorm:"column:deleted_at;default:0"`
+}
+
+func (VideoAlbum) TableName() string { return "video_albums" }
+
+func (va *VideoAlbum) BeforeCreate(tx *gorm.DB) error {
+ now := time.Now().Unix()
+ if va.CreatedAt == 0 {
+ va.CreatedAt = now
+ }
+ if va.UpdatedAt == 0 {
+ va.UpdatedAt = now
+ }
+ return nil
+}
+
+func (va *VideoAlbum) BeforeUpdate(tx *gorm.DB) error {
+ va.UpdatedAt = time.Now().Unix()
+ return nil
+}
+
+// VideoAlbumResponse 视频专辑 API 响应
+type VideoAlbumResponse struct {
+ ID uint `json:"id"`
+ Name string `json:"name"`
+ Description string `json:"description"`
+ Cover string `json:"cover"`
+ CategoryID uint `json:"categoryId"`
+ CategoryName string `json:"categoryName,omitempty"`
+ IsActive int `json:"isActive"`
+ SortOrder uint `json:"sortOrder"`
+ CreatedAt string `json:"createdAt"`
+ UpdatedAt string `json:"updatedAt"`
+ VideoCount int64 `json:"videoCount,omitempty"`
+}
+
+// Video 视频模型
+type Video struct {
+ ID string `json:"id" gorm:"primaryKey;column:id"`
+ Title string `json:"title" gorm:"column:title"`
+ Description string `json:"description" gorm:"column:description;type:text"`
+ VideoURL string `json:"videoUrl" gorm:"column:video_url"`
+ Cover string `json:"cover" gorm:"column:cover"`
+ Poster string `json:"poster" gorm:"column:poster"`
+ CategoryID uint `json:"categoryId" gorm:"column:category_id;index"`
+ Duration int `json:"duration" gorm:"column:duration;default:0"`
+ IsPublished int `json:"isPublished" gorm:"column:is_published;default:1"`
+ CreatedAt int64 `json:"createdAt" gorm:"column:created_at"`
+ UpdatedAt int64 `json:"updatedAt" gorm:"column:updated_at"`
+ DeletedAt int64 `json:"deletedAt" gorm:"column:deleted_at;default:0"`
+}
+
+func (Video) TableName() string { return "videos" }
+
+func (v *Video) BeforeCreate(tx *gorm.DB) error {
+ now := time.Now().Unix()
+ if v.CreatedAt == 0 {
+ v.CreatedAt = now
+ }
+ if v.UpdatedAt == 0 {
+ v.UpdatedAt = now
+ }
+ return nil
+}
+
+func (v *Video) BeforeUpdate(tx *gorm.DB) error {
+ v.UpdatedAt = time.Now().Unix()
+ return nil
+}
+
+// VideoResponse 视频 API 响应
+type VideoResponse struct {
+ ID string `json:"id"`
+ Title string `json:"title"`
+ Description string `json:"description"`
+ VideoURL string `json:"videoUrl"`
+ Cover string `json:"cover"`
+ Poster string `json:"poster"`
+ CategoryID uint `json:"categoryId"`
+ CategoryName string `json:"categoryName,omitempty"`
+ Duration int `json:"duration"`
+ IsPublished int `json:"isPublished"`
+ CreatedAt string `json:"createdAt"`
+ UpdatedAt string `json:"updatedAt"`
+}
+
+// AlbumVideo 专辑视频关联
+type AlbumVideo struct {
+ AlbumID uint `json:"albumId" gorm:"primaryKey;column:album_id"`
+ VideoID string `json:"videoId" gorm:"primaryKey;column:video_id"`
+ SortOrder uint `json:"sortOrder" gorm:"column:sort_order;default:0"`
+ CreatedAt int64 `json:"createdAt" gorm:"column:created_at"`
+}
+
+func (AlbumVideo) TableName() string { return "album_videos" }
+
+func (av *AlbumVideo) BeforeCreate(tx *gorm.DB) error {
+ if av.CreatedAt == 0 {
+ av.CreatedAt = time.Now().Unix()
+ }
+ return nil
+}
diff --git a/server/models/work.go b/server/models/work.go
index e872b02..5556484 100644
--- a/server/models/work.go
+++ b/server/models/work.go
@@ -13,6 +13,8 @@ type Work struct {
Category string `json:"category" gorm:"column:category"`
Year string `json:"year" gorm:"column:year"`
HeroImg string `json:"heroImg" gorm:"column:hero_img"`
+ HeroVideo string `json:"heroVideo" gorm:"column:hero_video"`
+ VideoID string `json:"videoId" gorm:"column:video_id"`
Description string `json:"desc" gorm:"column:description;type:text"`
Links string `json:"links" gorm:"column:links;type:text"` // JSON格式存储链接
IsFeatured int `json:"isFeatured" gorm:"column:is_featured;default:0"`
@@ -107,6 +109,9 @@ type WorkResponse struct {
Category string `json:"category"`
Year string `json:"year"`
HeroImg string `json:"heroImg"`
+ HeroVideo string `json:"heroVideo,omitempty"`
+ VideoID string `json:"videoId,omitempty"`
+ VideoURL string `json:"videoUrl,omitempty"`
Desc string `json:"desc"`
TechStack []map[string]interface{} `json:"techStack"`
Gallery []string `json:"gallery"`
diff --git a/server/nl_blog.sql b/server/nl_blog.sql
index 257b3f8..970dc94 100644
--- a/server/nl_blog.sql
+++ b/server/nl_blog.sql
@@ -540,6 +540,8 @@ CREATE TABLE `works` (
`category` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作品分类',
`year` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '创作年份',
`hero_img` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作品主图URL',
+ `hero_video` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '演示视频URL',
+ `video_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '关联视频库ID',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作品详细描述',
`links` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '作品链接(JSON格式)',
`is_featured` tinyint(1) NULL DEFAULT 0 COMMENT '是否为精选作品(0:否,1:是)',
@@ -566,4 +568,74 @@ CREATE TABLE `post_snippets` (
INDEX `idx_sort_order`(`sort_order` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文章代码片段关联表' ROW_FORMAT = DYNAMIC;
+-- ----------------------------
+-- Table structure for video_categories
+-- ----------------------------
+DROP TABLE IF EXISTS `video_categories`;
+CREATE TABLE `video_categories` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
+ `name` varchar(100) NOT NULL,
+ `slug` varchar(100) NOT NULL,
+ `description` text NULL,
+ `sort_order` int UNSIGNED NOT NULL DEFAULT 0,
+ `deleted_at` bigint NOT NULL DEFAULT 0,
+ `created_at` bigint NOT NULL DEFAULT 0,
+ `updated_at` bigint NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `idx_slug`(`slug`)
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频分类表';
+
+-- ----------------------------
+-- Table structure for video_albums
+-- ----------------------------
+DROP TABLE IF EXISTS `video_albums`;
+CREATE TABLE `video_albums` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
+ `name` varchar(200) NOT NULL,
+ `description` text NULL,
+ `cover` varchar(500) NULL,
+ `category_id` int UNSIGNED NOT NULL DEFAULT 0,
+ `is_active` tinyint(1) NOT NULL DEFAULT 1,
+ `sort_order` int UNSIGNED NOT NULL DEFAULT 0,
+ `deleted_at` bigint NOT NULL DEFAULT 0,
+ `created_at` bigint NOT NULL DEFAULT 0,
+ `updated_at` bigint NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ INDEX `idx_category_id`(`category_id`)
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频专辑表';
+
+-- ----------------------------
+-- Table structure for videos
+-- ----------------------------
+DROP TABLE IF EXISTS `videos`;
+CREATE TABLE `videos` (
+ `id` varchar(50) NOT NULL,
+ `title` varchar(200) NOT NULL,
+ `description` text NULL,
+ `video_url` varchar(500) NOT NULL,
+ `cover` varchar(500) NULL,
+ `poster` varchar(500) NULL,
+ `category_id` int UNSIGNED NOT NULL DEFAULT 0,
+ `duration` int NOT NULL DEFAULT 0,
+ `is_published` tinyint(1) NOT NULL DEFAULT 1,
+ `deleted_at` bigint NOT NULL DEFAULT 0,
+ `created_at` bigint NOT NULL DEFAULT 0,
+ `updated_at` bigint NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ INDEX `idx_category_id`(`category_id`)
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频表';
+
+-- ----------------------------
+-- Table structure for album_videos
+-- ----------------------------
+DROP TABLE IF EXISTS `album_videos`;
+CREATE TABLE `album_videos` (
+ `album_id` int UNSIGNED NOT NULL,
+ `video_id` varchar(50) NOT NULL,
+ `sort_order` int UNSIGNED NOT NULL DEFAULT 0,
+ `created_at` bigint NOT NULL DEFAULT 0,
+ PRIMARY KEY (`album_id`, `video_id`),
+ INDEX `idx_video_id`(`video_id`)
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '专辑视频关联表';
+
SET FOREIGN_KEY_CHECKS = 1;
diff --git a/server/repositories/migration.go b/server/repositories/migration.go
index 02a0bb2..c5ac283 100644
--- a/server/repositories/migration.go
+++ b/server/repositories/migration.go
@@ -3,6 +3,7 @@ package repositories
import (
"fmt"
"log"
+ "time"
"github.com/niangaodev/art-code/config"
)
@@ -195,3 +196,100 @@ func MigrateUserProfileFields() {
execSQL("ALTER TABLE `users` ADD COLUMN `wechat_qrcode` VARCHAR(500) NULL DEFAULT NULL COMMENT '微信二维码图片URL' AFTER `wechat`")
}
}
+
+// MigrateVideoModule 创建视频模块表及作品视频字段
+func MigrateVideoModule() {
+ log.Printf("Migrating video module...")
+
+ if !tableExists("video_categories") {
+ execSQL(`CREATE TABLE video_categories (
+ id INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ name VARCHAR(100) NOT NULL,
+ slug VARCHAR(100) NOT NULL,
+ description TEXT NULL,
+ sort_order INT UNSIGNED NOT NULL DEFAULT 0,
+ deleted_at BIGINT NOT NULL DEFAULT 0,
+ created_at BIGINT NOT NULL DEFAULT 0,
+ updated_at BIGINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (id),
+ UNIQUE INDEX idx_slug (slug)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='视频分类表'`)
+ }
+
+ if !tableExists("video_albums") {
+ execSQL(`CREATE TABLE video_albums (
+ id INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ name VARCHAR(200) NOT NULL,
+ description TEXT NULL,
+ cover VARCHAR(500) NULL,
+ category_id INT UNSIGNED NOT NULL DEFAULT 0,
+ is_active TINYINT(1) NOT NULL DEFAULT 1,
+ sort_order INT UNSIGNED NOT NULL DEFAULT 0,
+ deleted_at BIGINT NOT NULL DEFAULT 0,
+ created_at BIGINT NOT NULL DEFAULT 0,
+ updated_at BIGINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (id),
+ INDEX idx_category_id (category_id)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='视频专辑表'`)
+ }
+
+ if !tableExists("videos") {
+ execSQL(`CREATE TABLE videos (
+ id VARCHAR(50) NOT NULL,
+ title VARCHAR(200) NOT NULL,
+ description TEXT NULL,
+ video_url VARCHAR(500) NOT NULL,
+ cover VARCHAR(500) NULL,
+ poster VARCHAR(500) NULL,
+ category_id INT UNSIGNED NOT NULL DEFAULT 0,
+ duration INT NOT NULL DEFAULT 0,
+ is_published TINYINT(1) NOT NULL DEFAULT 1,
+ deleted_at BIGINT NOT NULL DEFAULT 0,
+ created_at BIGINT NOT NULL DEFAULT 0,
+ updated_at BIGINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (id),
+ INDEX idx_category_id (category_id)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='视频表'`)
+ }
+
+ if !tableExists("album_videos") {
+ execSQL(`CREATE TABLE album_videos (
+ album_id INT UNSIGNED NOT NULL,
+ video_id VARCHAR(50) NOT NULL,
+ sort_order INT UNSIGNED NOT NULL DEFAULT 0,
+ created_at BIGINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (album_id, video_id),
+ INDEX idx_video_id (video_id)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='专辑视频关联表'`)
+ }
+
+ if !columnExists("works", "hero_video") {
+ execSQL("ALTER TABLE `works` ADD COLUMN `hero_video` VARCHAR(500) NULL DEFAULT NULL COMMENT '演示视频URL' AFTER `hero_img`")
+ }
+ if !columnExists("works", "video_id") {
+ execSQL("ALTER TABLE `works` ADD COLUMN `video_id` VARCHAR(50) NULL DEFAULT NULL COMMENT '关联视频库ID' AFTER `hero_video`")
+ }
+
+ // 插入 videos 权限(若不存在)
+ now := time.Now().Unix()
+ actions := []string{"read", "create", "update", "delete"}
+ for _, action := range actions {
+ var count int64
+ config.DB.Raw("SELECT COUNT(*) FROM permissions WHERE resource = ? AND action = ? AND deleted_at = 0", "videos", action).Scan(&count)
+ if count == 0 {
+ execSQL(fmt.Sprintf("INSERT INTO permissions (name, resource, action, deleted_at, created_at, updated_at) VALUES ('videos:%s', 'videos', '%s', 0, %d, %d)", action, action, now, now))
+ }
+ }
+
+ // 为 role_id=1 的管理员角色授予 videos 权限
+ type permRow struct{ ID uint }
+ var rows []permRow
+ config.DB.Raw("SELECT id FROM permissions WHERE resource = 'videos' AND deleted_at = 0").Scan(&rows)
+ for _, row := range rows {
+ var count int64
+ config.DB.Raw("SELECT COUNT(*) FROM role_permissions WHERE role_id = 1 AND permission_id = ?", row.ID).Scan(&count)
+ if count == 0 {
+ execSQL(fmt.Sprintf("INSERT INTO role_permissions (role_id, permission_id) VALUES (1, %d)", row.ID))
+ }
+ }
+}
diff --git a/server/repositories/video_repository.go b/server/repositories/video_repository.go
new file mode 100644
index 0000000..77bd369
--- /dev/null
+++ b/server/repositories/video_repository.go
@@ -0,0 +1,320 @@
+package repositories
+
+import (
+ "log"
+ "time"
+
+ "github.com/niangaodev/art-code/config"
+ "github.com/niangaodev/art-code/models"
+ "gorm.io/gorm"
+)
+
+// ========== 视频分类 ==========
+
+func GetVideoCategories() ([]models.VideoCategory, error) {
+ var list []models.VideoCategory
+ err := config.DB.Model(&models.VideoCategory{}).
+ Where("deleted_at = ?", 0).
+ Order("sort_order ASC, id ASC").
+ Find(&list).Error
+ return list, err
+}
+
+func GetVideoCategoryByID(id uint) (*models.VideoCategory, error) {
+ var item models.VideoCategory
+ err := config.DB.Model(&models.VideoCategory{}).
+ Where("id = ? AND deleted_at = ?", id, 0).
+ First(&item).Error
+ if err == gorm.ErrRecordNotFound {
+ return nil, nil
+ }
+ return &item, err
+}
+
+func CreateVideoCategory(item *models.VideoCategory) error {
+ return config.DB.Create(item).Error
+}
+
+func UpdateVideoCategory(item *models.VideoCategory) error {
+ return config.DB.Model(&models.VideoCategory{}).
+ Where("id = ? AND deleted_at = ?", item.ID, 0).
+ Updates(map[string]interface{}{
+ "name": item.Name,
+ "slug": item.Slug,
+ "description": item.Description,
+ "sort_order": item.SortOrder,
+ "updated_at": time.Now().Unix(),
+ }).Error
+}
+
+func DeleteVideoCategory(id uint) error {
+ return config.DB.Model(&models.VideoCategory{}).
+ Where("id = ?", id).
+ Update("deleted_at", time.Now().Unix()).Error
+}
+
+func BuildVideoCategoryResponse(item *models.VideoCategory) models.VideoCategoryResponse {
+ var videoCount, albumCount int64
+ config.DB.Model(&models.Video{}).
+ Where("category_id = ? AND deleted_at = ? AND is_published = ?", item.ID, 0, 1).
+ Count(&videoCount)
+ config.DB.Model(&models.VideoAlbum{}).
+ Where("category_id = ? AND deleted_at = ? AND is_active = ?", item.ID, 0, 1).
+ Count(&albumCount)
+ return models.VideoCategoryResponse{
+ ID: item.ID,
+ Name: item.Name,
+ Slug: item.Slug,
+ Description: item.Description,
+ SortOrder: item.SortOrder,
+ CreatedAt: formatTimestamp(item.CreatedAt),
+ UpdatedAt: formatTimestamp(item.UpdatedAt),
+ VideoCount: videoCount,
+ AlbumCount: albumCount,
+ }
+}
+
+func BuildVideoCategoriesResponse(list []models.VideoCategory) []models.VideoCategoryResponse {
+ res := make([]models.VideoCategoryResponse, 0, len(list))
+ for i := range list {
+ res = append(res, BuildVideoCategoryResponse(&list[i]))
+ }
+ return res
+}
+
+// ========== 视频专辑 ==========
+
+func GetVideoAlbums(categoryID uint) ([]models.VideoAlbum, error) {
+ var list []models.VideoAlbum
+ q := config.DB.Model(&models.VideoAlbum{}).Where("deleted_at = ?", 0)
+ if categoryID > 0 {
+ q = q.Where("category_id = ?", categoryID)
+ }
+ err := q.Order("sort_order ASC, created_at DESC").Find(&list).Error
+ return list, err
+}
+
+func GetActiveVideoAlbums(categoryID uint) ([]models.VideoAlbum, error) {
+ var list []models.VideoAlbum
+ q := config.DB.Model(&models.VideoAlbum{}).Where("deleted_at = ? AND is_active = ?", 0, 1)
+ if categoryID > 0 {
+ q = q.Where("category_id = ?", categoryID)
+ }
+ err := q.Order("sort_order ASC, created_at DESC").Find(&list).Error
+ return list, err
+}
+
+func GetVideoAlbumByID(id uint) (*models.VideoAlbum, error) {
+ var item models.VideoAlbum
+ err := config.DB.Model(&models.VideoAlbum{}).
+ Where("id = ? AND deleted_at = ?", id, 0).
+ First(&item).Error
+ if err == gorm.ErrRecordNotFound {
+ return nil, nil
+ }
+ return &item, err
+}
+
+func CreateVideoAlbum(item *models.VideoAlbum) error {
+ return config.DB.Create(item).Error
+}
+
+func UpdateVideoAlbum(item *models.VideoAlbum) error {
+ return config.DB.Model(&models.VideoAlbum{}).
+ Where("id = ? AND deleted_at = ?", item.ID, 0).
+ Updates(map[string]interface{}{
+ "name": item.Name,
+ "description": item.Description,
+ "cover": item.Cover,
+ "category_id": item.CategoryID,
+ "is_active": item.IsActive,
+ "sort_order": item.SortOrder,
+ "updated_at": time.Now().Unix(),
+ }).Error
+}
+
+func DeleteVideoAlbum(id uint) error {
+ return config.DB.Model(&models.VideoAlbum{}).
+ Where("id = ?", id).
+ Update("deleted_at", time.Now().Unix()).Error
+}
+
+func GetAlbumVideoCount(albumID uint) int64 {
+ var count int64
+ config.DB.Model(&models.AlbumVideo{}).
+ Joins("JOIN videos v ON v.id = album_videos.video_id").
+ Where("album_videos.album_id = ? AND v.deleted_at = ? AND v.is_published = ?", albumID, 0, 1).
+ Count(&count)
+ return count
+}
+
+func BuildVideoAlbumResponse(item *models.VideoAlbum) models.VideoAlbumResponse {
+ categoryName := ""
+ if cat, _ := GetVideoCategoryByID(item.CategoryID); cat != nil {
+ categoryName = cat.Name
+ }
+ return models.VideoAlbumResponse{
+ ID: item.ID,
+ Name: item.Name,
+ Description: item.Description,
+ Cover: item.Cover,
+ CategoryID: item.CategoryID,
+ CategoryName: categoryName,
+ IsActive: item.IsActive,
+ SortOrder: item.SortOrder,
+ CreatedAt: formatTimestamp(item.CreatedAt),
+ UpdatedAt: formatTimestamp(item.UpdatedAt),
+ VideoCount: GetAlbumVideoCount(item.ID),
+ }
+}
+
+func BuildVideoAlbumsResponse(list []models.VideoAlbum) []models.VideoAlbumResponse {
+ res := make([]models.VideoAlbumResponse, 0, len(list))
+ for i := range list {
+ res = append(res, BuildVideoAlbumResponse(&list[i]))
+ }
+ return res
+}
+
+// ========== 视频 ==========
+
+func GetVideos(categoryID uint, publishedOnly bool) ([]models.Video, error) {
+ var list []models.Video
+ q := config.DB.Model(&models.Video{}).Where("deleted_at = ?", 0)
+ if categoryID > 0 {
+ q = q.Where("category_id = ?", categoryID)
+ }
+ if publishedOnly {
+ q = q.Where("is_published = ?", 1)
+ }
+ err := q.Order("created_at DESC").Find(&list).Error
+ return list, err
+}
+
+func GetVideoByID(id string) (*models.Video, error) {
+ var item models.Video
+ err := config.DB.Model(&models.Video{}).
+ Where("id = ? AND deleted_at = ?", id, 0).
+ First(&item).Error
+ if err == gorm.ErrRecordNotFound {
+ return nil, nil
+ }
+ return &item, err
+}
+
+func CreateVideo(item *models.Video) error {
+ return config.DB.Create(item).Error
+}
+
+func UpdateVideo(item *models.Video) error {
+ return config.DB.Model(&models.Video{}).
+ Where("id = ? AND deleted_at = ?", item.ID, 0).
+ Updates(map[string]interface{}{
+ "title": item.Title,
+ "description": item.Description,
+ "video_url": item.VideoURL,
+ "cover": item.Cover,
+ "poster": item.Poster,
+ "category_id": item.CategoryID,
+ "duration": item.Duration,
+ "is_published": item.IsPublished,
+ "updated_at": time.Now().Unix(),
+ }).Error
+}
+
+func DeleteVideo(id string) error {
+ return config.DB.Model(&models.Video{}).
+ Where("id = ?", id).
+ Update("deleted_at", time.Now().Unix()).Error
+}
+
+func BuildVideoResponse(item *models.Video) models.VideoResponse {
+ categoryName := ""
+ if cat, _ := GetVideoCategoryByID(item.CategoryID); cat != nil {
+ categoryName = cat.Name
+ }
+ poster := item.Poster
+ if poster == "" {
+ poster = item.Cover
+ }
+ return models.VideoResponse{
+ ID: item.ID,
+ Title: item.Title,
+ Description: item.Description,
+ VideoURL: item.VideoURL,
+ Cover: item.Cover,
+ Poster: poster,
+ CategoryID: item.CategoryID,
+ CategoryName: categoryName,
+ Duration: item.Duration,
+ IsPublished: item.IsPublished,
+ CreatedAt: formatTimestamp(item.CreatedAt),
+ UpdatedAt: formatTimestamp(item.UpdatedAt),
+ }
+}
+
+func BuildVideosResponse(list []models.Video) []models.VideoResponse {
+ res := make([]models.VideoResponse, 0, len(list))
+ for i := range list {
+ res = append(res, BuildVideoResponse(&list[i]))
+ }
+ return res
+}
+
+// ResolveVideoURL 根据 video_id 解析播放地址
+func ResolveVideoURL(videoID string) string {
+ if videoID == "" {
+ return ""
+ }
+ v, err := GetVideoByID(videoID)
+ if err != nil || v == nil {
+ log.Printf("ResolveVideoURL: video not found %s", videoID)
+ return ""
+ }
+ return v.VideoURL
+}
+
+// ========== 专辑视频关联 ==========
+
+func GetVideosByAlbumID(albumID uint, publishedOnly bool) ([]models.Video, error) {
+ var list []models.Video
+ q := config.DB.Model(&models.Video{}).
+ Joins("JOIN album_videos av ON av.video_id = videos.id").
+ Where("av.album_id = ? AND videos.deleted_at = ?", albumID, 0)
+ if publishedOnly {
+ q = q.Where("videos.is_published = ?", 1)
+ }
+ err := q.Order("av.sort_order ASC, av.created_at ASC").Find(&list).Error
+ return list, err
+}
+
+func AddVideoToAlbum(albumID uint, videoID string, sortOrder uint) error {
+ av := models.AlbumVideo{
+ AlbumID: albumID,
+ VideoID: videoID,
+ SortOrder: sortOrder,
+ CreatedAt: time.Now().Unix(),
+ }
+ return config.DB.Create(&av).Error
+}
+
+func RemoveVideoFromAlbum(albumID uint, videoID string) error {
+ return config.DB.Where("album_id = ? AND video_id = ?", albumID, videoID).
+ Delete(&models.AlbumVideo{}).Error
+}
+
+func SyncAlbumVideos(albumID uint, videoIDs []string) error {
+ if err := config.DB.Where("album_id = ?", albumID).Delete(&models.AlbumVideo{}).Error; err != nil {
+ return err
+ }
+ for i, vid := range videoIDs {
+ if vid == "" {
+ continue
+ }
+ if err := AddVideoToAlbum(albumID, vid, uint(i+1)); err != nil {
+ log.Printf("SyncAlbumVideos error: %v", err)
+ return err
+ }
+ }
+ return nil
+}
diff --git a/server/repositories/work_repository.go b/server/repositories/work_repository.go
index e83e13e..e61137f 100644
--- a/server/repositories/work_repository.go
+++ b/server/repositories/work_repository.go
@@ -120,12 +120,24 @@ func BuildWorkResponse(work *models.Work) (*models.WorkResponse, error) {
nextWorkID = ""
}
+ // 解析视频播放地址:优先 video_id,否则 hero_video
+ videoURL := ""
+ if work.VideoID != "" {
+ videoURL = ResolveVideoURL(work.VideoID)
+ }
+ if videoURL == "" {
+ videoURL = work.HeroVideo
+ }
+
return &models.WorkResponse{
ID: work.ID,
Title: work.Title,
Category: work.Category,
Year: work.Year,
HeroImg: work.HeroImg,
+ HeroVideo: work.HeroVideo,
+ VideoID: work.VideoID,
+ VideoURL: videoURL,
Desc: work.Description,
TechStack: techStackResponse,
Gallery: galleryImages,
@@ -255,6 +267,8 @@ func UpdateWork(work *models.Work) error {
"category": work.Category,
"year": work.Year,
"hero_img": work.HeroImg,
+ "hero_video": work.HeroVideo,
+ "video_id": work.VideoID,
"description": work.Description,
"is_featured": work.IsFeatured,
"updated_at": time.Now().Unix(),
diff --git a/server/scripts/migrate_video_module.sql b/server/scripts/migrate_video_module.sql
new file mode 100644
index 0000000..1a75c4e
--- /dev/null
+++ b/server/scripts/migrate_video_module.sql
@@ -0,0 +1,127 @@
+-- ============================================================
+-- 视频模块 + 作品演示视频 数据库迁移脚本
+-- 文件:server/scripts/migrate_video_module.sql
+-- 说明:可重复执行(幂等),适用于已有 nl_blog 数据库的增量升级
+-- 用法:mysql -u root -p your_database < scripts/migrate_video_module.sql
+-- ============================================================
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- 1. 视频分类表
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `video_categories` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '分类ID',
+ `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '分类名称',
+ `slug` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'URL标识',
+ `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '分类描述',
+ `sort_order` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序(越小越靠前)',
+ `deleted_at` bigint NOT NULL DEFAULT 0 COMMENT '软删除时间戳',
+ `created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间(Unix秒)',
+ `updated_at` bigint NOT NULL DEFAULT 0 COMMENT '更新时间(Unix秒)',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `idx_slug`(`slug` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频分类表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- 2. 视频专辑表
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `video_albums` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '专辑ID',
+ `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '专辑名称',
+ `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '专辑描述',
+ `cover` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '专辑封面URL',
+ `category_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属视频分类ID',
+ `is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用(0否 1是)',
+ `sort_order` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序(越小越靠前)',
+ `deleted_at` bigint NOT NULL DEFAULT 0 COMMENT '软删除时间戳',
+ `created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间(Unix秒)',
+ `updated_at` bigint NOT NULL DEFAULT 0 COMMENT '更新时间(Unix秒)',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_category_id`(`category_id` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频专辑表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- 3. 视频表
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `videos` (
+ `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频唯一标识',
+ `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频标题',
+ `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '视频描述',
+ `video_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频文件URL',
+ `cover` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '封面图URL',
+ `poster` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '播放器封面URL',
+ `category_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属视频分类ID',
+ `duration` int NOT NULL DEFAULT 0 COMMENT '时长(秒)',
+ `is_published` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否发布(0草稿 1已发布)',
+ `deleted_at` bigint NOT NULL DEFAULT 0 COMMENT '软删除时间戳',
+ `created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间(Unix秒)',
+ `updated_at` bigint NOT NULL DEFAULT 0 COMMENT '更新时间(Unix秒)',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_category_id`(`category_id` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- 4. 专辑-视频关联表
+-- ----------------------------
+CREATE TABLE IF NOT EXISTS `album_videos` (
+ `album_id` int UNSIGNED NOT NULL COMMENT '专辑ID',
+ `video_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频ID',
+ `sort_order` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '专辑内排序',
+ `created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间(Unix秒)',
+ PRIMARY KEY (`album_id`, `video_id`) USING BTREE,
+ INDEX `idx_video_id`(`video_id` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '专辑视频关联表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- 5. 作品表新增演示视频字段(幂等添加)
+-- ----------------------------
+
+-- 5.1 hero_video:独立上传的视频 URL
+SET @col_exists = (
+ SELECT COUNT(*) FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'works' AND COLUMN_NAME = 'hero_video'
+);
+SET @sql = IF(@col_exists = 0,
+ 'ALTER TABLE `works` ADD COLUMN `hero_video` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ''演示视频URL'' AFTER `hero_img`',
+ 'SELECT ''works.hero_video already exists'' AS info'
+);
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- 5.2 video_id:关联 videos 表 ID(从视频库选择时使用)
+SET @col_exists = (
+ SELECT COUNT(*) FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'works' AND COLUMN_NAME = 'video_id'
+);
+SET @sql = IF(@col_exists = 0,
+ 'ALTER TABLE `works` ADD COLUMN `video_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ''关联视频库ID'' AFTER `hero_video`',
+ 'SELECT ''works.video_id already exists'' AS info'
+);
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- ----------------------------
+-- 6. 视频模块后台权限(videos:read/create/update/delete)
+-- ----------------------------
+INSERT IGNORE INTO `permissions` (`name`, `resource`, `action`, `deleted_at`, `created_at`, `updated_at`) VALUES
+('videos:read', 'videos', 'read', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
+('videos:create', 'videos', 'create', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
+('videos:update', 'videos', 'update', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
+('videos:delete', 'videos', 'delete', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
+
+-- 为管理员角色(role_id = 1)授予 videos 权限
+INSERT IGNORE INTO `role_permissions` (`role_id`, `permission_id`)
+SELECT 1, p.id FROM `permissions` p
+WHERE p.resource = 'videos' AND p.deleted_at = 0
+ AND NOT EXISTS (
+ SELECT 1 FROM `role_permissions` rp
+ WHERE rp.role_id = 1 AND rp.permission_id = p.id
+ );
+
+SET FOREIGN_KEY_CHECKS = 1;
+
+SELECT 'migrate_video_module.sql executed successfully' AS result;