From 6199a059414ad2f8cde08e161cce50ad6158fd34 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Tue, 27 Aug 2024 11:15:43 +0800 Subject: [PATCH 01/87] fix #391 --- webui/src/views/dashboard/components/peerListModal.vue | 3 ++- webui/src/views/dashboard/components/torrentList.vue | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/webui/src/views/dashboard/components/peerListModal.vue b/webui/src/views/dashboard/components/peerListModal.vue index 94654c1756..1ba51540f5 100644 --- a/webui/src/views/dashboard/components/peerListModal.vue +++ b/webui/src/views/dashboard/components/peerListModal.vue @@ -107,7 +107,8 @@ const handleOk = () => { const { data, loading, run, cancel } = useRequest( getPeer, { - defaultParams: [downloader.value, tid.value] + defaultParams: [downloader.value, tid.value], + ready: visible }, [useAutoUpdatePlugin] ) diff --git a/webui/src/views/dashboard/components/torrentList.vue b/webui/src/views/dashboard/components/torrentList.vue index 530d5cc5bd..8989632f6d 100644 --- a/webui/src/views/dashboard/components/torrentList.vue +++ b/webui/src/views/dashboard/components/torrentList.vue @@ -66,7 +66,8 @@ const { downloader } = defineProps<{ const { data, loading } = useRequest( getTorrents, { - defaultParams: [downloader] + defaultParams: [downloader], + ready: () => !!downloader }, [useAutoUpdatePlugin] ) From 1e599de2463d24ec48a5e8aa6c511259632b98e9 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Tue, 27 Aug 2024 13:18:35 +0800 Subject: [PATCH 02/87] =?UTF-8?q?=E9=87=8D=E6=9E=84ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/.eslintrc.cjs | 18 - webui/eslint.config.js | 35 + webui/package.json | 22 +- webui/pnpm-lock.yaml | 1197 +++++++---------- webui/src/App.vue | 6 +- webui/src/components/asyncMethod.vue | 3 + webui/src/components/autoUpdateBtn.vue | 2 +- webui/src/components/forms/biglybt.vue | 15 +- webui/src/components/forms/deluge.vue | 27 +- webui/src/components/forms/qbittorrent.vue | 24 +- webui/src/components/forms/transmission.vue | 15 +- webui/src/components/pageFooter.vue | 2 +- webui/src/components/pageHeader.vue | 4 +- webui/src/components/plusModal.vue | 20 +- webui/src/components/settingsModal.vue | 14 +- webui/src/global.d.ts | 2 +- webui/src/main.ts | 2 +- webui/src/service/charts.ts | 14 +- webui/src/service/locale/en-US.ts | 8 +- webui/src/service/ruleSubscribe.ts | 6 +- webui/src/stores/autoUpdate.ts | 8 +- webui/src/utils/networkRetry.ts | 8 +- .../src/views/banlist/components/banList.vue | 10 +- .../views/banlist/components/banListItem.vue | 2 +- .../views/banlist/components/countryFlag.vue | 2 +- .../views/banlog/components/banlogTable.vue | 2 +- webui/src/views/banlog/index.vue | 12 +- webui/src/views/charts/components/banLine.vue | 4 +- .../src/views/charts/components/fieldPie.vue | 6 +- webui/src/views/charts/components/ispPie.vue | 27 +- webui/src/views/charts/components/traffic.vue | 4 +- webui/src/views/charts/components/trends.vue | 4 +- webui/src/views/charts/index.vue | 2 +- .../dashboard/components/clientStatus.vue | 4 +- .../dashboard/components/clientStatusCard.vue | 10 +- .../components/editDownloaderModal.vue | 20 +- .../dashboard/components/peerListModal.vue | 4 +- webui/src/views/dashboard/locale/en-US.ts | 3 +- webui/src/views/dashboard/locale/zh-CN.ts | 3 +- .../views/oobe/components/addDownloader.vue | 25 +- webui/src/views/oobe/components/result.vue | 7 +- webui/src/views/oobe/components/setToken.vue | 10 +- webui/src/views/oobe/index.vue | 24 +- webui/src/views/oobe/locale/en-US.ts | 2 +- webui/src/views/oobe/locale/zh-CN.ts | 3 +- .../src/views/ranks/components/rankTable.vue | 2 +- .../components/generic/index.vue | 28 +- .../subscribe/editRuleItemModal.vue | 35 +- .../components/subscribe/logModal.vue | 4 +- .../components/subscribe/ruleList.vue | 61 +- .../components/subscribe/settingsModal.vue | 22 +- 51 files changed, 891 insertions(+), 903 deletions(-) delete mode 100644 webui/.eslintrc.cjs create mode 100644 webui/eslint.config.js diff --git a/webui/.eslintrc.cjs b/webui/.eslintrc.cjs deleted file mode 100644 index 35a17d7464..0000000000 --- a/webui/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-env node */ -require('@rushstack/eslint-patch/modern-module-resolution') - -module.exports = { - root: true, - 'extends': [ - 'plugin:vue/vue3-essential', - 'eslint:recommended', - '@vue/eslint-config-typescript', - '@vue/eslint-config-prettier/skip-formatting' - ], - parserOptions: { - ecmaVersion: 'latest' - }, - rules:{ - 'vue/multi-word-component-names': 0 - } -} diff --git a/webui/eslint.config.js b/webui/eslint.config.js new file mode 100644 index 0000000000..78a24d1d54 --- /dev/null +++ b/webui/eslint.config.js @@ -0,0 +1,35 @@ +import tsParser from '@typescript-eslint/parser' +import eslintConfigPrettier from 'eslint-config-prettier' +import pluginVue from 'eslint-plugin-vue' +import ts from 'typescript-eslint' + +export default [ + ...ts.configs.recommended, + ...pluginVue.configs['flat/recommended'], + eslintConfigPrettier, + { + files: ['**/*.ts', '**/*.js', '**/*.vue'], + languageOptions: { + parserOptions: { + parser: tsParser + } + }, + ignores: ['dist/*', 'node_modules/*'], + rules: { + 'vue/multi-word-component-names': 0, + 'vue/no-unused-vars': ['error', { ignorePattern: '^_' }], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + args: 'all', + argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true + } + ] + } + } +] diff --git a/webui/package.json b/webui/package.json index 181706b412..09eeebddc9 100644 --- a/webui/package.json +++ b/webui/package.json @@ -10,15 +10,15 @@ "build-only": "vite build", "analyze": "ANALYZE=true vite build", "type-check": "vue-tsc --build --force", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "lint": "prettier -c src/ && eslint --fix . --ignore-pattern 'dist/*'", "format": "prettier --write src/" }, "dependencies": { - "@arco-design/web-vue": "^2.56.0", + "@arco-design/web-vue": "^2.56.1", "@dzangolab/flag-icon-css": "^3.4.5", "@octokit/core": "^6.1.2", "@octokit/request-error": "^6.1.4", - "@vueuse/core": "^11.0.1", + "@vueuse/core": "^11.0.3", "compare-versions": "^6.1.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.13", @@ -38,27 +38,31 @@ }, "devDependencies": { "@arco-plugins/vite-vue": "^1.4.5", + "@eslint/js": "^9.9.1", "@rushstack/eslint-patch": "^1.10.4", "@tsconfig/node20": "^20.1.4", + "@types/eslint__js": "^8.42.3", "@types/lodash": "^4.17.7", "@types/mockjs": "^1.0.10", - "@types/node": "^22.4.2", + "@types/node": "^22.5.0", "@types/uuid": "^10.0.0", + "@typescript-eslint/parser": "^8.3.0", "@vitejs/plugin-vue": "^5.1.2", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^13.0.0", "@vue/tsconfig": "^0.5.1", - "eslint": "^8.57.0", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-vue": "^9.27.0", "less": "^4.2.0", "mockjs": "^1.1.0", "npm-run-all2": "^6.2.2", "prettier": "^3.3.3", "typescript": "~5.5.4", + "typescript-eslint": "^8.3.0", "vite": "^5.4.2", - "vite-bundle-analyzer": "^0.10.5", + "vite-bundle-analyzer": "^0.10.6", "vite-plugin-node-polyfills": "^0.22.0", - "vite-plugin-vue-devtools": "^7.3.8", + "vite-plugin-vue-devtools": "^7.3.9", + "vue-eslint-parser": "^9.4.3", "vue-tsc": "^2.0.29" }, "engines": { diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index f8d34b6ee0..a64b6dc209 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: .: dependencies: '@arco-design/web-vue': - specifier: ^2.56.0 + specifier: ^2.56.1 version: 2.56.1(vue@3.4.38(typescript@5.5.4)) '@dzangolab/flag-icon-css': specifier: ^3.4.5 @@ -26,8 +26,8 @@ importers: specifier: ^6.1.4 version: 6.1.4 '@vueuse/core': - specifier: ^11.0.1 - version: 11.0.1(vue@3.4.38(typescript@5.5.4)) + specifier: ^11.0.3 + version: 11.0.3(vue@3.4.38(typescript@5.5.4)) compare-versions: specifier: ^6.1.1 version: 6.1.1 @@ -63,7 +63,7 @@ importers: version: 3.4.38(typescript@5.5.4) vue-2048: specifier: ^3.0.5 - version: 3.0.5(typescript@5.5.4)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)) + version: 3.0.5(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)) vue-echarts: specifier: ^7.0.3 version: 7.0.3(@vue/runtime-core@3.4.38)(echarts@5.5.1)(vue@3.4.38(typescript@5.5.4)) @@ -80,12 +80,18 @@ importers: '@arco-plugins/vite-vue': specifier: ^1.4.5 version: 1.4.5 + '@eslint/js': + specifier: ^9.9.1 + version: 9.9.1 '@rushstack/eslint-patch': specifier: ^1.10.4 version: 1.10.4 '@tsconfig/node20': specifier: ^20.1.4 version: 20.1.4 + '@types/eslint__js': + specifier: ^8.42.3 + version: 8.42.3 '@types/lodash': specifier: ^4.17.7 version: 4.17.7 @@ -93,29 +99,29 @@ importers: specifier: ^1.0.10 version: 1.0.10 '@types/node': - specifier: ^22.4.2 - version: 22.4.2 + specifier: ^22.5.0 + version: 22.5.0 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 + '@typescript-eslint/parser': + specifier: ^8.3.0 + version: 8.3.0(eslint@9.9.1)(typescript@5.5.4) '@vitejs/plugin-vue': specifier: ^5.1.2 - version: 5.1.2(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) - '@vue/eslint-config-prettier': - specifier: ^9.0.0 - version: 9.0.0(eslint@8.57.0)(prettier@3.3.3) - '@vue/eslint-config-typescript': - specifier: ^13.0.0 - version: 13.0.0(eslint-plugin-vue@9.27.0(eslint@8.57.0))(eslint@8.57.0)(typescript@5.5.4) + version: 5.1.2(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) '@vue/tsconfig': specifier: ^0.5.1 version: 0.5.1 eslint: - specifier: ^8.57.0 - version: 8.57.0 + specifier: ^9.9.1 + version: 9.9.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.9.1) eslint-plugin-vue: specifier: ^9.27.0 - version: 9.27.0(eslint@8.57.0) + version: 9.27.0(eslint@9.9.1) less: specifier: ^4.2.0 version: 4.2.0 @@ -131,18 +137,24 @@ importers: typescript: specifier: ~5.5.4 version: 5.5.4 + typescript-eslint: + specifier: ^8.3.0 + version: 8.3.0(eslint@9.9.1)(typescript@5.5.4) vite: specifier: ^5.4.2 - version: 5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8) + version: 5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8) vite-bundle-analyzer: - specifier: ^0.10.5 + specifier: ^0.10.6 version: 0.10.6 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.21.0)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)) + version: 0.22.0(rollup@4.21.0)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)) vite-plugin-vue-devtools: - specifier: ^7.3.8 - version: 7.3.9(rollup@4.21.0)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) + specifier: ^7.3.9 + version: 7.3.9(rollup@4.21.0)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) + vue-eslint-parser: + specifier: ^9.4.3 + version: 9.4.3(eslint@9.9.1) vue-tsc: specifier: ^2.0.29 version: 2.0.29(typescript@5.5.4) @@ -150,21 +162,21 @@ importers: packages: '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, tarball: https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz} engines: {node: '>=0.10.0'} '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, tarball: https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz} engines: {node: '>=6.0.0'} '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==, tarball: https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz} '@arco-design/color@0.4.0': - resolution: {integrity: sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==} + resolution: {integrity: sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==, tarball: https://registry.npmjs.org/@arco-design/color/-/color-0.4.0.tgz} '@arco-design/web-vue@2.56.1': - resolution: {integrity: sha512-RHIG7DXpCJrpxCKXdxZMzsGvMPCUott57soXW3aHJfxOcf+I2rdX8/UTAt2ka5MyRLUZ4B90B1LKyUgLChGklg==} + resolution: {integrity: sha512-RHIG7DXpCJrpxCKXdxZMzsGvMPCUott57soXW3aHJfxOcf+I2rdX8/UTAt2ka5MyRLUZ4B90B1LKyUgLChGklg==, tarball: https://registry.npmjs.org/@arco-design/web-vue/-/web-vue-2.56.1.tgz} peerDependencies: vue: ^3.1.0 @@ -176,15 +188,15 @@ packages: engines: {node: '>=6.9.0'} '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==, tarball: https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==, tarball: https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz} engines: {node: '>=6.9.0'} '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==, tarball: https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz} engines: {node: '>=6.9.0'} '@babel/generator@7.24.4': @@ -192,19 +204,19 @@ packages: engines: {node: '>=6.9.0'} '@babel/generator@7.25.5': - resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} + resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==, tarball: https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==, tarball: https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==, tarball: https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.25.4': - resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==, tarball: https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -222,11 +234,11 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-member-expression-to-functions@7.24.8': - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==, tarball: https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, tarball: https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.24.3': @@ -234,35 +246,35 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==, tarball: https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==, tarball: https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==, tarball: https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==, tarball: https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz} engines: {node: '>=6.9.0'} '@babel/helper-replace-supers@7.25.0': - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==, tarball: https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==, tarball: https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==, tarball: https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.22.6': @@ -274,7 +286,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==, tarball: https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.22.20': @@ -282,15 +294,15 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==, tarball: https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==, tarball: https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz} engines: {node: '>=6.9.0'} '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==, tarball: https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.2': @@ -298,7 +310,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==, tarball: https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz} engines: {node: '>=6.9.0'} '@babel/parser@7.24.4': @@ -312,47 +324,47 @@ packages: hasBin: true '@babel/parser@7.25.4': - resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==, tarball: https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz} engines: {node: '>=6.0.0'} hasBin: true '@babel/plugin-proposal-decorators@7.24.7': - resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==} + resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==, tarball: https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-decorators@7.24.7': - resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==} + resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.24.7': - resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.25.4': - resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typescript@7.25.2': - resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==, tarball: https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -362,7 +374,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==, tarball: https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz} engines: {node: '>=6.9.0'} '@babel/traverse@7.24.1': @@ -370,7 +382,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/traverse@7.25.4': - resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} + resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz} engines: {node: '>=6.9.0'} '@babel/types@7.24.0': @@ -378,146 +390,146 @@ packages: engines: {node: '>=6.9.0'} '@babel/types@7.25.4': - resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==, tarball: https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz} engines: {node: '>=6.9.0'} '@dzangolab/flag-icon-css@3.4.5': resolution: {integrity: sha512-XqVAi0O/KITtznpMK5TP4D+rWfwst5lrsbPbes5c5SPMGjwK7fuvlTdEmG2XUrxzYqDTIPshywyzdVYKooGdGA==} '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, tarball: https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz} engines: {node: '>=12'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, tarball: https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz} engines: {node: '>=12'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, tarball: https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz} engines: {node: '>=12'} cpu: [arm] os: [android] '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, tarball: https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, tarball: https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz} engines: {node: '>=12'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, tarball: https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, tarball: https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, tarball: https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, tarball: https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz} engines: {node: '>=12'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, tarball: https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz} engines: {node: '>=12'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, tarball: https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz} engines: {node: '>=12'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, tarball: https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz} engines: {node: '>=12'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, tarball: https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz} engines: {node: '>=12'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, tarball: https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz} engines: {node: '>=12'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, tarball: https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz} engines: {node: '>=12'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, tarball: https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz} engines: {node: '>=12'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, tarball: https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, tarball: https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, tarball: https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, tarball: https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, tarball: https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz} engines: {node: '>=12'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, tarball: https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz} engines: {node: '>=12'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, tarball: https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -528,30 +540,33 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==, tarball: https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==, tarball: https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==, tarball: https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.9.1': + resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==, tarball: https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==, tarball: https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, tarball: https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==, tarball: https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz} + engines: {node: '>=18.18'} '@intlify/core-base@9.14.0': resolution: {integrity: sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==} @@ -581,7 +596,7 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, tarball: https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -628,12 +643,8 @@ packages: '@octokit/types@13.5.0': resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==, tarball: https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz} '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} @@ -654,82 +665,82 @@ packages: optional: true '@rollup/rollup-android-arm-eabi@4.21.0': - resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} + resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.21.0': - resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} + resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.21.0': - resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} + resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.21.0': - resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} + resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz} cpu: [x64] os: [darwin] '@rollup/rollup-linux-arm-gnueabihf@4.21.0': - resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} + resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.21.0': - resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} + resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.21.0': - resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} + resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz} cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.21.0': - resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} + resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz} cpu: [arm64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': - resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} + resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz} cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.21.0': - resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} + resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.21.0': - resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} + resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz} cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.21.0': - resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} + resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz} cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.21.0': - resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} + resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz} cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.21.0': - resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} + resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.21.0': - resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} + resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.21.0': - resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} + resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz} cpu: [x64] os: [win32] @@ -739,11 +750,17 @@ packages: '@tsconfig/node20@20.1.4': resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==, tarball: https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz} + + '@types/eslint__js@8.42.3': + resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==, tarball: https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, tarball: https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz} '@types/lodash@4.17.7': resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} @@ -752,80 +769,73 @@ packages: resolution: {integrity: sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==} '@types/node@16.18.101': - resolution: {integrity: sha512-AAsx9Rgz2IzG8KJ6tXd6ndNkVcu+GYB6U/SnFAaokSPNx2N7dcIIfnighYUNumvj6YS2q39Dejz5tT0NCV7CWA==} + resolution: {integrity: sha512-AAsx9Rgz2IzG8KJ6tXd6ndNkVcu+GYB6U/SnFAaokSPNx2N7dcIIfnighYUNumvj6YS2q39Dejz5tT0NCV7CWA==, tarball: https://registry.npmjs.org/@types/node/-/node-16.18.101.tgz} - '@types/node@22.4.2': - resolution: {integrity: sha512-nAvM3Ey230/XzxtyDcJ+VjvlzpzoHwLsF7JaDRfoI0ytO0mVheerNmM45CtA0yOILXwXXxOrcUWH3wltX+7PSw==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/node@22.5.0': + resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==, tarball: https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, tarball: https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz} - '@typescript-eslint/eslint-plugin@7.7.0': - resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.3.0': + resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.7.0': - resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.3.0': + resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@7.7.0': - resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.3.0': + resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.7.0': - resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.3.0': + resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.7.0': - resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.3.0': + resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.7.0': - resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.3.0': + resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.7.0': - resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.3.0': + resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.7.0': - resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} - engines: {node: ^18.18.0 || >=20.0.0} + eslint: ^8.57.0 || ^9.0.0 - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/visitor-keys@8.3.0': + resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-vue@5.1.2': resolution: {integrity: sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==} @@ -844,10 +854,10 @@ packages: resolution: {integrity: sha512-sXh5Y8sqGUkgxpMWUGvRXggxYHAVxg0Pa1C42lQZuPDrW6vHJPR0VCK8Sr7WJsAW530HuNQT/ZIskmXtxjybMQ==} '@vue/babel-helper-vue-transform-on@1.2.2': - resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} + resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==, tarball: https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.2.tgz} '@vue/babel-plugin-jsx@1.2.2': - resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==} + resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==, tarball: https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.2.tgz} peerDependencies: '@babel/core': ^7.0.0-0 peerDependenciesMeta: @@ -855,7 +865,7 @@ packages: optional: true '@vue/babel-plugin-resolve-type@1.2.2': - resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==} + resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==, tarball: https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.2.tgz} peerDependencies: '@babel/core': ^7.0.0-0 @@ -878,32 +888,15 @@ packages: resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} '@vue/devtools-core@7.3.9': - resolution: {integrity: sha512-B5zAl9ulNjI6nknSnGNRzmP/ldR9ADUwwT8HkI8Hejo1W00uK9ABUahbfrXzME296rBfmwhQuCFwJ6t9KFdbXQ==} + resolution: {integrity: sha512-B5zAl9ulNjI6nknSnGNRzmP/ldR9ADUwwT8HkI8Hejo1W00uK9ABUahbfrXzME296rBfmwhQuCFwJ6t9KFdbXQ==, tarball: https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.3.9.tgz} peerDependencies: vue: ^3.0.0 '@vue/devtools-kit@7.3.9': - resolution: {integrity: sha512-Gr17nA+DaQzqyhNx1DUJr1CJRzTRfbIuuC80ZgU8MD/qNO302tv9la+ROi+Uaw+ULVwU9T71GnwLy4n8m9Lspg==} + resolution: {integrity: sha512-Gr17nA+DaQzqyhNx1DUJr1CJRzTRfbIuuC80ZgU8MD/qNO302tv9la+ROi+Uaw+ULVwU9T71GnwLy4n8m9Lspg==, tarball: https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.9.tgz} '@vue/devtools-shared@7.3.9': - resolution: {integrity: sha512-CdfMRZKXyI8vw+hqOcQIiLihB6Hbbi7WNZGp7LsuH1Qe4aYAFmTaKjSciRZ301oTnwmU/knC/s5OGuV6UNiNoA==} - - '@vue/eslint-config-prettier@9.0.0': - resolution: {integrity: sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==} - peerDependencies: - eslint: '>= 8.0.0' - prettier: '>= 3.0.0' - - '@vue/eslint-config-typescript@13.0.0': - resolution: {integrity: sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - eslint-plugin-vue: ^9.0.0 - typescript: '>=4.7.4' - peerDependenciesMeta: - typescript: - optional: true + resolution: {integrity: sha512-CdfMRZKXyI8vw+hqOcQIiLihB6Hbbi7WNZGp7LsuH1Qe4aYAFmTaKjSciRZ301oTnwmU/knC/s5OGuV6UNiNoA==, tarball: https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.9.tgz} '@vue/language-core@2.0.29': resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} @@ -933,30 +926,30 @@ packages: '@vue/tsconfig@0.5.1': resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} - '@vueuse/core@11.0.1': - resolution: {integrity: sha512-YTrekI18WwEyP3h168Fir94G/HNC27wvXJI21Alm0sPOwvhihfkrvHIe+5PNJq+MpgWdRcsjvE/38JaoKrgZhQ==} + '@vueuse/core@11.0.3': + resolution: {integrity: sha512-RENlh64+SYA9XMExmmH1a3TPqeIuJBNNB/63GT35MZI+zpru3oMRUA6cEFr9HmGqEgUisurwGwnIieF6qu3aXw==, tarball: https://registry.npmjs.org/@vueuse/core/-/core-11.0.3.tgz} - '@vueuse/metadata@11.0.1': - resolution: {integrity: sha512-dTFvuHFAjLYOiSd+t9Sk7xUiuL6jbfay/eX+g+jaipXXlwKur2VCqBCZX+jfu+2vROUGcUsdn3fJR9KkpadIOg==} + '@vueuse/metadata@11.0.3': + resolution: {integrity: sha512-+FtbO4SD5WpsOcQTcC0hAhNlOid6QNLzqedtquTtQ+CRNBoAt9GuV07c6KNHK1wCmlq8DFPwgiLF2rXwgSHX5Q==, tarball: https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.0.3.tgz} - '@vueuse/shared@11.0.1': - resolution: {integrity: sha512-eAPf5CQB3HR0S76HqrhjBqFYstZfiHWZq8xF9EQmobGBkrhPfErJEhr8aMNQMqd6MkENIx2pblIEfJGlHpClug==} + '@vueuse/shared@11.0.3': + resolution: {integrity: sha512-0rY2m6HS5t27n/Vp5cTDsKTlNnimCqsbh/fmT2LgE+aaU42EMfXo8+bNX91W9I7DDmxfuACXMmrd7d79JxkqWA==, tarball: https://registry.npmjs.org/@vueuse/shared/-/shared-11.0.3.tgz} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==, tarball: https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz} engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, tarball: https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz} ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, tarball: https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz} engines: {node: '>=8'} ansi-styles@3.2.1: @@ -964,7 +957,7 @@ packages: engines: {node: '>=4'} ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz} engines: {node: '>=8'} ansi-styles@6.2.1: @@ -972,15 +965,11 @@ packages: engines: {node: '>=12'} anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz} engines: {node: '>= 8'} argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, tarball: https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz} asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} @@ -993,10 +982,10 @@ packages: engines: {node: '>= 0.4'} b-tween@0.3.3: - resolution: {integrity: sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==} + resolution: {integrity: sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==, tarball: https://registry.npmjs.org/b-tween/-/b-tween-0.3.3.tgz} b-validate@1.5.3: - resolution: {integrity: sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==} + resolution: {integrity: sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==, tarball: https://registry.npmjs.org/b-validate/-/b-validate-1.5.3.tgz} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1008,11 +997,11 @@ packages: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, tarball: https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz} engines: {node: '>=8'} birpc@0.2.17: - resolution: {integrity: sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==} + resolution: {integrity: sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==, tarball: https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz} bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -1024,17 +1013,13 @@ packages: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, tarball: https://registry.npmjs.org/braces/-/braces-3.0.3.tgz} engines: {node: '>=8'} brorand@1.1.0: @@ -1063,7 +1048,7 @@ packages: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==, tarball: https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1077,7 +1062,7 @@ packages: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==, tarball: https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz} engines: {node: '>=18'} call-bind@1.0.7: @@ -1085,26 +1070,26 @@ packages: engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, tarball: https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz} engines: {node: '>=6'} camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, tarball: https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz} engines: {node: '>=10'} caniuse-lite@1.0.30001653: - resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} + resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz} engines: {node: '>=10'} chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, tarball: https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz} engines: {node: '>= 8.10.0'} cipher-base@1.0.4: @@ -1114,7 +1099,7 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz} engines: {node: '>=7.0.0'} color-name@1.1.3: @@ -1124,10 +1109,10 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, tarball: https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz} color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==, tarball: https://registry.npmjs.org/color/-/color-3.2.1.tgz} commander@12.0.0: resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} @@ -1137,13 +1122,13 @@ packages: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==, tarball: https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz} computeds@0.0.1: resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz} console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} @@ -1152,13 +1137,13 @@ packages: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz} copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, tarball: https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz} engines: {node: '>=12.13'} copy-to-clipboard@3.3.3: @@ -1209,17 +1194,8 @@ packages: supports-color: optional: true - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==, tarball: https://registry.npmjs.org/debug/-/debug-4.3.6.tgz} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1228,14 +1204,14 @@ packages: optional: true deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, tarball: https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz} default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==, tarball: https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz} engines: {node: '>=18'} default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==, tarball: https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz} engines: {node: '>=18'} define-data-property@1.1.4: @@ -1243,7 +1219,7 @@ packages: engines: {node: '>= 0.4'} define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==, tarball: https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz} engines: {node: '>=12'} define-properties@1.2.1: @@ -1256,14 +1232,6 @@ packages: diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - domain-browser@4.23.0: resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} engines: {node: '>=10'} @@ -1272,7 +1240,7 @@ packages: resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz} elliptic@6.5.5: resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} @@ -1282,11 +1250,11 @@ packages: engines: {node: '>=0.12'} errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, tarball: https://registry.npmjs.org/errno/-/errno-0.1.8.tgz} hasBin: true error-stack-parser-es@0.1.5: - resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==, tarball: https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz} es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} @@ -1302,7 +1270,7 @@ packages: hasBin: true escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, tarball: https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -1310,29 +1278,15 @@ packages: engines: {node: '>=0.8.0'} escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, tarball: https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} engines: {node: '>=10'} eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, tarball: https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.1.3: - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - eslint-plugin-vue@9.27.0: resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==} engines: {node: ^14.17.0 || >=16.0.0} @@ -1340,26 +1294,39 @@ packages: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, tarball: https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==, tarball: https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==, tarball: https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.9.1: + resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==, tarball: https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==, tarball: https://registry.npmjs.org/espree/-/espree-10.1.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, tarball: https://registry.npmjs.org/espree/-/espree-9.6.1.tgz} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -1376,7 +1343,7 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, tarball: https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz} engines: {node: '>=0.10.0'} events@3.3.0: @@ -1387,63 +1354,53 @@ packages: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, tarball: https://registry.npmjs.org/execa/-/execa-8.0.1.tgz} engines: {node: '>=16.17'} fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, tarball: https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, tarball: https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, tarball: https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, tarball: https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz} + engines: {node: '>=16.0.0'} fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, tarball: https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz} engines: {node: '>=8'} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, tarball: https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz} + engines: {node: '>=16'} flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, tarball: https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz} engines: {node: '>=14.14'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -1451,7 +1408,7 @@ packages: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz} engines: {node: '>=6.9.0'} get-intrinsic@1.2.4: @@ -1459,21 +1416,17 @@ packages: engines: {node: '>= 0.4'} get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, tarball: https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz} engines: {node: '>=16'} glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz} engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz} engines: {node: '>=10.13.0'} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -1482,25 +1435,25 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, tarball: https://registry.npmjs.org/globals/-/globals-14.0.0.tgz} + engines: {node: '>=18'} gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz} graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, tarball: https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz} engines: {node: '>=8'} has-property-descriptors@1.0.2: @@ -1541,17 +1494,17 @@ packages: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, tarball: https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz} html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==, tarball: https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz} engines: {node: '>=8'} https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, tarball: https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz} engines: {node: '>=16.17.0'} iconv-lite@0.6.3: @@ -1566,25 +1519,21 @@ packages: engines: {node: '>= 4'} image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, tarball: https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz} engines: {node: '>=0.10.0'} hasBin: true immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==, tarball: https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz} import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, tarball: https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz} engines: {node: '>=6'} imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, tarball: https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz} engines: {node: '>=0.8.19'} - 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.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1593,10 +1542,10 @@ packages: engines: {node: '>= 0.4'} is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, tarball: https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz} is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz} engines: {node: '>=8'} is-callable@1.2.7: @@ -1607,7 +1556,7 @@ packages: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, tarball: https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true @@ -1624,7 +1573,7 @@ packages: engines: {node: '>=0.10.0'} is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, tarball: https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz} engines: {node: '>=14.16'} hasBin: true @@ -1633,15 +1582,15 @@ packages: engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz} engines: {node: '>=0.12.0'} is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, tarball: https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz} engines: {node: '>=8'} is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, tarball: https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} is-typed-array@1.1.13: @@ -1652,11 +1601,11 @@ packages: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, tarball: https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz} engines: {node: '>=12.13'} is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, tarball: https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz} engines: {node: '>=16'} isarray@1.0.0: @@ -1673,7 +1622,7 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, tarball: https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz} hasBin: true jsesc@2.5.2: @@ -1682,31 +1631,31 @@ packages: hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz} json-parse-even-better-errors@3.0.2: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, tarball: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, tarball: https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz} json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://registry.npmjs.org/json5/-/json5-2.2.3.tgz} engines: {node: '>=6'} hasBin: true jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz} keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, tarball: https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz} kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==, tarball: https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz} less@4.2.0: resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} @@ -1714,7 +1663,7 @@ packages: hasBin: true levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, tarball: https://registry.npmjs.org/levn/-/levn-0.4.1.tgz} engines: {node: '>= 0.8.0'} locate-path@6.0.0: @@ -1722,26 +1671,26 @@ packages: engines: {node: '>=10'} lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, tarball: https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz} lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz} magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz} magic-string@0.30.9: resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} engines: {node: '>=12'} make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, tarball: https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz} engines: {node: '>=6'} md5.js@1.3.5: @@ -1752,14 +1701,14 @@ packages: engines: {node: '>= 0.10.0'} merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, tarball: https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz} merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, tarball: https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz} engines: {node: '>= 8'} micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, tarball: https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz} engines: {node: '>=8.6'} miller-rabin@4.0.1: @@ -1767,12 +1716,12 @@ packages: hasBin: true mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, tarball: https://registry.npmjs.org/mime/-/mime-1.6.0.tgz} engines: {node: '>=4'} hasBin: true mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, tarball: https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz} engines: {node: '>=12'} minimalistic-assert@1.0.1: @@ -1782,7 +1731,7 @@ packages: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, tarball: https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} @@ -1796,7 +1745,7 @@ packages: hasBin: true mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==, tarball: https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz} engines: {node: '>=10'} ms@2.1.2: @@ -1814,19 +1763,19 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==, tarball: https://registry.npmjs.org/needle/-/needle-3.3.1.tgz} engines: {node: '>= 4.4.x'} hasBin: true node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==, tarball: https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz} node-stdlib-browser@1.2.0: resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} engines: {node: '>=10'} normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz} engines: {node: '>=0.10.0'} normalize.css@8.0.1: @@ -1842,14 +1791,14 @@ packages: hasBin: true npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, tarball: https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} number-precision@1.6.0: - resolution: {integrity: sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==} + resolution: {integrity: sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==, tarball: https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz} object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -1866,19 +1815,16 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, tarball: https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz} engines: {node: '>=12'} open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==, tarball: https://registry.npmjs.org/open/-/open-10.1.0.tgz} engines: {node: '>=18'} optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, tarball: https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz} engines: {node: '>= 0.8.0'} os-browserify@0.3.0: @@ -1896,7 +1842,7 @@ packages: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, tarball: https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz} engines: {node: '>=6'} parse-asn1@5.1.7: @@ -1914,34 +1860,26 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, tarball: https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz} engines: {node: '>=12'} path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, tarball: https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz} pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==, tarball: https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz} picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -1995,13 +1933,9 @@ packages: engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, tarball: https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} @@ -2024,7 +1958,7 @@ packages: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, tarball: https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz} engines: {node: '>=6'} qs@6.12.1: @@ -2056,14 +1990,14 @@ packages: engines: {node: '>= 6'} readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz} engines: {node: '>=8.10.0'} resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==, tarball: https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz} resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, tarball: https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz} engines: {node: '>=4'} resolve@1.22.8: @@ -2075,12 +2009,7 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, tarball: https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz} ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} @@ -2091,7 +2020,7 @@ packages: hasBin: true run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==, tarball: https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz} engines: {node: '>=18'} run-parallel@1.2.0: @@ -2107,7 +2036,7 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sass@1.77.8: - resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} + resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==, tarball: https://registry.npmjs.org/sass/-/sass-1.77.8.tgz} engines: {node: '>=14.0.0'} hasBin: true @@ -2115,14 +2044,14 @@ packages: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} scroll-into-view-if-needed@2.2.31: - resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==, tarball: https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz} semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, tarball: https://registry.npmjs.org/semver/-/semver-6.3.1.tgz} hasBin: true semver@7.6.2: @@ -2157,30 +2086,26 @@ packages: engines: {node: '>= 0.4'} signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, tarball: https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz} engines: {node: '>=14'} simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, tarball: https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz} sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==, tarball: https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz} engines: {node: '>= 10'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz} engines: {node: '>=0.10.0'} speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==, tarball: https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz} engines: {node: '>=0.10.0'} stream-browserify@3.0.0: @@ -2196,19 +2121,19 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, tarball: https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz} engines: {node: '>=8'} strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, tarball: https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz} engines: {node: '>=12'} strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, tarball: https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz} engines: {node: '>=8'} superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, tarball: https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz} engines: {node: '>=16'} supports-color@5.5.0: @@ -2216,7 +2141,7 @@ packages: engines: {node: '>=4'} supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz} engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: @@ -2224,14 +2149,10 @@ packages: engines: {node: '>= 0.4'} svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, tarball: https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz} text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, tarball: https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz} timers-browserify@2.0.12: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} @@ -2242,18 +2163,18 @@ packages: engines: {node: '>=4'} to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz} engines: {node: '>=8.0'} toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==, tarball: https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz} engines: {node: '>=6'} ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==, tarball: https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -2268,36 +2189,45 @@ packages: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, tarball: https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz} engines: {node: '>= 0.8.0'} type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + typescript-eslint@8.3.0: + resolution: {integrity: sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==, tarball: https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.3.0.tgz} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true undici-types@6.19.6: - resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==} + resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==, tarball: https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz} universal-user-agent@7.0.2: resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, tarball: https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz} engines: {node: '>= 10.0.0'} update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==, tarball: https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, tarball: https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz} url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} @@ -2317,15 +2247,15 @@ packages: hasBin: true vite-bundle-analyzer@0.10.6: - resolution: {integrity: sha512-w/5wvRZeZo2lKdJzRGCTn4YW/mT++fKeii2PQPK3odblfFqsODYHF72V+QTg1Xznbxy543N0WfT5vPiSosVWxA==} + resolution: {integrity: sha512-w/5wvRZeZo2lKdJzRGCTn4YW/mT++fKeii2PQPK3odblfFqsODYHF72V+QTg1Xznbxy543N0WfT5vPiSosVWxA==, tarball: https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-0.10.6.tgz} vite-hot-client@0.2.3: - resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} + resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==, tarball: https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.3.tgz} peerDependencies: vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 vite-plugin-inspect@0.8.7: - resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==} + resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==, tarball: https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.7.tgz} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' @@ -2340,13 +2270,13 @@ packages: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 vite-plugin-vue-devtools@7.3.9: - resolution: {integrity: sha512-ybDV2kepW0NpusvtfbRKHs0pvyrReNcFtL572gyZ6Alox6u5uebYefd2eAG/7mJSU3NPI5UxUH1e/Mof5exdlw==} + resolution: {integrity: sha512-ybDV2kepW0NpusvtfbRKHs0pvyrReNcFtL572gyZ6Alox6u5uebYefd2eAG/7mJSU3NPI5UxUH1e/Mof5exdlw==, tarball: https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.3.9.tgz} engines: {node: '>=v14.21.3'} peerDependencies: vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 vite-plugin-vue-inspector@5.1.3: - resolution: {integrity: sha512-pMrseXIDP1Gb38mOevY+BvtNGNqiqmqa2pKB99lnLsADQww9w9xMbAfT4GB6RUoaOkSPrtlXqpq2Fq+Dj2AgFg==} + resolution: {integrity: sha512-pMrseXIDP1Gb38mOevY+BvtNGNqiqmqa2pKB99lnLsADQww9w9xMbAfT4GB6RUoaOkSPrtlXqpq2Fq+Dj2AgFg==, tarball: https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.1.3.tgz} peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 @@ -2422,14 +2352,8 @@ packages: '@vue/runtime-core': optional: true - vue-eslint-parser@9.4.2: - resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - vue-eslint-parser@9.4.3: - resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==, tarball: https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' @@ -2478,9 +2402,6 @@ packages: engines: {node: '>= 8'} hasBin: true - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -2490,7 +2411,7 @@ packages: engines: {node: '>=0.4'} yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} @@ -2892,19 +2813,27 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1)': dependencies: - eslint: 8.57.0 + eslint: 9.9.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - '@eslint/eslintrc@2.1.4': + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 + debug: 4.3.6 + espree: 10.1.0 + globals: 14.0.0 ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2913,19 +2842,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@9.9.1': {} - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@eslint/object-schema@2.1.4': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.0': {} '@intlify/core-base@9.14.0': dependencies: @@ -3010,8 +2933,6 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 - '@pkgr/core@0.1.1': {} - '@polka/url@1.0.0-next.25': {} '@rollup/plugin-inject@5.0.5(rollup@4.21.0)': @@ -3082,6 +3003,15 @@ snapshots: '@tsconfig/node20@20.1.4': {} + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/eslint__js@8.42.3': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree@1.0.5': {} '@types/json-schema@7.0.15': {} @@ -3092,74 +3022,70 @@ snapshots: '@types/node@16.18.101': {} - '@types/node@22.4.2': + '@types/node@22.5.0': dependencies: undici-types: 6.19.6 - '@types/semver@7.5.8': {} - '@types/uuid@10.0.0': {} '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/type-utils': 7.7.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4 - eslint: 8.57.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 + eslint: 9.9.1 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4 - eslint: 8.57.0 + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.6 + eslint: 9.9.1 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.7.0': + '@typescript-eslint/scope-manager@8.3.0': dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 - '@typescript-eslint/type-utils@7.7.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.3.0(eslint@9.9.1)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.4 - eslint: 8.57.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + debug: 4.3.6 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@7.7.0': {} + '@typescript-eslint/types@8.3.0': {} - '@typescript-eslint/typescript-estree@7.7.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@8.3.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4 - globby: 11.1.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.6 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.2 @@ -3169,30 +3095,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.7.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/utils@8.3.0(eslint@9.9.1)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.5.4) - eslint: 8.57.0 - semver: 7.6.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + eslint: 9.9.1 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.7.0': + '@typescript-eslint/visitor-keys@8.3.0': dependencies: - '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/types': 8.3.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} - - '@vitejs/plugin-vue@5.1.2(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4))': + '@vitejs/plugin-vue@5.1.2(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4))': dependencies: - vite: 5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8) vue: 3.4.38(typescript@5.5.4) '@volar/language-core@2.4.0-alpha.18': @@ -3273,14 +3194,14 @@ snapshots: '@vue/devtools-api@6.6.3': {} - '@vue/devtools-core@7.3.9(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4))': + '@vue/devtools-core@7.3.9(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4))': dependencies: '@vue/devtools-kit': 7.3.9 '@vue/devtools-shared': 7.3.9 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)) + vite-hot-client: 0.2.3(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)) vue: 3.4.38(typescript@5.5.4) transitivePeerDependencies: - vite @@ -3299,27 +3220,6 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/eslint-config-prettier@9.0.0(eslint@8.57.0)(prettier@3.3.3)': - dependencies: - eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-plugin-prettier: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3) - prettier: 3.3.3 - transitivePeerDependencies: - - '@types/eslint' - - '@vue/eslint-config-typescript@13.0.0(eslint-plugin-vue@9.27.0(eslint@8.57.0))(eslint@8.57.0)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.5.4) - eslint: 8.57.0 - eslint-plugin-vue: 9.27.0(eslint@8.57.0) - vue-eslint-parser: 9.4.2(eslint@8.57.0) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - '@vue/language-core@2.0.29(typescript@5.5.4)': dependencies: '@volar/language-core': 2.4.0-alpha.18 @@ -3359,30 +3259,30 @@ snapshots: '@vue/tsconfig@0.5.1': {} - '@vueuse/core@11.0.1(vue@3.4.38(typescript@5.5.4))': + '@vueuse/core@11.0.3(vue@3.4.38(typescript@5.5.4))': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 11.0.1 - '@vueuse/shared': 11.0.1(vue@3.4.38(typescript@5.5.4)) + '@vueuse/metadata': 11.0.3 + '@vueuse/shared': 11.0.3(vue@3.4.38(typescript@5.5.4)) vue-demi: 0.14.10(vue@3.4.38(typescript@5.5.4)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/metadata@11.0.1': {} + '@vueuse/metadata@11.0.3': {} - '@vueuse/shared@11.0.1(vue@3.4.38(typescript@5.5.4))': + '@vueuse/shared@11.0.3(vue@3.4.38(typescript@5.5.4))': dependencies: vue-demi: 0.14.10(vue@3.4.38(typescript@5.5.4)) transitivePeerDependencies: - '@vue/composition-api' - vue - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 - acorn@8.11.3: {} + acorn@8.12.1: {} ajv@6.12.6: dependencies: @@ -3411,8 +3311,6 @@ snapshots: argparse@2.0.1: {} - array-union@2.1.0: {} - asn1.js@4.10.1: dependencies: bn.js: 4.12.0 @@ -3461,14 +3359,9 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 - optional: true brorand@1.1.0: {} @@ -3691,10 +3584,6 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.5: - dependencies: - ms: 2.1.2 - debug@4.3.6: dependencies: ms: 2.1.2 @@ -3733,14 +3622,6 @@ snapshots: miller-rabin: 4.0.1 randombytes: 2.1.0 - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - domain-browser@4.23.0: {} echarts@5.5.1: @@ -3807,29 +3688,20 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@9.9.1): dependencies: - eslint: 8.57.0 + eslint: 9.9.1 - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3): + eslint-plugin-vue@9.27.0(eslint@9.9.1): dependencies: - eslint: 8.57.0 - prettier: 3.3.3 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.57.0) - - eslint-plugin-vue@9.27.0(eslint@8.57.0): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + eslint: 9.9.1 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.0 semver: 7.6.2 - vue-eslint-parser: 9.4.3(eslint@8.57.0) + vue-eslint-parser: 9.4.3(eslint@9.9.1) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -3839,40 +3711,43 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint-visitor-keys@4.0.0: {} + + eslint@9.9.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.9.1 '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 + debug: 4.3.6 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -3884,15 +3759,17 @@ snapshots: transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.1.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 - esquery@1.5.0: + espree@9.6.1: dependencies: - estraverse: 5.3.0 + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 esquery@1.6.0: dependencies: @@ -3929,8 +3806,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3947,29 +3822,23 @@ snapshots: dependencies: reusify: 1.0.4 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - optional: true find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.1: {} @@ -3983,8 +3852,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -4010,29 +3877,13 @@ 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.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - globals@11.12.0: {} globals@13.24.0: dependencies: type-fest: 0.20.2 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 + globals@14.0.0: {} gopd@1.0.1: dependencies: @@ -4116,11 +3967,6 @@ snapshots: imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} is-arguments@1.1.1: @@ -4279,7 +4125,7 @@ snapshots: micromatch@4.0.5: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 miller-rabin@4.0.1: @@ -4401,10 +4247,6 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -4456,16 +4298,12 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} path-parse@1.0.7: {} - path-type@4.0.0: {} - pathe@1.1.2: {} pbkdf2@3.1.2: @@ -4522,10 +4360,6 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - prettier@3.3.3: {} process-nextick-args@2.0.1: {} @@ -4605,10 +4439,6 @@ snapshots: rfdc@1.4.1: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - ripemd160@2.0.2: dependencies: hash-base: 3.1.0 @@ -4713,8 +4543,6 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 - slash@3.0.0: {} - source-map-js@1.2.0: {} source-map@0.6.1: @@ -4766,11 +4594,6 @@ snapshots: svg-tags@1.0.0: {} - synckit@0.8.8: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.2 - text-table@0.2.0: {} timers-browserify@2.0.12: @@ -4803,6 +4626,17 @@ snapshots: type-fest@0.20.2: {} + typescript-eslint@8.3.0(eslint@9.9.1)(typescript@5.5.4): + dependencies: + '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/parser': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + typescript@5.5.4: {} undici-types@6.19.6: {} @@ -4842,11 +4676,11 @@ snapshots: vite-bundle-analyzer@0.10.6: {} - vite-hot-client@0.2.3(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)): + vite-hot-client@0.2.3(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)): dependencies: - vite: 5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.21.0)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)): + vite-plugin-inspect@0.8.7(rollup@4.21.0)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.21.0) @@ -4857,36 +4691,36 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.0.1 sirv: 2.0.4 - vite: 5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.21.0)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.21.0)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.21.0) node-stdlib-browser: 1.2.0 - vite: 5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - rollup - vite-plugin-vue-devtools@7.3.9(rollup@4.21.0)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)): + vite-plugin-vue-devtools@7.3.9(rollup@4.21.0)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)): dependencies: - '@vue/devtools-core': 7.3.9(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) + '@vue/devtools-core': 7.3.9(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) '@vue/devtools-kit': 7.3.9 '@vue/devtools-shared': 7.3.9 execa: 8.0.1 sirv: 2.0.4 - vite: 5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.21.0)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.1.3(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)) + vite: 5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8) + vite-plugin-inspect: 0.8.7(rollup@4.21.0)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.1.3(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.1.3(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)): + vite-plugin-vue-inspector@5.1.3(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)): dependencies: '@babel/core': 7.25.2 '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) @@ -4897,17 +4731,17 @@ snapshots: '@vue/compiler-dom': 3.4.38 kolorist: 1.8.0 magic-string: 0.30.11 - vite: 5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8): + vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8): dependencies: esbuild: 0.21.5 postcss: 8.4.41 rollup: 4.21.0 optionalDependencies: - '@types/node': 22.4.2 + '@types/node': 22.5.0 fsevents: 2.3.3 less: 4.2.0 sass: 1.77.8 @@ -4916,9 +4750,9 @@ snapshots: vscode-uri@3.0.8: {} - vue-2048@3.0.5(typescript@5.5.4)(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8)): + vue-2048@3.0.5(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8)): dependencies: - '@vitejs/plugin-vue': 5.1.2(vite@5.4.2(@types/node@22.4.2)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) + '@vitejs/plugin-vue': 5.1.2(vite@5.4.2(@types/node@22.5.0)(less@4.2.0)(sass@1.77.8))(vue@3.4.38(typescript@5.5.4)) vue: 3.4.38(typescript@5.5.4) transitivePeerDependencies: - typescript @@ -4942,23 +4776,10 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' - vue-eslint-parser@9.4.2(eslint@8.57.0): + vue-eslint-parser@9.4.3(eslint@9.9.1): dependencies: - debug: 4.3.4 - eslint: 8.57.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - lodash: 4.17.21 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - vue-eslint-parser@9.4.3(eslint@8.57.0): - dependencies: - debug: 4.3.5 - eslint: 8.57.0 + debug: 4.3.6 + eslint: 9.9.1 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -5014,8 +4835,6 @@ snapshots: dependencies: isexe: 2.0.0 - wrappy@1.0.2: {} - xml-name-validator@4.0.0: {} xtend@4.0.2: {} diff --git a/webui/src/App.vue b/webui/src/App.vue index 7bcf031ca0..a08cd01344 100644 --- a/webui/src/App.vue +++ b/webui/src/App.vue @@ -19,12 +19,12 @@ @after-enter="onAfterEnter" > - + diff --git a/webui/src/components/asyncMethod.vue b/webui/src/components/asyncMethod.vue index c64ca0d688..ad4ca8a046 100644 --- a/webui/src/components/asyncMethod.vue +++ b/webui/src/components/asyncMethod.vue @@ -9,14 +9,17 @@ const loading = ref(false) const error = ref() defineSlots<{ + // eslint-disable-next-line @typescript-eslint/no-explicit-any default(props: { run: (...arg: any) => Promise; loading: boolean; error?: Error }): any }>() const props = defineProps<{ once?: boolean + // eslint-disable-next-line @typescript-eslint/no-explicit-any asyncFn: (...arg: any) => Promise }>() +// eslint-disable-next-line @typescript-eslint/no-explicit-any const run = async (...arg: any) => { if (loading.value && props.once) return loading.value = true diff --git a/webui/src/components/autoUpdateBtn.vue b/webui/src/components/autoUpdateBtn.vue index b351c2276f..30855948a1 100644 --- a/webui/src/components/autoUpdateBtn.vue +++ b/webui/src/components/autoUpdateBtn.vue @@ -1,6 +1,7 @@ @@ -50,7 +51,7 @@ const { t } = useI18n() .chart { height: 440px; } -.chart-error{ +.chart-error { display: flex; flex-direction: column; align-items: center; From 59a6b0d323ae8fa185a7f1fe9039c783d44c97de Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Tue, 27 Aug 2024 17:45:07 +0800 Subject: [PATCH 09/87] add support for shadow ban --- .../impl/qbittorrent/QBittorrent.java | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java index 65f332abdf..25876d31e4 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java @@ -139,9 +139,9 @@ public boolean isLoggedIn() { @Override public void setBanList(@NotNull Collection fullList, @Nullable Collection added, @Nullable Collection removed, boolean applyFullList) { if (removed != null && removed.isEmpty() && added != null && config.isIncrementBan() && !applyFullList) { - setBanListIncrement(added); + setBanListIncrement(added, config.useShadowBan); } else { - setBanListFull(fullList); + setBanListFull(fullList, config.useShadowBan); } } @@ -210,7 +210,7 @@ public List getPeers(Torrent torrent) { return peersList; } - private void setBanListIncrement(Collection added) { + private void setBanListIncrement(Collection added, boolean useShadowBan) { Map banTasks = new HashMap<>(); added.forEach(p -> { StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); @@ -220,7 +220,7 @@ private void setBanListIncrement(Collection added) { banTasks.forEach((hash, peers) -> { try { HttpResponse request = httpClient.send(MutableRequest - .POST(apiEndpoint + "/transfer/banPeers", FormBodyPublisher.newBuilder() + .POST(apiEndpoint + (useShadowBan ? "/transfer/shadowbanPeers" : "/transfer/banPeers"), FormBodyPublisher.newBuilder() .query("hash", hash) .query("peers", peers.toString()).build()) .header("Content-Type", "application/x-www-form-urlencoded") @@ -234,40 +234,15 @@ private void setBanListIncrement(Collection added) { throw new IllegalStateException(e); } }); -// -// Map banTasks = new HashMap<>(); -// added.forEach(p -> { -// StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); -// IPAddress ipAddress = IPAddressUtil.getIPAddress(p.getPeer().getAddress().getIp()); -// -// banTasks.put(p.getTorrent().getHash(), joiner); -// }); -// banTasks.forEach((hash, peers) -> { -// try { -// HttpResponse request = httpClient.send(MutableRequest -// .POST(apiEndpoint + "/transfer/banPeers", FormBodyPublisher.newBuilder() -// .query("hash", hash) -// .query("peers", peers.toString()).build()) -// .header("Content-Type", "application/x-www-form-urlencoded") -// , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); -// if (request.statusCode() != 200) { -// log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); -// throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); -// } -// } catch (Exception e) { -// log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); -// throw new IllegalStateException(e); -// } -// }); } - private void setBanListFull(Collection peerAddresses) { + private void setBanListFull(Collection peerAddresses, boolean useShadowBan) { StringJoiner joiner = new StringJoiner("\n"); peerAddresses.forEach(p -> joiner.add(p.getIp())); try { HttpResponse request = httpClient.send(MutableRequest .POST(apiEndpoint + "/app/setPreferences", FormBodyPublisher.newBuilder() - .query("json", JsonUtil.getGson().toJson(Map.of("banned_IPs", joiner.toString()))).build()) + .query("json", JsonUtil.getGson().toJson(Map.of(useShadowBan ? "shadow_banned_IPs" : "banned_IPs", joiner.toString()))).build()) .header("Content-Type", "application/x-www-form-urlencoded") , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); if (request.statusCode() != 200) { @@ -297,6 +272,7 @@ public static class Config { private BasicauthDTO basicAuth; private String httpVersion; private boolean incrementBan; + private boolean useShadowBan; private boolean verifySsl; public static Config readFromYaml(ConfigurationSection section) { @@ -314,6 +290,7 @@ public static Config readFromYaml(ConfigurationSection section) { config.setBasicAuth(basicauthDTO); config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setIncrementBan(section.getBoolean("increment-ban", false)); + config.setUseShadowBan(section.getBoolean("use-shadow-ban", false)); config.setVerifySsl(section.getBoolean("verify-ssl", true)); return config; } @@ -328,6 +305,7 @@ public YamlConfiguration saveToYaml() { section.set("basic-auth.pass", Objects.requireNonNullElse(basicAuth.pass, "")); section.set("http-version", httpVersion); section.set("increment-ban", incrementBan); + section.set("use-shadow-ban", useShadowBan); section.set("verify-ssl", verifySsl); return section; } From ee191cc7000f50601095302e961fa70470e6510d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 27 Aug 2024 18:40:25 +0800 Subject: [PATCH 10/87] =?UTF-8?q?=E5=A4=8D=E5=88=B6=E5=88=B0=20qbEE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/qbittorrent/QBittorrent.java | 40 ++- .../impl/qbittorrent/QBittorrentEE.java | 322 ++++++++++++++++++ 2 files changed, 353 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java index 25876d31e4..65f332abdf 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java @@ -139,9 +139,9 @@ public boolean isLoggedIn() { @Override public void setBanList(@NotNull Collection fullList, @Nullable Collection added, @Nullable Collection removed, boolean applyFullList) { if (removed != null && removed.isEmpty() && added != null && config.isIncrementBan() && !applyFullList) { - setBanListIncrement(added, config.useShadowBan); + setBanListIncrement(added); } else { - setBanListFull(fullList, config.useShadowBan); + setBanListFull(fullList); } } @@ -210,7 +210,7 @@ public List getPeers(Torrent torrent) { return peersList; } - private void setBanListIncrement(Collection added, boolean useShadowBan) { + private void setBanListIncrement(Collection added) { Map banTasks = new HashMap<>(); added.forEach(p -> { StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); @@ -220,7 +220,7 @@ private void setBanListIncrement(Collection added, boolean useShado banTasks.forEach((hash, peers) -> { try { HttpResponse request = httpClient.send(MutableRequest - .POST(apiEndpoint + (useShadowBan ? "/transfer/shadowbanPeers" : "/transfer/banPeers"), FormBodyPublisher.newBuilder() + .POST(apiEndpoint + "/transfer/banPeers", FormBodyPublisher.newBuilder() .query("hash", hash) .query("peers", peers.toString()).build()) .header("Content-Type", "application/x-www-form-urlencoded") @@ -234,15 +234,40 @@ private void setBanListIncrement(Collection added, boolean useShado throw new IllegalStateException(e); } }); +// +// Map banTasks = new HashMap<>(); +// added.forEach(p -> { +// StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); +// IPAddress ipAddress = IPAddressUtil.getIPAddress(p.getPeer().getAddress().getIp()); +// +// banTasks.put(p.getTorrent().getHash(), joiner); +// }); +// banTasks.forEach((hash, peers) -> { +// try { +// HttpResponse request = httpClient.send(MutableRequest +// .POST(apiEndpoint + "/transfer/banPeers", FormBodyPublisher.newBuilder() +// .query("hash", hash) +// .query("peers", peers.toString()).build()) +// .header("Content-Type", "application/x-www-form-urlencoded") +// , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); +// if (request.statusCode() != 200) { +// log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); +// throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); +// } +// } catch (Exception e) { +// log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); +// throw new IllegalStateException(e); +// } +// }); } - private void setBanListFull(Collection peerAddresses, boolean useShadowBan) { + private void setBanListFull(Collection peerAddresses) { StringJoiner joiner = new StringJoiner("\n"); peerAddresses.forEach(p -> joiner.add(p.getIp())); try { HttpResponse request = httpClient.send(MutableRequest .POST(apiEndpoint + "/app/setPreferences", FormBodyPublisher.newBuilder() - .query("json", JsonUtil.getGson().toJson(Map.of(useShadowBan ? "shadow_banned_IPs" : "banned_IPs", joiner.toString()))).build()) + .query("json", JsonUtil.getGson().toJson(Map.of("banned_IPs", joiner.toString()))).build()) .header("Content-Type", "application/x-www-form-urlencoded") , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); if (request.statusCode() != 200) { @@ -272,7 +297,6 @@ public static class Config { private BasicauthDTO basicAuth; private String httpVersion; private boolean incrementBan; - private boolean useShadowBan; private boolean verifySsl; public static Config readFromYaml(ConfigurationSection section) { @@ -290,7 +314,6 @@ public static Config readFromYaml(ConfigurationSection section) { config.setBasicAuth(basicauthDTO); config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setIncrementBan(section.getBoolean("increment-ban", false)); - config.setUseShadowBan(section.getBoolean("use-shadow-ban", false)); config.setVerifySsl(section.getBoolean("verify-ssl", true)); return config; } @@ -305,7 +328,6 @@ public YamlConfiguration saveToYaml() { section.set("basic-auth.pass", Objects.requireNonNullElse(basicAuth.pass, "")); section.set("http-version", httpVersion); section.set("increment-ban", incrementBan); - section.set("use-shadow-ban", useShadowBan); section.set("verify-ssl", verifySsl); return section; } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java new file mode 100644 index 0000000000..9d50416c05 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java @@ -0,0 +1,322 @@ +package com.ghostchu.peerbanhelper.downloader.impl.qbittorrent; + +import com.ghostchu.peerbanhelper.downloader.AbstractDownloader; +import com.ghostchu.peerbanhelper.downloader.DownloaderLoginResult; +import com.ghostchu.peerbanhelper.peer.Peer; +import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.text.TranslationComponent; +import com.ghostchu.peerbanhelper.torrent.Torrent; +import com.ghostchu.peerbanhelper.torrent.TorrentImpl; +import com.ghostchu.peerbanhelper.util.HTTPUtil; +import com.ghostchu.peerbanhelper.util.json.JsonUtil; +import com.ghostchu.peerbanhelper.wrapper.BanMetadata; +import com.ghostchu.peerbanhelper.wrapper.PeerAddress; +import com.ghostchu.peerbanhelper.wrapper.TorrentWrapper; +import com.github.mizosoft.methanol.FormBodyPublisher; +import com.github.mizosoft.methanol.Methanol; +import com.github.mizosoft.methanol.MutableRequest; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.bspfsystems.yamlconfiguration.configuration.ConfigurationSection; +import org.bspfsystems.yamlconfiguration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.net.*; +import java.net.http.HttpClient; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.*; + +import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; + +@Slf4j +public class QBittorrentEE extends AbstractDownloader { + private final String apiEndpoint; + private final HttpClient httpClient; + private final Config config; + + public QBittorrentEE(String name, Config config) { + super(name); + this.config = config; + this.apiEndpoint = config.getEndpoint() + "/api/v2"; + CookieManager cm = new CookieManager(); + cm.setCookiePolicy(CookiePolicy.ACCEPT_ALL); + Methanol.Builder builder = Methanol + .newBuilder() + .version(HttpClient.Version.valueOf(config.getHttpVersion())) + .defaultHeader("Accept-Encoding", "gzip,deflate") + .followRedirects(HttpClient.Redirect.ALWAYS) + .connectTimeout(Duration.of(10, ChronoUnit.SECONDS)) + .headersTimeout(Duration.of(10, ChronoUnit.SECONDS)) + .readTimeout(Duration.of(30, ChronoUnit.SECONDS)) + .requestTimeout(Duration.of(30, ChronoUnit.SECONDS)) + .authenticator(new Authenticator() { + @Override + public PasswordAuthentication requestPasswordAuthenticationInstance(String host, InetAddress addr, int port, String protocol, String prompt, String scheme, URL url, RequestorType reqType) { + return new PasswordAuthentication(config.getBasicAuth().getUser(), config.getBasicAuth().getPass().toCharArray()); + } + }) + .cookieHandler(cm); + if (!config.isVerifySsl() && HTTPUtil.getIgnoreSslContext() != null) { + builder.sslContext(HTTPUtil.getIgnoreSslContext()); + } + this.httpClient = builder.build(); + } + + public static QBittorrentEE loadFromConfig(String name, JsonObject section) { + Config config = JsonUtil.getGson().fromJson(section.toString(), Config.class); + return new QBittorrentEE(name, config); + } + + public static QBittorrentEE loadFromConfig(String name, ConfigurationSection section) { + Config config = Config.readFromYaml(section); + return new QBittorrentEE(name, config); + } + + @Override + public JsonObject saveDownloaderJson() { + return JsonUtil.getGson().toJsonTree(config).getAsJsonObject(); + } + + @Override + public YamlConfiguration saveDownloader() { + return config.saveToYaml(); + } + + public DownloaderLoginResult login0() { + if (isLoggedIn()) + return new DownloaderLoginResult(DownloaderLoginResult.Status.SUCCESS, new TranslationComponent(Lang.STATUS_TEXT_OK)); // 重用 Session 会话 + try { + HttpResponse request = httpClient + .send(MutableRequest.POST(apiEndpoint + "/auth/login", + FormBodyPublisher.newBuilder() + .query("username", config.getUsername()) + .query("password", config.getPassword()).build()) + .header("Content-Type", "application/x-www-form-urlencoded") + , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + if (request.statusCode() == 200) { + return new DownloaderLoginResult(DownloaderLoginResult.Status.SUCCESS, new TranslationComponent(Lang.STATUS_TEXT_OK)); + } + if (request.statusCode() == 403) { + return new DownloaderLoginResult(DownloaderLoginResult.Status.INCORRECT_CREDENTIAL, new TranslationComponent(Lang.DOWNLOADER_LOGIN_EXCEPTION, request.body())); + } + return new DownloaderLoginResult(DownloaderLoginResult.Status.EXCEPTION, new TranslationComponent(Lang.DOWNLOADER_LOGIN_INCORRECT_CRED)); + // return request.statusCode() == 200; + } catch (Exception e) { + return new DownloaderLoginResult(DownloaderLoginResult.Status.EXCEPTION, new TranslationComponent(Lang.DOWNLOADER_LOGIN_IO_EXCEPTION, e.getClass().getName() + ": " + e.getMessage())); + } + } + + @Override + public String getEndpoint() { + return apiEndpoint; + } + + + @Override + public String getType() { + return "qBittorrent"; + } + + public boolean isLoggedIn() { + HttpResponse resp; + try { + resp = httpClient.send(MutableRequest.GET(apiEndpoint + "/app/version"), HttpResponse.BodyHandlers.discarding()); + } catch (Exception e) { + return false; + } + return resp.statusCode() == 200; + } + + @Override + public void setBanList(@NotNull Collection fullList, @Nullable Collection added, @Nullable Collection removed, boolean applyFullList) { + if (removed != null && removed.isEmpty() && added != null && config.isIncrementBan() && !applyFullList) { + setBanListIncrement(added, config.useShadowBan); + } else { + setBanListFull(fullList, config.useShadowBan); + } + } + + @Override + public List getTorrents() { + HttpResponse request; + try { + request = httpClient.send(MutableRequest.GET(apiEndpoint + "/torrents/info?filter=active"), HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + } catch (Exception e) { + throw new IllegalStateException(e); + } + if (request.statusCode() != 200) { + throw new IllegalStateException(tlUI(Lang.DOWNLOADER_QB_FAILED_REQUEST_TORRENT_LIST, request.statusCode(), request.body())); + } + List qbTorrent = JsonUtil.getGson().fromJson(request.body(), new TypeToken>() { + }.getType()); + List torrents = new ArrayList<>(); + for (QBTorrent detail : qbTorrent) { + torrents.add(new TorrentImpl(detail.getHash(), detail.getName(), detail.getHash(), detail.getTotalSize(), detail.getProgress(), detail.getUpspeed(), detail.getDlspeed())); + } + return torrents; + } + + @Override + public void relaunchTorrentIfNeeded(Collection torrents) { + // QB 很棒,什么都不需要做 + } + + @Override + public void relaunchTorrentIfNeededByTorrentWrapper(Collection torrents) { + // QB 很棒,什么都不需要做 + } + + @Override + public List getPeers(Torrent torrent) { + HttpResponse resp; + try { + resp = httpClient.send(MutableRequest.GET(apiEndpoint + "/sync/torrentPeers?hash=" + torrent.getId()), + HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + } catch (Exception e) { + throw new IllegalStateException(e); + } + if (resp.statusCode() != 200) { + throw new IllegalStateException(tlUI(Lang.DOWNLOADER_QB_FAILED_REQUEST_PEERS_LIST_IN_TORRENT, resp.statusCode(), resp.body())); + } + + JsonObject object = JsonParser.parseString(resp.body()).getAsJsonObject(); + JsonObject peers = object.getAsJsonObject("peers"); + List peersList = new ArrayList<>(); + for (String s : peers.keySet()) { + JsonObject singlePeerObject = peers.getAsJsonObject(s); + QBPeer qbPeer = JsonUtil.getGson().fromJson(singlePeerObject.toString(), QBPeer.class); + // 一个 QB 本地化问题的 Workaround + if (qbPeer.getPeerId() == null || qbPeer.getPeerId().equals("Unknown") || qbPeer.getPeerId().equals("未知")) { + qbPeer.setPeerIdClient(""); + } + if (qbPeer.getClientName() != null) { + if (qbPeer.getClientName().startsWith("Unknown [") && qbPeer.getClientName().endsWith("]")) { + String mid = qbPeer.getClientName().substring("Unknown [".length(), qbPeer.getClientName().length() - 1); + qbPeer.setClient(mid); + } + } + qbPeer.setRawIp(s); + peersList.add(qbPeer); + } + return peersList; + } + + private void setBanListIncrement(Collection added, boolean useShadowBan) { + Map banTasks = new HashMap<>(); + added.forEach(p -> { + StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); + joiner.add(p.getPeer().getRawIp()); + banTasks.put(p.getTorrent().getHash(), joiner); + }); + banTasks.forEach((hash, peers) -> { + try { + HttpResponse request = httpClient.send(MutableRequest + .POST(apiEndpoint + (useShadowBan ? "/transfer/shadowbanPeers" : "/transfer/banPeers"), FormBodyPublisher.newBuilder() + .query("hash", hash) + .query("peers", peers.toString()).build()) + .header("Content-Type", "application/x-www-form-urlencoded") + , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + if (request.statusCode() != 200) { + log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); + throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); + } + } catch (Exception e) { + log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); + throw new IllegalStateException(e); + } + }); + } + + private void setBanListFull(Collection peerAddresses, boolean useShadowBan) { + StringJoiner joiner = new StringJoiner("\n"); + peerAddresses.forEach(p -> joiner.add(p.getIp())); + try { + HttpResponse request = httpClient.send(MutableRequest + .POST(apiEndpoint + "/app/setPreferences", FormBodyPublisher.newBuilder() + .query("json", JsonUtil.getGson().toJson(Map.of(useShadowBan ? "shadow_banned_IPs" : "banned_IPs", joiner.toString()))).build()) + .header("Content-Type", "application/x-www-form-urlencoded") + , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + if (request.statusCode() != 200) { + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); + throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); + } + } catch (Exception e) { + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); + throw new IllegalStateException(e); + } + } + + @Override + public void close() throws Exception { + + } + + + @NoArgsConstructor + @Data + public static class Config { + + private String type; + private String endpoint; + private String username; + private String password; + private BasicauthDTO basicAuth; + private String httpVersion; + private boolean incrementBan; + private boolean useShadowBan; + private boolean verifySsl; + + public static Config readFromYaml(ConfigurationSection section) { + Config config = new Config(); + config.setType("qbittorrent"); + config.setEndpoint(section.getString("endpoint")); + if (config.getEndpoint().endsWith("/")) { // 浏览器复制党 workaround 一下, 避免连不上的情况 + config.setEndpoint(config.getEndpoint().substring(0, config.getEndpoint().length() - 1)); + } + config.setUsername(section.getString("username", "")); + config.setPassword(section.getString("password", "")); + BasicauthDTO basicauthDTO = new BasicauthDTO(); + basicauthDTO.setUser(section.getString("basic-auth.user")); + basicauthDTO.setPass(section.getString("basic-auth.pass")); + config.setBasicAuth(basicauthDTO); + config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); + config.setIncrementBan(section.getBoolean("increment-ban", false)); + config.setUseShadowBan(section.getBoolean("use-shadow-ban", false)); + config.setVerifySsl(section.getBoolean("verify-ssl", true)); + return config; + } + + public YamlConfiguration saveToYaml() { + YamlConfiguration section = new YamlConfiguration(); + section.set("type", "qbittorrent"); + section.set("endpoint", endpoint); + section.set("username", username); + section.set("password", password); + section.set("basic-auth.user", Objects.requireNonNullElse(basicAuth.user, "")); + section.set("basic-auth.pass", Objects.requireNonNullElse(basicAuth.pass, "")); + section.set("http-version", httpVersion); + section.set("increment-ban", incrementBan); + section.set("use-shadow-ban", useShadowBan); + section.set("verify-ssl", verifySsl); + return section; + } + + @NoArgsConstructor + @Data + public static class BasicauthDTO { + @SerializedName("user") + private String user; + @SerializedName("pass") + private String pass; + } + } +} From 8e733367c4573d995f9a857eea6f0456f61764d6 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 27 Aug 2024 18:43:09 +0800 Subject: [PATCH 11/87] =?UTF-8?q?=E4=B8=BAqbEE=E5=8D=95=E7=8B=AC=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghostchu/peerbanhelper/PeerBanHelperServer.java | 3 +++ .../downloader/impl/qbittorrent/QBittorrentEE.java | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index 44f81d8ab6..e763333862 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -9,6 +9,7 @@ import com.ghostchu.peerbanhelper.downloader.impl.biglybt.BiglyBT; import com.ghostchu.peerbanhelper.downloader.impl.deluge.Deluge; import com.ghostchu.peerbanhelper.downloader.impl.qbittorrent.QBittorrent; +import com.ghostchu.peerbanhelper.downloader.impl.qbittorrent.QBittorrentEE; import com.ghostchu.peerbanhelper.downloader.impl.transmission.Transmission; import com.ghostchu.peerbanhelper.event.LivePeersUpdatedEvent; import com.ghostchu.peerbanhelper.event.PBHServerStartedEvent; @@ -200,6 +201,7 @@ public Downloader createDownloader(String client, ConfigurationSection downloade Downloader downloader = null; switch (downloaderSection.getString("type").toLowerCase(Locale.ROOT)) { case "qbittorrent" -> downloader = QBittorrent.loadFromConfig(client, downloaderSection); + case "qbittorrentee" -> downloader = QBittorrentEE.loadFromConfig(client, downloaderSection); case "transmission" -> downloader = Transmission.loadFromConfig(client, pbhServerAddress, downloaderSection); case "biglybt" -> downloader = BiglyBT.loadFromConfig(client, downloaderSection); @@ -217,6 +219,7 @@ public Downloader createDownloader(String client, JsonObject downloaderSection) Downloader downloader = null; switch (downloaderSection.get("type").getAsString().toLowerCase(Locale.ROOT)) { case "qbittorrent" -> downloader = QBittorrent.loadFromConfig(client, downloaderSection); + case "qbittorrentee" -> downloader = QBittorrentEE.loadFromConfig(client, downloaderSection); case "transmission" -> downloader = Transmission.loadFromConfig(client, pbhServerAddress, downloaderSection); case "biglybt" -> downloader = BiglyBT.loadFromConfig(client, downloaderSection); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java index 9d50416c05..9878c41d1b 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java @@ -123,7 +123,7 @@ public String getEndpoint() { @Override public String getType() { - return "qBittorrent"; + return "qBittorrentEE"; } public boolean isLoggedIn() { @@ -277,7 +277,7 @@ public static class Config { public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); - config.setType("qbittorrent"); + config.setType("qbittorrentee"); config.setEndpoint(section.getString("endpoint")); if (config.getEndpoint().endsWith("/")) { // 浏览器复制党 workaround 一下, 避免连不上的情况 config.setEndpoint(config.getEndpoint().substring(0, config.getEndpoint().length() - 1)); @@ -297,7 +297,7 @@ public static Config readFromYaml(ConfigurationSection section) { public YamlConfiguration saveToYaml() { YamlConfiguration section = new YamlConfiguration(); - section.set("type", "qbittorrent"); + section.set("type", "qbittorrentee"); section.set("endpoint", endpoint); section.set("username", username); section.set("password", password); From 9150e493b4f8ff6f130b364515f5292aadd1cb3e Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 27 Aug 2024 19:06:20 +0800 Subject: [PATCH 12/87] =?UTF-8?q?=E6=8A=BD=E8=B1=A1=20BanHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../downloader/AbstractDownloader.java | 10 + .../impl/qbittorrent/QBittorrent.java | 36 ---- .../impl/qbittorrent/QBittorrentEE.java | 179 +++++++++++++----- 3 files changed, 139 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java index e84b8f7540..aa4496a1e7 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/AbstractDownloader.java @@ -2,8 +2,11 @@ import com.ghostchu.peerbanhelper.text.Lang; import com.ghostchu.peerbanhelper.text.TranslationComponent; +import com.ghostchu.peerbanhelper.torrent.Torrent; import com.ghostchu.peerbanhelper.util.MsgUtil; +import com.ghostchu.peerbanhelper.wrapper.TorrentWrapper; +import java.util.Collection; import java.util.Date; public abstract class AbstractDownloader implements Downloader { @@ -57,6 +60,13 @@ public void setLastStatus(DownloaderLastStatus lastStatus, TranslationComponent this.statusMessage = statusMessage; } + @Override + public void relaunchTorrentIfNeeded(Collection torrents) { + } + + @Override + public void relaunchTorrentIfNeededByTorrentWrapper(Collection torrents) { + } @Override public TranslationComponent getLastStatusMessage() { return statusMessage; diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java index 65f332abdf..7d36cb3dd8 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java @@ -11,7 +11,6 @@ import com.ghostchu.peerbanhelper.util.json.JsonUtil; import com.ghostchu.peerbanhelper.wrapper.BanMetadata; import com.ghostchu.peerbanhelper.wrapper.PeerAddress; -import com.ghostchu.peerbanhelper.wrapper.TorrentWrapper; import com.github.mizosoft.methanol.FormBodyPublisher; import com.github.mizosoft.methanol.Methanol; import com.github.mizosoft.methanol.MutableRequest; @@ -165,16 +164,6 @@ public List getTorrents() { return torrents; } - @Override - public void relaunchTorrentIfNeeded(Collection torrents) { - // QB 很棒,什么都不需要做 - } - - @Override - public void relaunchTorrentIfNeededByTorrentWrapper(Collection torrents) { - // QB 很棒,什么都不需要做 - } - @Override public List getPeers(Torrent torrent) { HttpResponse resp; @@ -234,31 +223,6 @@ private void setBanListIncrement(Collection added) { throw new IllegalStateException(e); } }); -// -// Map banTasks = new HashMap<>(); -// added.forEach(p -> { -// StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); -// IPAddress ipAddress = IPAddressUtil.getIPAddress(p.getPeer().getAddress().getIp()); -// -// banTasks.put(p.getTorrent().getHash(), joiner); -// }); -// banTasks.forEach((hash, peers) -> { -// try { -// HttpResponse request = httpClient.send(MutableRequest -// .POST(apiEndpoint + "/transfer/banPeers", FormBodyPublisher.newBuilder() -// .query("hash", hash) -// .query("peers", peers.toString()).build()) -// .header("Content-Type", "application/x-www-form-urlencoded") -// , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); -// if (request.statusCode() != 200) { -// log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); -// throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); -// } -// } catch (Exception e) { -// log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); -// throw new IllegalStateException(e); -// } -// }); } private void setBanListFull(Collection peerAddresses) { diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java index 9878c41d1b..721aa1fb50 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java @@ -11,7 +11,6 @@ import com.ghostchu.peerbanhelper.util.json.JsonUtil; import com.ghostchu.peerbanhelper.wrapper.BanMetadata; import com.ghostchu.peerbanhelper.wrapper.PeerAddress; -import com.ghostchu.peerbanhelper.wrapper.TorrentWrapper; import com.github.mizosoft.methanol.FormBodyPublisher; import com.github.mizosoft.methanol.Methanol; import com.github.mizosoft.methanol.MutableRequest; @@ -42,6 +41,7 @@ public class QBittorrentEE extends AbstractDownloader { private final String apiEndpoint; private final HttpClient httpClient; private final Config config; + private final BanHandler banHandler; public QBittorrentEE(String name, Config config) { super(name); @@ -69,6 +69,11 @@ public PasswordAuthentication requestPasswordAuthenticationInstance(String host, builder.sslContext(HTTPUtil.getIgnoreSslContext()); } this.httpClient = builder.build(); + if (config.isUseShadowBan()) { + this.banHandler = new BanHandlerShadowBan(httpClient, name, apiEndpoint); + } else { + this.banHandler = new BanHandlerNormal(httpClient, name, apiEndpoint); + } } public static QBittorrentEE loadFromConfig(String name, JsonObject section) { @@ -123,7 +128,7 @@ public String getEndpoint() { @Override public String getType() { - return "qBittorrentEE"; + return "qBittorrent"; } public boolean isLoggedIn() { @@ -139,9 +144,9 @@ public boolean isLoggedIn() { @Override public void setBanList(@NotNull Collection fullList, @Nullable Collection added, @Nullable Collection removed, boolean applyFullList) { if (removed != null && removed.isEmpty() && added != null && config.isIncrementBan() && !applyFullList) { - setBanListIncrement(added, config.useShadowBan); + banHandler.setBanListIncrement(added); } else { - setBanListFull(fullList, config.useShadowBan); + banHandler.setBanListFull(fullList); } } @@ -165,16 +170,6 @@ public List getTorrents() { return torrents; } - @Override - public void relaunchTorrentIfNeeded(Collection torrents) { - // QB 很棒,什么都不需要做 - } - - @Override - public void relaunchTorrentIfNeededByTorrentWrapper(Collection torrents) { - // QB 很棒,什么都不需要做 - } - @Override public List getPeers(Torrent torrent) { HttpResponse resp; @@ -210,57 +205,141 @@ public List getPeers(Torrent torrent) { return peersList; } - private void setBanListIncrement(Collection added, boolean useShadowBan) { - Map banTasks = new HashMap<>(); - added.forEach(p -> { - StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); - joiner.add(p.getPeer().getRawIp()); - banTasks.put(p.getTorrent().getHash(), joiner); - }); - banTasks.forEach((hash, peers) -> { + + + @Override + public void close() throws Exception { + + } + + interface BanHandler { + void setBanListIncrement(Collection added); + + void setBanListFull(Collection peerAddresses); + } + + public static class BanHandlerNormal implements BanHandler { + + private final HttpClient httpClient; + private final String name; + private final String apiEndpoint; + + public BanHandlerNormal(HttpClient httpClient, String name, String apiEndpoint) { + this.httpClient = httpClient; + this.name = name; + this.apiEndpoint = apiEndpoint; + } + + @Override + public void setBanListIncrement(Collection added) { + Map banTasks = new HashMap<>(); + added.forEach(p -> { + StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); + joiner.add(p.getPeer().getRawIp()); + banTasks.put(p.getTorrent().getHash(), joiner); + }); + banTasks.forEach((hash, peers) -> { + try { + HttpResponse request = httpClient.send(MutableRequest + .POST(apiEndpoint + "/transfer/banPeers", FormBodyPublisher.newBuilder() + .query("hash", hash) + .query("peers", peers.toString()).build()) + .header("Content-Type", "application/x-www-form-urlencoded") + , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + if (request.statusCode() != 200) { + log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); + throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); + } + } catch (Exception e) { + log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); + throw new IllegalStateException(e); + } + }); + } + + @Override + public void setBanListFull(Collection peerAddresses) { + StringJoiner joiner = new StringJoiner("\n"); + peerAddresses.forEach(p -> joiner.add(p.getIp())); try { HttpResponse request = httpClient.send(MutableRequest - .POST(apiEndpoint + (useShadowBan ? "/transfer/shadowbanPeers" : "/transfer/banPeers"), FormBodyPublisher.newBuilder() - .query("hash", hash) - .query("peers", peers.toString()).build()) + .POST(apiEndpoint + "/app/setPreferences", FormBodyPublisher.newBuilder() + .query("json", JsonUtil.getGson().toJson(Map.of("banned_IPs", joiner.toString()))).build()) .header("Content-Type", "application/x-www-form-urlencoded") , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); if (request.statusCode() != 200) { - log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); } } catch (Exception e) { - log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); throw new IllegalStateException(e); } - }); + } } - private void setBanListFull(Collection peerAddresses, boolean useShadowBan) { - StringJoiner joiner = new StringJoiner("\n"); - peerAddresses.forEach(p -> joiner.add(p.getIp())); - try { - HttpResponse request = httpClient.send(MutableRequest - .POST(apiEndpoint + "/app/setPreferences", FormBodyPublisher.newBuilder() - .query("json", JsonUtil.getGson().toJson(Map.of(useShadowBan ? "shadow_banned_IPs" : "banned_IPs", joiner.toString()))).build()) - .header("Content-Type", "application/x-www-form-urlencoded") - , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); - if (request.statusCode() != 200) { - log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); - throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); - } - } catch (Exception e) { - log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); - throw new IllegalStateException(e); + public static class BanHandlerShadowBan implements BanHandler { + + private final HttpClient httpClient; + private final String name; + private final String apiEndpoint; + + public BanHandlerShadowBan(HttpClient httpClient, String name, String apiEndpoint) { + this.httpClient = httpClient; + this.name = name; + this.apiEndpoint = apiEndpoint; } - } - @Override - public void close() throws Exception { + @Override + public void setBanListIncrement(Collection added) { + Map banTasks = new HashMap<>(); + added.forEach(p -> { + StringJoiner joiner = banTasks.getOrDefault(p.getTorrent().getHash(), new StringJoiner("|")); + joiner.add(p.getPeer().getRawIp()); + banTasks.put(p.getTorrent().getHash(), joiner); + }); + banTasks.forEach((hash, peers) -> { + try { + HttpResponse request = httpClient.send(MutableRequest + .POST(apiEndpoint + "/transfer/shadowbanPeers", FormBodyPublisher.newBuilder() + .query("hash", hash) + .query("peers", peers.toString()).build()) + .header("Content-Type", "application/x-www-form-urlencoded") + , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + if (request.statusCode() != 200) { + log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); + throw new IllegalStateException("Save qBittorrent shadow banlist error: statusCode=" + request.statusCode()); + } + } catch (Exception e) { + log.error(tlUI(Lang.DOWNLOADER_QB_INCREAMENT_BAN_FAILED, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); + throw new IllegalStateException(e); + } + }); + } + @Override + public void setBanListFull(Collection peerAddresses) { + StringJoiner joiner = new StringJoiner("\n"); + peerAddresses.forEach(p -> joiner.add(p.getIp())); + try { + HttpResponse request = httpClient.send(MutableRequest + .POST(apiEndpoint + "/app/setPreferences", FormBodyPublisher.newBuilder() + .query("json", JsonUtil.getGson().toJson(Map.of("shadow_banned_IPs", joiner.toString()))).build()) + .header("Content-Type", "application/x-www-form-urlencoded") + , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + if (request.statusCode() != 200) { + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); + throw new IllegalStateException("Save qBittorrent shadow banlist error: statusCode=" + request.statusCode()); + } + } catch (Exception e) { + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); + throw new IllegalStateException(e); + } + } } + @NoArgsConstructor @Data public static class Config { @@ -272,12 +351,12 @@ public static class Config { private BasicauthDTO basicAuth; private String httpVersion; private boolean incrementBan; - private boolean useShadowBan; private boolean verifySsl; + private boolean useShadowBan; public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); - config.setType("qbittorrentee"); + config.setType("qbittorrent"); config.setEndpoint(section.getString("endpoint")); if (config.getEndpoint().endsWith("/")) { // 浏览器复制党 workaround 一下, 避免连不上的情况 config.setEndpoint(config.getEndpoint().substring(0, config.getEndpoint().length() - 1)); @@ -297,7 +376,7 @@ public static Config readFromYaml(ConfigurationSection section) { public YamlConfiguration saveToYaml() { YamlConfiguration section = new YamlConfiguration(); - section.set("type", "qbittorrentee"); + section.set("type", "qbittorrent"); section.set("endpoint", endpoint); section.set("username", username); section.set("password", password); From 8a144988d2ec705b3bebea852b39c62e9dc94b7f Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 27 Aug 2024 19:12:46 +0800 Subject: [PATCH 13/87] =?UTF-8?q?=E5=BF=BD=E7=95=A5=E8=A2=AB=20ShadowBanne?= =?UTF-8?q?d=20=E7=9A=84=20Peers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../downloader/impl/qbittorrent/QBEEPeer.java | 135 ++++++++++++++++++ .../impl/qbittorrent/QBittorrentEE.java | 5 +- 2 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBEEPeer.java diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBEEPeer.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBEEPeer.java new file mode 100644 index 0000000000..6f08726c3c --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBEEPeer.java @@ -0,0 +1,135 @@ +package com.ghostchu.peerbanhelper.downloader.impl.qbittorrent; + + +import com.ghostchu.peerbanhelper.peer.Peer; +import com.ghostchu.peerbanhelper.peer.PeerFlag; +import com.ghostchu.peerbanhelper.wrapper.PeerAddress; +import com.google.gson.annotations.SerializedName; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +@Setter +public final class QBEEPeer implements Peer { + @SerializedName("client") + private String client; + @SerializedName("connection") + private String connection; + @SerializedName("country") + private String country; + @SerializedName("country_code") + private String countryCode; + @SerializedName("dl_speed") + private Long dlSpeed; + @SerializedName("downloaded") + private Long downloaded; + @SerializedName("files") + private String files; + @SerializedName("flags") + private String flags; + @SerializedName("flags_desc") + private String flagsDesc; + @SerializedName("ip") + private String ip; + @SerializedName("peer_id_client") + private String peerIdClient; + @SerializedName("port") + private Integer port; + @SerializedName("progress") + private Double progress; + @SerializedName("relevance") + private Double relevance; + @SerializedName("up_speed") + private Long upSpeed; + @SerializedName("uploaded") + private Long uploaded; + @Getter + @SerializedName("shadowbanned") + private Boolean shadowBanned; + private transient PeerAddress peerAddress; + private String rawIp; + + public QBEEPeer() { + } + + @Override + public PeerAddress getPeerAddress() { + if (this.peerAddress == null) { + this.peerAddress = new PeerAddress(ip, port); + } + return this.peerAddress; + } + + @Override + @Nullable + public String getPeerId() { + return peerIdClient; + } + + @Override + @Nullable + public String getClientName() { + return client; + } + + @Override + public long getDownloadSpeed() { + return dlSpeed; + } + + @Override + public long getDownloaded() { + return downloaded; + } + + @Override + public long getUploadSpeed() { + return upSpeed; + } + + @Override + public long getUploaded() { + return uploaded; + } + + @Override + public double getProgress() { + return progress; + } + + @Override + public PeerFlag getFlags() { + return new PeerFlag(flags); + } + + @Override + public String getRawIp() { + return rawIp == null ? ip : rawIp; + } + + + @Override + public String toString() { + return "QBEEPeer{" + + "client='" + client + '\'' + + ", connection='" + connection + '\'' + + ", country='" + country + '\'' + + ", countryCode='" + countryCode + '\'' + + ", dlSpeed=" + dlSpeed + + ", downloaded=" + downloaded + + ", files='" + files + '\'' + + ", flags='" + flags + '\'' + + ", flagsDesc='" + flagsDesc + '\'' + + ", ip='" + ip + '\'' + + ", peerIdClient='" + peerIdClient + '\'' + + ", port=" + port + + ", progress=" + progress + + ", relevance=" + relevance + + ", upSpeed=" + upSpeed + + ", uploaded=" + uploaded + + ", shadowBanned=" + shadowBanned + + ", peerAddress=" + peerAddress + + ", rawIp='" + rawIp + '\'' + + '}'; + } +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java index 721aa1fb50..8d2d12eb27 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java @@ -188,7 +188,10 @@ public List getPeers(Torrent torrent) { List peersList = new ArrayList<>(); for (String s : peers.keySet()) { JsonObject singlePeerObject = peers.getAsJsonObject(s); - QBPeer qbPeer = JsonUtil.getGson().fromJson(singlePeerObject.toString(), QBPeer.class); + QBEEPeer qbPeer = JsonUtil.getGson().fromJson(singlePeerObject.toString(), QBEEPeer.class); + if (qbPeer.getShadowBanned()) { + continue; // 当做不存在处理 + } // 一个 QB 本地化问题的 Workaround if (qbPeer.getPeerId() == null || qbPeer.getPeerId().equals("Unknown") || qbPeer.getPeerId().equals("未知")) { qbPeer.setPeerIdClient(""); From ecfb46cd5d519ff15c2e02f1fe258908b22bddea Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 27 Aug 2024 21:29:11 +0800 Subject: [PATCH 14/87] =?UTF-8?q?=E5=90=AF=E7=94=A8=20ShadowBan=20?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=89=93=E5=BC=80=20ShadowBan=20=E7=9A=84?= =?UTF-8?q?=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/qbittorrent/QBittorrentEE.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java index 8d2d12eb27..063a76338f 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java @@ -291,6 +291,21 @@ public BanHandlerShadowBan(HttpClient httpClient, String name, String apiEndpoin this.httpClient = httpClient; this.name = name; this.apiEndpoint = apiEndpoint; + try { + HttpResponse request = httpClient.send(MutableRequest + .POST(apiEndpoint + "/app/setPreferences", FormBodyPublisher.newBuilder() + .query("json", JsonUtil.getGson().toJson(Map.of("shadow_ban", true))).build()) + .header("Content-Type", "application/x-www-form-urlencoded") + , HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); + if (request.statusCode() != 200) { + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, request.statusCode(), "HTTP ERROR", request.body())); + throw new IllegalStateException("Save qBittorrent banlist error: statusCode=" + request.statusCode()); + } + } catch (Exception e) { + log.error(tlUI(Lang.DOWNLOADER_QB_FAILED_SAVE_BANLIST, name, apiEndpoint, "N/A", e.getClass().getName(), e.getMessage()), e); + throw new IllegalStateException(e); + } + } @Override From 6ae7c66a95f7e29844f9f4968a43eacda5e32a8e Mon Sep 17 00:00:00 2001 From: LiangXiao Date: Tue, 27 Aug 2024 22:23:00 +0800 Subject: [PATCH 15/87] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 象征性的改点什么避免变成橡皮reviwer --- webui/src/stores/autoUpdate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/src/stores/autoUpdate.ts b/webui/src/stores/autoUpdate.ts index 034d73bf11..6eaef79950 100644 --- a/webui/src/stores/autoUpdate.ts +++ b/webui/src/stores/autoUpdate.ts @@ -2,7 +2,7 @@ import { useStorage } from '@vueuse/core' import { defineStore } from 'pinia' import { onUnmounted, readonly, ref, watch } from 'vue' import { type PluginImplementType } from 'vue-request' -type MapValue = T extends Map ? V : never +type MapValue = T extends Map ? V : never type status = 'idle' | 'loading' class AutoUpdateMessageChannel extends MessageChannel { private count = 0 From 1bc86847b942aaca9b5e2432f5a9313a78a7965d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Wed, 28 Aug 2024 03:02:18 +0800 Subject: [PATCH 16/87] =?UTF-8?q?=E5=85=81=E8=AE=B8=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=99=A8=E5=BF=BD=E7=95=A5=E7=A7=81=E6=9C=89=E7=A7=8D=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/downloader/impl/biglybt/BiglyBT.java | 9 ++++++++- .../peerbanhelper/downloader/impl/deluge/Deluge.java | 6 +++++- .../downloader/impl/deluge/DelugeTorrent.java | 6 ++++++ .../downloader/impl/qbittorrent/QBTorrent.java | 4 ++++ .../downloader/impl/qbittorrent/QBittorrent.java | 8 +++++++- .../downloader/impl/transmission/TRTorrent.java | 5 +++++ .../downloader/impl/transmission/Transmission.java | 6 +++++- .../java/com/ghostchu/peerbanhelper/torrent/Torrent.java | 7 +++++++ .../com/ghostchu/peerbanhelper/torrent/TorrentImpl.java | 9 ++++++++- 9 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java index e2cd38270c..6233d5394e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/biglybt/BiglyBT.java @@ -151,6 +151,9 @@ public List getTorrents() { }.getType()); List torrents = new ArrayList<>(); for (DownloadRecord detail : torrentDetail) { + if (config.isIgnorePrivate() && detail.getTorrent().isPrivateTorrent()) { + continue; + } torrents.add(new TorrentImpl( detail.getTorrent().getInfoHash(), detail.getName(), @@ -158,7 +161,8 @@ public List getTorrents() { detail.getTorrent().getSize(), detail.getStats().getCompletedInThousandNotation() / 1000d, detail.getStats().getRtUploadSpeed(), - detail.getStats().getRtDownloadSpeed())); + detail.getStats().getRtDownloadSpeed(), + detail.getTorrent().isPrivateTorrent())); } return torrents; } @@ -257,6 +261,7 @@ public static class Config { private String httpVersion; private boolean incrementBan; private boolean verifySsl; + private boolean ignorePrivate; public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); @@ -269,6 +274,7 @@ public static Config readFromYaml(ConfigurationSection section) { config.setIncrementBan(section.getBoolean("increment-ban", true)); config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setVerifySsl(section.getBoolean("verify-ssl", true)); + config.setIgnorePrivate(section.getBoolean("ignore-private", false)); return config; } @@ -279,6 +285,7 @@ public YamlConfiguration saveToYaml() { section.set("token", token); section.set("http-version", httpVersion); section.set("increment-ban", incrementBan); + section.set("ignore-private", ignorePrivate); section.set("verify-ssl", verifySsl); return section; } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java index bf18d1e04e..11c475b6ac 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/Deluge.java @@ -130,7 +130,8 @@ public List getTorrents() { activeTorrent.getSize(), activeTorrent.getUploadPayloadRate(), activeTorrent.getDownloadPayloadRate(), - peers + peers, + false ); torrents.add(torrent); } @@ -321,6 +322,7 @@ public static class Config { private boolean verifySsl; private String rpcUrl; private boolean incrementBan; + private boolean ignorePrivate; public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); @@ -334,6 +336,7 @@ public static Config readFromYaml(ConfigurationSection section) { config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setVerifySsl(section.getBoolean("verify-ssl", true)); config.setIncrementBan(section.getBoolean("increment-ban", true)); + config.setIgnorePrivate(section.getBoolean("ignore-private", false)); return config; } @@ -346,6 +349,7 @@ public YamlConfiguration saveToYaml() { section.set("http-version", httpVersion); section.set("increment-ban", incrementBan); section.set("verify-ssl", verifySsl); + section.set("ignore-private", ignorePrivate); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugeTorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugeTorrent.java index cbacc71d11..00d15b05ab 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugeTorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/deluge/DelugeTorrent.java @@ -18,4 +18,10 @@ public final class DelugeTorrent implements Torrent { private long rtUploadSpeed; private long rtDownloadSpeed; private List peers; + private boolean privateTorrent; + + @Override + public boolean isPrivate() { + return privateTorrent; + } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBTorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBTorrent.java index ef492fded7..157e911e78 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBTorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBTorrent.java @@ -161,4 +161,8 @@ public final class QBTorrent { @SerializedName("upspeed") private Long upspeed; + + @SerializedName("is_private") + private Boolean privateTorrent; + } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java index 65f332abdf..775a29f01b 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrent.java @@ -160,7 +160,10 @@ public List getTorrents() { }.getType()); List torrents = new ArrayList<>(); for (QBTorrent detail : qbTorrent) { - torrents.add(new TorrentImpl(detail.getHash(), detail.getName(), detail.getHash(), detail.getTotalSize(), detail.getProgress(), detail.getUpspeed(), detail.getDlspeed())); + if (config.isIgnorePrivate() && detail.getPrivateTorrent()) { + continue; + } + torrents.add(new TorrentImpl(detail.getHash(), detail.getName(), detail.getHash(), detail.getTotalSize(), detail.getProgress(), detail.getUpspeed(), detail.getDlspeed(), detail.getPrivateTorrent())); } return torrents; } @@ -298,6 +301,7 @@ public static class Config { private String httpVersion; private boolean incrementBan; private boolean verifySsl; + private boolean ignorePrivate; public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); @@ -315,6 +319,7 @@ public static Config readFromYaml(ConfigurationSection section) { config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setIncrementBan(section.getBoolean("increment-ban", false)); config.setVerifySsl(section.getBoolean("verify-ssl", true)); + config.setIgnorePrivate(section.getBoolean("ignore-private", false)); return config; } @@ -329,6 +334,7 @@ public YamlConfiguration saveToYaml() { section.set("http-version", httpVersion); section.set("increment-ban", incrementBan); section.set("verify-ssl", verifySsl); + section.set("ignore-private", ignorePrivate); return section; } diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRTorrent.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRTorrent.java index 8a8917c3bd..5e19a3815e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRTorrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/TRTorrent.java @@ -50,6 +50,11 @@ public long getRtDownloadSpeed() { return backend.getRateDownload(); } + @Override + public boolean isPrivate() { + return backend.getIsPrivate(); + } + @NotNull public List getPeers() { return backend.getPeers().stream().map(TRPeer::new).collect(Collectors.toList()); diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java index 9382367902..4a807a36a0 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java @@ -127,6 +127,7 @@ public List getTorrents() { TypedResponse rsp = client.execute(torrent); return rsp.getArgs().getTorrents().stream() .filter(t -> t.getStatus() == Status.DOWNLOADING || t.getStatus() == Status.SEEDING) + .filter(t -> !(config.isIgnorePrivate() && t.getIsPrivate())) .map(TRTorrent::new).collect(Collectors.toList()); } @@ -168,7 +169,7 @@ private void relaunchTorrents(Collection ids) { RqTorrentGet torrentList = new RqTorrentGet(Fields.ID, Fields.HASH_STRING, Fields.NAME, Fields.PEERS_CONNECTED, Fields.STATUS, Fields.TOTAL_SIZE, Fields.PEERS, Fields.RATE_DOWNLOAD, - Fields.RATE_UPLOAD, Fields.PEER_LIMIT, Fields.PERCENT_DONE); + Fields.RATE_UPLOAD, Fields.PEER_LIMIT, Fields.PERCENT_DONE, Fields.IS_PRIVATE); TypedResponse rsp = client.execute(torrentList); List torrents = rsp.getArgs().getTorrents().stream() .filter(t -> t.getStatus() != Status.STOPPED) @@ -266,6 +267,7 @@ public static class Config { private String httpVersion; private boolean verifySsl; private String rpcUrl; + private boolean ignorePrivate; public static Transmission.Config readFromYaml(ConfigurationSection section) { Transmission.Config config = new Transmission.Config(); @@ -279,6 +281,7 @@ public static Transmission.Config readFromYaml(ConfigurationSection section) { config.setRpcUrl(section.getString("rpc-url", "/transmission/rpc")); config.setHttpVersion(section.getString("http-version", "HTTP_1_1")); config.setVerifySsl(section.getBoolean("verify-ssl", true)); + config.setIgnorePrivate(section.getBoolean("ignore-private", false)); return config; } @@ -291,6 +294,7 @@ public YamlConfiguration saveToYaml() { section.set("rpc-url", rpcUrl); section.set("http-version", httpVersion); section.set("verify-ssl", verifySsl); + section.set("ignore-private", ignorePrivate); return section; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/torrent/Torrent.java b/src/main/java/com/ghostchu/peerbanhelper/torrent/Torrent.java index c5a23005be..8a9af82be5 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/torrent/Torrent.java +++ b/src/main/java/com/ghostchu/peerbanhelper/torrent/Torrent.java @@ -52,6 +52,13 @@ public interface Torrent { */ long getRtDownloadSpeed(); + /** + * 是否是私有种子 + * + * @return 私有种子 + */ + boolean isPrivate(); + /** * 获取种子不可逆匿名识别符 * diff --git a/src/main/java/com/ghostchu/peerbanhelper/torrent/TorrentImpl.java b/src/main/java/com/ghostchu/peerbanhelper/torrent/TorrentImpl.java index d097461430..b458b96642 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/torrent/TorrentImpl.java +++ b/src/main/java/com/ghostchu/peerbanhelper/torrent/TorrentImpl.java @@ -4,6 +4,7 @@ @Setter public class TorrentImpl implements Torrent { + private boolean privateTorrent; private double progress; private long rtUploadSpeed; private long rtDownloadSpeed; @@ -12,7 +13,7 @@ public class TorrentImpl implements Torrent { private String name; private long size; - public TorrentImpl(String id, String name, String hash, long size, double progress, long rtUploadSpeed, long rtDownloadSpeed) { + public TorrentImpl(String id, String name, String hash, long size, double progress, long rtUploadSpeed, long rtDownloadSpeed, boolean privateTorrent) { this.id = id; this.name = name; this.hash = hash; @@ -20,6 +21,7 @@ public TorrentImpl(String id, String name, String hash, long size, double progre this.progress = progress; this.rtUploadSpeed = rtUploadSpeed; this.rtDownloadSpeed = rtDownloadSpeed; + this.privateTorrent = privateTorrent; } @Override @@ -56,4 +58,9 @@ public long getRtUploadSpeed() { public long getRtDownloadSpeed() { return rtDownloadSpeed; } + + @Override + public boolean isPrivate() { + return privateTorrent; + } } From 8d7f036421bad85e92a4b30af1d75b722f98b75e Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Wed, 28 Aug 2024 03:35:42 +0800 Subject: [PATCH 17/87] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E7=A8=8B=E5=BA=8F=E5=AE=89=E8=A3=85=E7=9A=84?= =?UTF-8?q?=20PBH=20=E6=97=A5=E5=BF=97=E8=B7=AF=E5=BE=84=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=97=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=86=99=E6=97=A5=E5=BF=97=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghostchu/peerbanhelper/Main.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/Main.java b/src/main/java/com/ghostchu/peerbanhelper/Main.java index 3b8e4a5869..ffd2b5f78f 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/Main.java +++ b/src/main/java/com/ghostchu/peerbanhelper/Main.java @@ -17,6 +17,11 @@ import com.google.common.io.ByteStreams; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.config.plugins.util.PluginManager; import org.bspfsystems.yamlconfiguration.configuration.InvalidConfigurationException; import org.bspfsystems.yamlconfiguration.file.YamlConfiguration; @@ -128,6 +133,33 @@ public static void main(String[] args) { guiManager.sync(); } + private static void updateLogFileLocation(String newLogFilePath) { + // Ensure all directories are created + LoggerContext context = (LoggerContext) LogManager.getContext(false); + Configuration config = context.getConfiguration(); + + RollingRandomAccessFileAppender appender = config.getAppender("File"); + + RollingRandomAccessFileAppender newAppender = RollingRandomAccessFileAppender.newBuilder() + .setName(appender.getName()) + .setLayout(appender.getLayout()) + .withFileName(new File(newLogFilePath, "latest.log").getPath()) + .withFilePattern(new File(newLogFilePath, "%d{yyyy-MM-dd}-%i.log.gz").getPath()) + .withPolicy(appender.getManager().getTriggeringPolicy()) + .withStrategy(appender.getManager().getRolloverStrategy()) + .build(); + + newAppender.start(); + + config.addAppender(newAppender); + for (LoggerConfig loggerConfig : config.getLoggers().values()) { + loggerConfig.removeAppender(appender.getName()); + loggerConfig.addAppender(newAppender, null, null); + } + + context.updateLoggers(); + } + private static void setupProxySettings() { var proxySection = mainConfig.getConfigurationSection("proxy"); if (proxySection == null) return; @@ -166,6 +198,7 @@ private static void setupConfDirectory(String[] args) { if (System.getProperty("pbh.datadir") != null) { root = System.getProperty("pbh.datadir"); } + ; dataDirectory = new File(root); logsDirectory = new File(dataDirectory, "logs"); configDirectory = new File(dataDirectory, "config"); @@ -176,6 +209,7 @@ private static void setupConfDirectory(String[] args) { private static void setupLog4j2() { PluginManager.addPackage("com.ghostchu.peerbanhelper.log4j2"); + updateLogFileLocation(logsDirectory.getAbsolutePath()); } private static YamlConfiguration loadConfiguration(File file) { @@ -331,7 +365,7 @@ public static String decapitalize(String name) { return name; } if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && - Character.isUpperCase(name.charAt(0))) { + Character.isUpperCase(name.charAt(0))) { return name; } char chars[] = name.toCharArray(); From 0b8b10f1d0068b8630d22891e5c6822d9064b74a Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Wed, 28 Aug 2024 03:37:10 +0800 Subject: [PATCH 18/87] =?UTF-8?q?=E5=A4=9A=E6=8C=89=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=88=86=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ghostchu/peerbanhelper/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/Main.java b/src/main/java/com/ghostchu/peerbanhelper/Main.java index ffd2b5f78f..1f79fb8883 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/Main.java +++ b/src/main/java/com/ghostchu/peerbanhelper/Main.java @@ -198,7 +198,7 @@ private static void setupConfDirectory(String[] args) { if (System.getProperty("pbh.datadir") != null) { root = System.getProperty("pbh.datadir"); } - ; + dataDirectory = new File(root); logsDirectory = new File(dataDirectory, "logs"); configDirectory = new File(dataDirectory, "config"); From a14d452cfe7d8c7454da6ad512096abec4907897 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Wed, 28 Aug 2024 11:40:24 +0800 Subject: [PATCH 19/87] [webui] add ignore private torrents --- webui/src/api/model/downloader.ts | 3 +++ webui/src/components/forms/biglybt.vue | 12 +++++++++--- webui/src/components/forms/qbittorrent.vue | 15 +++++++++++---- webui/src/components/forms/transmission.vue | 12 +++++++++--- webui/src/views/dashboard/locale/en-US.ts | 2 ++ webui/src/views/dashboard/locale/zh-CN.ts | 2 ++ 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/webui/src/api/model/downloader.ts b/webui/src/api/model/downloader.ts index d59b5dbef4..e19aaab448 100644 --- a/webui/src/api/model/downloader.ts +++ b/webui/src/api/model/downloader.ts @@ -225,6 +225,7 @@ export interface qBittorrentConfig { httpVersion: string incrementBan: boolean verifySsl: boolean + ignorePrivate: boolean } interface BasicAuth { @@ -239,6 +240,7 @@ export interface transmissionConfig { password: string httpVersion: string verifySsl: boolean + ignorePrivate: boolean rpcUrl: string } @@ -248,6 +250,7 @@ export interface biglybtConfig { token: string httpVersion: string verifySsl: boolean + ignorePrivate: boolean } export interface delugeConfig { diff --git a/webui/src/components/forms/biglybt.vue b/webui/src/components/forms/biglybt.vue index 4ac0f95f02..22877c75c3 100644 --- a/webui/src/components/forms/biglybt.vue +++ b/webui/src/components/forms/biglybt.vue @@ -25,11 +25,17 @@ > + + + diff --git a/webui/src/views/charts/components/2048.vue b/webui/src/views/charts/components/2048.vue index 8b01c2ee45..904cab1e87 100644 --- a/webui/src/views/charts/components/2048.vue +++ b/webui/src/views/charts/components/2048.vue @@ -11,7 +11,7 @@ diff --git a/webui/src/views/login/index.vue b/webui/src/views/login/index.vue index 2ab387432b..b1b11a278d 100644 --- a/webui/src/views/login/index.vue +++ b/webui/src/views/login/index.vue @@ -47,11 +47,12 @@ diff --git a/webui/src/views/oobe/index.vue b/webui/src/views/oobe/index.vue index 9fa480f1f7..06642a0cc0 100644 --- a/webui/src/views/oobe/index.vue +++ b/webui/src/views/oobe/index.vue @@ -34,10 +34,11 @@ diff --git a/webui/src/views/rule-management/components/generic/index.vue b/webui/src/views/rule-management/components/generic/index.vue index 58abc946ba..aabded509b 100644 --- a/webui/src/views/rule-management/components/generic/index.vue +++ b/webui/src/views/rule-management/components/generic/index.vue @@ -85,13 +85,14 @@ diff --git a/webui/src/views/rule-management/components/subscribe/logModal.vue b/webui/src/views/rule-management/components/subscribe/logModal.vue index 2073349844..6e921d9a8c 100644 --- a/webui/src/views/rule-management/components/subscribe/logModal.vue +++ b/webui/src/views/rule-management/components/subscribe/logModal.vue @@ -44,12 +44,13 @@ From e314b0180b90f07ddb1c3c8b37628906fb235547 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 31 Aug 2024 19:12:56 +0800 Subject: [PATCH 48/87] =?UTF-8?q?Revert=20"=E8=AE=A9=20lint=20=E5=BC=80?= =?UTF-8?q?=E5=BF=83"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 53c1913d173db77e955a72d76723ad07eb4369b3. --- webui/src/App.vue | 8 +++---- webui/src/api/model/init.ts | 2 +- webui/src/api/model/oobe.ts | 2 +- webui/src/api/model/statistic.ts | 2 +- webui/src/components/asyncMethod.vue | 3 +-- webui/src/components/autoUpdateBtn.vue | 7 +++--- webui/src/components/forms/biglybt.vue | 7 +++--- webui/src/components/forms/deluge.vue | 7 +++--- webui/src/components/forms/qbittorrent.vue | 9 ++++---- webui/src/components/forms/transmission.vue | 7 +++--- webui/src/components/iconFont.ts | 4 ++-- webui/src/components/pageFooter.vue | 12 +++++----- webui/src/components/pageHeader.vue | 19 ++++++++------- webui/src/components/plusModal.vue | 8 +++---- webui/src/components/settingsModal.vue | 17 +++++++------- webui/src/locale/en-US.ts | 1 - webui/src/locale/index.ts | 4 ++-- webui/src/locale/zh-CN.ts | 1 - webui/src/main.ts | 9 ++++---- webui/src/router/index.ts | 15 ++++++++---- webui/src/service/banList.ts | 8 +++---- webui/src/service/banLogs.ts | 8 +++---- webui/src/service/blacklist.ts | 8 +++---- webui/src/service/charts.ts | 14 +++++++---- webui/src/service/downloaders.ts | 16 +++++++++---- webui/src/service/init.ts | 10 ++++---- webui/src/service/login.ts | 4 ++-- webui/src/service/ranks.ts | 8 +++---- webui/src/service/ruleStatics.ts | 8 +++---- webui/src/service/ruleSubscribe.ts | 12 ++++++---- webui/src/service/utils.ts | 4 ++-- webui/src/service/version.ts | 11 ++++----- webui/src/stores/autoUpdate.ts | 9 ++++---- webui/src/stores/dark.ts | 4 ++-- webui/src/stores/endpoint.ts | 23 ++++++++++++------- webui/src/stores/locale.ts | 8 +++---- webui/src/utils/color.ts | 3 +-- webui/src/utils/networkRetry.ts | 4 ++-- .../src/views/banlist/components/banList.vue | 18 +++++++-------- .../views/banlist/components/banListItem.vue | 16 ++++++------- .../views/banlist/components/countryFlag.vue | 5 ++-- .../views/banlog/components/banlogTable.vue | 15 ++++++------ webui/src/views/banlog/index.vue | 3 +-- webui/src/views/charts/components/2048.vue | 2 +- webui/src/views/charts/components/banLine.vue | 19 ++++++++------- .../views/charts/components/dummyChart.vue | 12 +++++----- .../src/views/charts/components/fieldPie.vue | 18 +++++++-------- webui/src/views/charts/components/ispPie.vue | 18 +++++++-------- .../views/charts/components/plusWarpper.vue | 7 +++--- webui/src/views/charts/components/traffic.vue | 14 +++++------ webui/src/views/charts/components/trends.vue | 18 +++++++-------- webui/src/views/charts/index.vue | 2 +- .../dashboard/components/clientStatus.vue | 15 ++++++------ .../dashboard/components/clientStatusCard.vue | 22 ++++++++++-------- .../components/editDownloaderModal.vue | 10 ++++---- .../dashboard/components/peerListModal.vue | 13 +++++------ .../dashboard/components/statisticInfo.vue | 17 +++++++------- .../dashboard/components/torrentList.vue | 15 ++++++------ webui/src/views/dashboard/index.vue | 2 +- webui/src/views/login/index.vue | 11 ++++----- .../views/oobe/components/addDownloader.vue | 12 +++++----- webui/src/views/oobe/components/result.vue | 11 ++++----- webui/src/views/oobe/components/setToken.vue | 5 ++-- webui/src/views/oobe/components/welcome.vue | 3 +-- webui/src/views/oobe/index.vue | 9 ++++---- .../src/views/ranks/components/rankTable.vue | 11 ++++----- webui/src/views/ranks/index.vue | 2 +- .../components/generic/index.vue | 13 +++++------ .../subscribe/editRuleItemModal.vue | 11 ++++----- .../components/subscribe/index.vue | 3 +-- .../components/subscribe/logModal.vue | 13 +++++------ .../components/subscribe/ruleList.vue | 21 ++++++++++------- .../components/subscribe/settingsModal.vue | 10 ++++---- .../src/views/rule-management/locale/zh-CN.ts | 1 - .../components/ruleMetricsTable.vue | 19 ++++++++------- webui/src/views/rule-metrics/index.vue | 2 +- 76 files changed, 364 insertions(+), 360 deletions(-) diff --git a/webui/src/App.vue b/webui/src/App.vue index 22034ca348..a08cd01344 100644 --- a/webui/src/App.vue +++ b/webui/src/App.vue @@ -55,10 +55,10 @@ diff --git a/webui/src/views/charts/components/2048.vue b/webui/src/views/charts/components/2048.vue index 904cab1e87..8b01c2ee45 100644 --- a/webui/src/views/charts/components/2048.vue +++ b/webui/src/views/charts/components/2048.vue @@ -11,7 +11,7 @@ diff --git a/webui/src/views/login/index.vue b/webui/src/views/login/index.vue index b1b11a278d..2ab387432b 100644 --- a/webui/src/views/login/index.vue +++ b/webui/src/views/login/index.vue @@ -47,12 +47,11 @@ diff --git a/webui/src/views/oobe/index.vue b/webui/src/views/oobe/index.vue index 06642a0cc0..9fa480f1f7 100644 --- a/webui/src/views/oobe/index.vue +++ b/webui/src/views/oobe/index.vue @@ -34,11 +34,10 @@ diff --git a/webui/src/views/rule-management/components/generic/index.vue b/webui/src/views/rule-management/components/generic/index.vue index aabded509b..58abc946ba 100644 --- a/webui/src/views/rule-management/components/generic/index.vue +++ b/webui/src/views/rule-management/components/generic/index.vue @@ -85,14 +85,13 @@ diff --git a/webui/src/views/rule-management/components/subscribe/logModal.vue b/webui/src/views/rule-management/components/subscribe/logModal.vue index 6e921d9a8c..2073349844 100644 --- a/webui/src/views/rule-management/components/subscribe/logModal.vue +++ b/webui/src/views/rule-management/components/subscribe/logModal.vue @@ -44,13 +44,12 @@ From d6c56392e0fefa993589fff32610fe3bf6f005e9 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 31 Aug 2024 19:13:24 +0800 Subject: [PATCH 49/87] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/views/charts/components/traffic.vue | 9 --------- 1 file changed, 9 deletions(-) diff --git a/webui/src/views/charts/components/traffic.vue b/webui/src/views/charts/components/traffic.vue index 24dadf456a..75ca42c4f2 100644 --- a/webui/src/views/charts/components/traffic.vue +++ b/webui/src/views/charts/components/traffic.vue @@ -109,15 +109,6 @@ const chartOptions = ref({ type: 'shadow' }, formatter: function (value: CallbackDataParams[]) { - // return ( - // d((value[0].data as OptionDataValue[])[0] as Date, 'short') + - // ':
' + - // value - // .map((params: CallbackDataParams) => { - // return `${params.marker} ${params.seriesName}: ${formatFileSize((value[0].data as OptionDataValue[])[1] as number)}` - // }) - // .join('
') - // ) return ( d((value[0].data as OptionDataValue[])[0] as Date, 'short') + ':
' + From 2c3c1f7d0f2204a56176870d7c5975d567330aa3 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 31 Aug 2024 19:16:07 +0800 Subject: [PATCH 50/87] =?UTF-8?q?Lint=20=E5=BC=80=E5=BF=83=E4=B8=80?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/views/charts/components/traffic.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webui/src/views/charts/components/traffic.vue b/webui/src/views/charts/components/traffic.vue index 75ca42c4f2..befeff8435 100644 --- a/webui/src/views/charts/components/traffic.vue +++ b/webui/src/views/charts/components/traffic.vue @@ -110,13 +110,13 @@ const chartOptions = ref({ }, formatter: function (value: CallbackDataParams[]) { return ( - d((value[0].data as OptionDataValue[])[0] as Date, 'short') + - ':
' + - value - .map((params: CallbackDataParams) => { - return `${params.marker} ${params.seriesName}: ${formatFileSize((params.data as OptionDataValue[])[1] as number)}` - }) - .join('
') + d((value[0].data as OptionDataValue[])[0] as Date, 'short') + + ':
' + + value + .map((params: CallbackDataParams) => { + return `${params.marker} ${params.seriesName}: ${formatFileSize((params.data as OptionDataValue[])[1] as number)}` + }) + .join('
') ) } }, From c12c269df24a080804ef8273056a8a9541052cf7 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 31 Aug 2024 19:18:11 +0800 Subject: [PATCH 51/87] =?UTF-8?q?Lint=20=E5=BC=80=E5=BF=83=E4=B8=80?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/views/charts/components/traffic.vue | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/webui/src/views/charts/components/traffic.vue b/webui/src/views/charts/components/traffic.vue index befeff8435..6c0348098e 100644 --- a/webui/src/views/charts/components/traffic.vue +++ b/webui/src/views/charts/components/traffic.vue @@ -70,20 +70,25 @@ diff --git a/webui/src/views/dashboard/components/editDownloaderModal.vue b/webui/src/views/dashboard/components/editDownloaderModal.vue index c93a41d349..a71925a252 100644 --- a/webui/src/views/dashboard/components/editDownloaderModal.vue +++ b/webui/src/views/dashboard/components/editDownloaderModal.vue @@ -49,6 +49,7 @@ import {ClientTypeEnum, type downloaderConfig} from '@/api/model/downloader' import {CreateDownloader, TestDownloaderConfig, UpdateDownloader} from '@/service/downloaders' const qbittorrentForm = defineAsyncComponent(() => import('@/components/forms/qbittorrent.vue')) +const qbittorrentEEForm = defineAsyncComponent(() => import('@/components/forms/qbittorrentee.vue')) const transmissionForm = defineAsyncComponent(() => import('@/components/forms/transmission.vue')) const biglybtForm = defineAsyncComponent(() => import('@/components/forms/biglybt.vue')) const delugeForm = defineAsyncComponent(() => import('@/components/forms/deluge.vue')) @@ -59,6 +60,7 @@ const newItem = ref(false) const formMap = { [ClientTypeEnum.qBittorrent]: qbittorrentForm, + [ClientTypeEnum.qBittorrentEE]: qbittorrentEEForm, [ClientTypeEnum.Transmission]: transmissionForm, [ClientTypeEnum.BiglyBT]: biglybtForm, [ClientTypeEnum.Deluge]: delugeForm diff --git a/webui/src/views/dashboard/locale/en-US.ts b/webui/src/views/dashboard/locale/en-US.ts index 3bb8394749..082bddf417 100644 --- a/webui/src/views/dashboard/locale/en-US.ts +++ b/webui/src/views/dashboard/locale/en-US.ts @@ -43,6 +43,8 @@ export default { 'page.dashboard.editModal.label.incrementBan': 'Incremental Ban', 'page.dashboard.editModal.label.incrementBan.description': 'Helps to alleviate the downloader pressure when saving the ban list, but may cause the inability to ban Peers on some downloaders', + 'page.dashboard.editModal.label.shadowBan': 'ShadowBan', + 'page.dashboard.editModal.label.shadowBan.description': 'Use qBittorrent Enhanced Edition\'s ShadowBan API to replace the regular IP block list.', 'page.dashboard.editModal.label.verifySsl': 'Verify SSL', 'page.dashboard.editModal.biglybt': 'Please install plugin at {url} first.', 'page.dashboard.editModal.biglybt.url': 'here', diff --git a/webui/src/views/dashboard/locale/zh-CN.ts b/webui/src/views/dashboard/locale/zh-CN.ts index 0cc3aaf89a..6913339d49 100644 --- a/webui/src/views/dashboard/locale/zh-CN.ts +++ b/webui/src/views/dashboard/locale/zh-CN.ts @@ -44,6 +44,8 @@ export default { 'page.dashboard.editModal.label.incrementBan': '增量封禁', 'page.dashboard.editModal.label.incrementBan.description': '有助于缓解保存封禁列表时的下载器压力,但在部分下载器上可能会导致无法封禁Peers', + 'page.dashboard.editModal.label.shadowBan': 'ShadowBan', + 'page.dashboard.editModal.label.shadowBan.description': '使用 qBittorrent Enhanced Edition 提供的 ShadowBan API 来代替传统 IP 屏蔽列表', 'page.dashboard.editModal.label.verifySsl': '验证SSL证书', 'page.dashboard.editModal.biglybt': '请先安装 {url}', 'page.dashboard.editModal.biglybt.url': '插件', diff --git a/webui/src/views/oobe/components/addDownloader.vue b/webui/src/views/oobe/components/addDownloader.vue index 11298e9a50..8cf7a999d0 100644 --- a/webui/src/views/oobe/components/addDownloader.vue +++ b/webui/src/views/oobe/components/addDownloader.vue @@ -49,12 +49,14 @@ import {TestDownloaderConfig} from '@/service/init' import {Message} from '@arco-design/web-vue' const qbittorrentForm = defineAsyncComponent(() => import('@/components/forms/qbittorrent.vue')) +const qbittorrentEEForm = defineAsyncComponent(() => import('@/components/forms/qbittorrentee.vue')) const transmissionForm = defineAsyncComponent(() => import('@/components/forms/transmission.vue')) const biglybtForm = defineAsyncComponent(() => import('@/components/forms/biglybt.vue')) const delugeForm = defineAsyncComponent(() => import('@/components/forms/deluge.vue')) const formMap = { [ClientTypeEnum.qBittorrent]: qbittorrentForm, + [ClientTypeEnum.qBittorrentEE]: qbittorrentEEForm, [ClientTypeEnum.Transmission]: transmissionForm, [ClientTypeEnum.BiglyBT]: biglybtForm, [ClientTypeEnum.Deluge]: delugeForm From fa2eb4962aa1413d45fd48febe3e824e507bd6c9 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Sep 2024 02:34:32 +0800 Subject: [PATCH 58/87] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=20qBittorrentEE=20=E6=96=B0=20ShadowBan=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/qbittorrent/QBittorrentEE.java | 6 +++--- .../impl/webapi/PBHDownloaderController.java | 4 +++- webui/src/components/forms/qbittorrentee.vue | 2 +- .../components/editDownloaderModal.vue | 17 +++++++++-------- webui/src/views/dashboard/locale/en-US.ts | 2 +- webui/src/views/dashboard/locale/zh-CN.ts | 2 +- .../src/views/oobe/components/addDownloader.vue | 9 +++++---- 7 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java index 063a76338f..a9cb43cdba 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java +++ b/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/qbittorrent/QBittorrentEE.java @@ -128,7 +128,7 @@ public String getEndpoint() { @Override public String getType() { - return "qBittorrent"; + return "qBittorrentEE"; } public boolean isLoggedIn() { @@ -374,7 +374,7 @@ public static class Config { public static Config readFromYaml(ConfigurationSection section) { Config config = new Config(); - config.setType("qbittorrent"); + config.setType("qbittorrentee"); config.setEndpoint(section.getString("endpoint")); if (config.getEndpoint().endsWith("/")) { // 浏览器复制党 workaround 一下, 避免连不上的情况 config.setEndpoint(config.getEndpoint().substring(0, config.getEndpoint().length() - 1)); @@ -394,7 +394,7 @@ public static Config readFromYaml(ConfigurationSection section) { public YamlConfiguration saveToYaml() { YamlConfiguration section = new YamlConfiguration(); - section.set("type", "qbittorrent"); + section.set("type", "qbittorrentee"); section.set("endpoint", endpoint); section.set("username", username); section.set("password", password); diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java index ca8b99bad3..af9c9cea9c 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHDownloaderController.java @@ -264,7 +264,9 @@ private void handleDownloaderStatus(@NotNull Context ctx, String downloaderName) } private void handleDownloaderList(@NotNull Context ctx) { - List downloaders = getServer().getDownloaders().stream().map(d -> new DownloaderWrapper(d.getName(), d.getEndpoint(), d.getType().toLowerCase())).toList(); + List downloaders = getServer().getDownloaders() + .stream().map(d -> new DownloaderWrapper(d.getName(), d.getEndpoint(), d.getType().toLowerCase())) + .toList(); ctx.json(new StdResp(true, null, downloaders)); } diff --git a/webui/src/components/forms/qbittorrentee.vue b/webui/src/components/forms/qbittorrentee.vue index 1cc4345a28..ea12b8dc36 100644 --- a/webui/src/components/forms/qbittorrentee.vue +++ b/webui/src/components/forms/qbittorrentee.vue @@ -34,7 +34,7 @@ - + diff --git a/webui/src/views/dashboard/components/editDownloaderModal.vue b/webui/src/views/dashboard/components/editDownloaderModal.vue index a71925a252..f39e23c47f 100644 --- a/webui/src/views/dashboard/components/editDownloaderModal.vue +++ b/webui/src/views/dashboard/components/editDownloaderModal.vue @@ -11,14 +11,15 @@ > - - qBittorrent - - Transmission - - BiglyBT - Deluge - + + qBittorrent + qBittorrentEE + BiglyBT + Deluge + + Transmission + +