From c88964275da8f3133a7208bcbb5cf6a98c1ef68f Mon Sep 17 00:00:00 2001 From: The-Coding-Kiddo Date: Wed, 9 Apr 2025 02:46:24 +0300 Subject: [PATCH] fix: improve stress testing functionality and stop button behavior --- .gitignore | 37 + README.md | 1 + index.html | 58 + package-lock.json | 8841 +++++++++++++++++ package.json | 46 + src/App.tsx | 32 + src/assets/bgreen-logo.png | Bin 0 -> 82379 bytes src/assets/blc-logo.png | Bin 0 -> 43417 bytes src/assets/blc-logo.svg | 15 + src/components/DebugConsole.tsx | 110 + src/components/Layout/MainLayout.tsx | 63 + src/components/Layout/Sidebar.tsx | 200 + .../Migration/MigrationAdviceCard.tsx | 247 + .../Migration/ResourceDistributionChart.tsx | 228 + src/components/Migration/SummaryStats.tsx | 138 + .../Migration/VerifiedMigration.tsx | 163 + src/components/Migration/hooks.ts | 161 + src/components/Migration/types.ts | 34 + src/components/styled/Logo.tsx | 10 + src/main.tsx | 9 + src/pages/.gitignore | 1 + src/pages/Home.tsx | 1305 +++ src/pages/Maintenance.tsx | 247 + src/pages/Migration.tsx | 778 ++ src/pages/MonitoringSystem.tsx | 600 ++ src/pages/StressTesting.tsx | 478 + src/pages/Temperature.tsx | 667 ++ src/plotly.d.ts | 25 + src/services/monitoringService.ts | 302 + src/services/stressService.ts | 196 + src/theme.ts | 95 + src/types/images.d.ts | 14 + tsconfig.json | 21 + tsconfig.node.json | 10 + vite.config.ts | 7 + 35 files changed, 15139 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.tsx create mode 100644 src/assets/bgreen-logo.png create mode 100644 src/assets/blc-logo.png create mode 100644 src/assets/blc-logo.svg create mode 100644 src/components/DebugConsole.tsx create mode 100644 src/components/Layout/MainLayout.tsx create mode 100644 src/components/Layout/Sidebar.tsx create mode 100644 src/components/Migration/MigrationAdviceCard.tsx create mode 100644 src/components/Migration/ResourceDistributionChart.tsx create mode 100644 src/components/Migration/SummaryStats.tsx create mode 100644 src/components/Migration/VerifiedMigration.tsx create mode 100644 src/components/Migration/hooks.ts create mode 100644 src/components/Migration/types.ts create mode 100644 src/components/styled/Logo.tsx create mode 100644 src/main.tsx create mode 100644 src/pages/.gitignore create mode 100644 src/pages/Home.tsx create mode 100644 src/pages/Maintenance.tsx create mode 100644 src/pages/Migration.tsx create mode 100644 src/pages/MonitoringSystem.tsx create mode 100644 src/pages/StressTesting.tsx create mode 100644 src/pages/Temperature.tsx create mode 100644 src/plotly.d.ts create mode 100644 src/services/monitoringService.ts create mode 100644 src/services/stressService.ts create mode 100644 src/theme.ts create mode 100644 src/types/images.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..090246d --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Dependencies +/node_modules +/.pnp +.pnp.js + +# Testing +/coverage + +# Production +/build +/dist + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +.env + +# Logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# TypeScript +*.tsbuildinfo diff --git a/README.md b/README.md new file mode 100644 index 0000000..9e6e007 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# AyposWeb diff --git a/index.html b/index.html new file mode 100644 index 0000000..7f385d7 --- /dev/null +++ b/index.html @@ -0,0 +1,58 @@ + + + + + + + BLC Dashboard + + + + + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..477d520 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8841 @@ +{ + "name": "ayposweb", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ayposweb", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.15.3", + "@mui/lab": "^5.0.0-alpha.165", + "@mui/material": "^5.15.3", + "@mui/x-tree-view": "^7.26.0", + "@types/plotly.js": "^2.35.2", + "axios": "^1.8.4", + "chart.js": "^4.4.1", + "date-fns": "^3.0.6", + "plotly.js": "^3.0.1", + "plotly.js-dist": "^3.0.1", + "plotly.js-dist-min": "^3.0.1", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "react-google-charts": "^5.2.1", + "react-plotly.js": "^2.6.0", + "react-router-dom": "^6.21.1", + "recharts": "^2.15.1" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "license": "MIT", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "license": "ISC", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==", + "license": "ISC" + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", + "license": "BSD-3-Clause", + "peerDependencies": { + "mapbox-gl": ">=0.32.1 <2.0.0" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", + "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "tinyqueue": "^3.0.0" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.40-1", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40-1.tgz", + "integrity": "sha512-agKXuNNy0bHUmeU7pNmoZwNFr7Hiyhojkb9+2PVyDG5+6RafYuyMgbrav8CndsB7KUc/U51JAw9vKNDLYBzaUA==", + "deprecated": "This package has been replaced by @base-ui-components/react", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.17.1.tgz", + "integrity": "sha512-OcZj+cs6EfUD39IoPBOgN61zf1XFVY+imsGoBDwXeSq2UHJZE3N59zzBOVjclck91Ne3e9gudONOeILvHCIhUA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.17.1.tgz", + "integrity": "sha512-CN86LocjkunFGG0yPlO4bgqHkNGgaEOEc3X/jG5Bzm401qYw79/SaLrofA7yAKCCXAGdIGnLoMHohc3+ubs95A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab": { + "version": "5.0.0-alpha.176", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.176.tgz", + "integrity": "sha512-DcZt1BAz4CDMUFGUvKqRh6W0sehmPj5luVHPx4vzSNnXj8xFvOdHwvNZ0bzNXy/Ol+81bkxcHQoIG2VOJuLnbw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40-1", + "@mui/system": "^5.17.1", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": ">=5.15.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/styled-engine": { + "version": "5.16.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", + "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/system": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.17.1.tgz", + "integrity": "sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.16.14", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.17.1.tgz", + "integrity": "sha512-2B33kQf+GmPnrvXXweWAx+crbiUEsxCdCN979QDYnlH9ox4pd+0/IBriWLV+l6ORoBF60w39cWjFnJYGFdzXcw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.17.1", + "@mui/system": "^5.17.1", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/styled-engine": { + "version": "5.16.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", + "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/system": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.17.1.tgz", + "integrity": "sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.16.14", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.1.tgz", + "integrity": "sha512-1kQ7REYjjzDukuMfTbAjm3pLEhD7gUMC2bWhg9VD6f6sHzyokKzX0XHzlr3IdzNWBjPytGkzHpPIRQrUOoPLCQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/utils": "^7.0.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming/node_modules/@mui/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.0.tgz", + "integrity": "sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming/node_modules/@mui/utils": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.0.1.tgz", + "integrity": "sha512-SJKrrebNpmK9rJCnVL29nGPhPXQYtBZmb7Dsp0f58uIUhQfAKcBXHE4Kjs06SX4CwqeCuwEVgcHY+MgAO6XQ/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/types": "^7.4.0", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.1.tgz", + "integrity": "sha512-BeGe4xZmF7tESKhmctYrL54Kl25kGHPKVdZYM5qj5Xz76WM/poY+d8EmAqUesT6k2rbJWPp2gtOAXXinNCGunQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.0.1.tgz", + "integrity": "sha512-pK+puz0hRPHEKGlcPd80mKYD3jpyi0uVIwWffox1WZgPTQMw2dCKLcD+9ndMDJADnrKzmKlpoH756PPFh2UvWA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/private-theming": "^7.0.1", + "@mui/styled-engine": "^7.0.1", + "@mui/types": "^7.4.0", + "@mui/utils": "^7.0.1", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@mui/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.0.tgz", + "integrity": "sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@mui/utils": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.0.1.tgz", + "integrity": "sha512-SJKrrebNpmK9rJCnVL29nGPhPXQYtBZmb7Dsp0f58uIUhQfAKcBXHE4Kjs06SX4CwqeCuwEVgcHY+MgAO6XQ/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/types": "^7.4.0", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.28.0.tgz", + "integrity": "sha512-p4GEp/09bLDumktdIMiw+OF4p+pJOOjTG0VUvzNxjbHB9GxbBKoMcHrmyrURqoBnQpWIeFnN/QAoLMFSpfwQbw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@mui/x-tree-view": { + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.28.1.tgz", + "integrity": "sha512-nXrP5pDgoi6snxngIezL8PRvkWECqSApq8Rh8+TVsslBog+XmWs5PHgUXaKsCgi3SN0eNOvjz0+e4I0c+qkuvA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", + "@mui/x-internals": "7.28.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@plotly/d3": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.2.tgz", + "integrity": "sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA==", + "license": "BSD-3-Clause" + }, + "node_modules/@plotly/d3-sankey": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", + "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + } + }, + "node_modules/@plotly/d3-sankey-circular": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", + "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", + "license": "MIT", + "dependencies": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + } + }, + "node_modules/@plotly/mapbox-gl": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", + "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/@plotly/point-cluster": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", + "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "license": "MIT", + "dependencies": { + "array-bounds": "^1.0.1", + "binary-search-bounds": "^2.0.4", + "clamp": "^1.0.1", + "defined": "^1.0.0", + "dtype": "^2.0.0", + "flatten-vertex-data": "^1.0.2", + "is-obj": "^1.0.1", + "math-log2": "^1.0.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@turf/area": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.2.0.tgz", + "integrity": "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.2.0", + "@turf/meta": "^7.2.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.2.0.tgz", + "integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.2.0", + "@turf/meta": "^7.2.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.2.0.tgz", + "integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.2.0", + "@turf/meta": "^7.2.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.2.0.tgz", + "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.2.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/geojson-vt": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/less": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/less/-/less-3.0.8.tgz", + "integrity": "sha512-Gjm4+H9noDJgu5EdT3rUw5MhPBag46fiOy27BefvWkNL8mlZnKnCaVVVTLKj6RYXed9b62CPKnPav9govyQDzA==", + "license": "MIT" + }, + "node_modules/@types/mapbox__point-geometry": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", + "license": "MIT" + }, + "node_modules/@types/mapbox__vector-tile": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, + "node_modules/@types/node": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/pbf": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", + "license": "MIT" + }, + "node_modules/@types/plotly.js": { + "version": "2.35.4", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-2.35.4.tgz", + "integrity": "sha512-A8d3r8I2vIsaMRJ+0ZLvzW98l4vDu5AuLAWwtWSF61ekqUj3q6Hu0w6RQk+S1fumu7A3Fji+aodta4F9+8BMuA==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", + "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", + "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stylus": { + "version": "0.48.43", + "resolved": "https://registry.npmjs.org/@types/stylus/-/stylus-0.48.43.tgz", + "integrity": "sha512-72dv/zdhuyXWVHUXG2VTPEQdOG+oen95/DNFx2aMFFaY6LoITI6PwEqf5x31JF49kp2w9hvUzkNfTGBIeg61LQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "peer": true + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==", + "license": "MIT" + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-normalize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", + "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "license": "MIT", + "dependencies": { + "array-bounds": "^1.0.0" + } + }, + "node_modules/array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==", + "license": "MIT" + }, + "node_modules/array-rearrange": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", + "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", + "license": "MIT" + }, + "node_modules/bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==", + "license": "MIT" + }, + "node_modules/bitmap-sdf": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz", + "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==", + "license": "MIT" + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001712", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz", + "integrity": "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canvas-fit": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", + "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==", + "license": "MIT", + "dependencies": { + "element-size": "^1.1.1" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chart.js": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz", + "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-alpha": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", + "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", + "license": "MIT", + "dependencies": { + "color-parse": "^1.3.8" + } + }, + "node_modules/color-alpha/node_modules/color-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", + "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", + "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "license": "MIT", + "dependencies": { + "clamp": "^1.0.1" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-normalize": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", + "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", + "license": "MIT", + "dependencies": { + "clamp": "^1.0.1", + "color-rgba": "^2.1.1", + "dtype": "^2.0.0" + } + }, + "node_modules/color-normalize/node_modules/color-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", + "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/color-normalize/node_modules/color-rgba": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz", + "integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==", + "license": "MIT", + "dependencies": { + "color-parse": "^1.4.2", + "color-space": "^2.0.0" + } + }, + "node_modules/color-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz", + "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/color-rgba": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", + "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", + "license": "MIT", + "dependencies": { + "color-parse": "^2.0.0", + "color-space": "^2.0.0" + } + }, + "node_modules/color-space": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.3.1.tgz", + "integrity": "sha512-5DJdKYwoDji3ik/i0xSn+SiwXsfwr+1FEcCMUz2GS5speGCfGSbBMOLd84SDUBOuX8y4CvdFJmOBBJuC4wp7sQ==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-font": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", + "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", + "license": "MIT", + "dependencies": { + "css-font-size-keywords": "^1.0.0", + "css-font-stretch-keywords": "^1.0.1", + "css-font-style-keywords": "^1.0.1", + "css-font-weight-keywords": "^1.0.0", + "css-global-keywords": "^1.0.1", + "css-system-font-keywords": "^1.0.0", + "pick-by-alias": "^1.2.0", + "string-split-by": "^1.0.0", + "unquote": "^1.1.0" + } + }, + "node_modules/css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==", + "license": "MIT" + }, + "node_modules/css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==", + "license": "MIT" + }, + "node_modules/css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==", + "license": "MIT" + }, + "node_modules/css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==", + "license": "MIT" + }, + "node_modules/css-global-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", + "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==", + "license": "MIT" + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-system-font-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", + "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==", + "license": "MIT" + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/d3-geo-projection": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", + "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "license": "BSD-3-Clause", + "dependencies": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.12.0", + "resolve": "^1.1.10" + }, + "bin": { + "geo2svg": "bin/geo2svg", + "geograticule": "bin/geograticule", + "geoproject": "bin/geoproject", + "geoquantize": "bin/geoquantize", + "geostitch": "bin/geostitch" + } + }, + "node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-kerning": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", + "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/draw-svg-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", + "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", + "license": "MIT", + "dependencies": { + "abs-svg-path": "~0.1.1", + "normalize-svg-path": "~0.1.0" + } + }, + "node_modules/dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==", + "license": "MIT" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.134", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.134.tgz", + "integrity": "sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==", + "license": "ISC" + }, + "node_modules/element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==", + "license": "MIT" + }, + "node_modules/elementary-circuits-directed-graph": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", + "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "license": "MIT", + "dependencies": { + "strongly-connected-components": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "license": "MIT", + "peer": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/esbuild-style-plugin": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/esbuild-style-plugin/-/esbuild-style-plugin-1.6.3.tgz", + "integrity": "sha512-XPEKf4FjLjEVLv/dJH4UxDzXCrFHYpD93DBO8B+izdZARW5b7nNKQbnKv3J+7VDWJbgCU+hzfgIh2AuIZzlmXQ==", + "license": "ISC", + "dependencies": { + "@types/less": "^3.0.3", + "@types/sass": "^1.43.1", + "@types/stylus": "^0.48.38", + "glob": "^10.2.2", + "postcss": "^8.4.31", + "postcss-modules": "^6.0.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "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", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/falafel/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-isnumeric": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", + "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", + "license": "MIT", + "dependencies": { + "is-string-blank": "^1.0.1" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/flatten-vertex-data": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", + "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", + "license": "MIT", + "dependencies": { + "dtype": "^2.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/font-atlas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", + "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", + "license": "MIT", + "dependencies": { + "css-font": "^1.0.0" + } + }, + "node_modules/font-measure": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", + "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "license": "MIT", + "dependencies": { + "css-font": "^1.2.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", + "license": "ISC" + }, + "node_modules/get-canvas-context": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", + "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==", + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==", + "license": "Zlib" + }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", + "license": "MIT" + }, + "node_modules/gl-text": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.4.0.tgz", + "integrity": "sha512-o47+XBqLCj1efmuNyCHt7/UEJmB9l66ql7pnobD6p+sgmBUdzfMZXIF0zD2+KRfpd99DJN+QXdvTFAGCKCVSmQ==", + "license": "MIT", + "dependencies": { + "bit-twiddle": "^1.0.2", + "color-normalize": "^1.5.0", + "css-font": "^1.2.0", + "detect-kerning": "^2.1.2", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "font-atlas": "^2.1.0", + "font-measure": "^1.2.2", + "gl-util": "^3.1.2", + "is-plain-obj": "^1.1.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "parse-unit": "^1.0.1", + "pick-by-alias": "^1.2.0", + "regl": "^2.0.0", + "to-px": "^1.0.1", + "typedarray-pool": "^1.1.0" + } + }, + "node_modules/gl-util": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", + "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", + "license": "MIT", + "dependencies": { + "is-browser": "^2.0.1", + "is-firefox": "^1.0.3", + "is-plain-obj": "^1.1.0", + "number-is-integer": "^1.0.1", + "object-assign": "^4.1.0", + "pick-by-alias": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-prefix": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "license": "MIT", + "dependencies": { + "ini": "^4.1.3", + "kind-of": "^6.0.3", + "which": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/global-prefix/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", + "license": "MIT", + "dependencies": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "node_modules/glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", + "license": "MIT", + "dependencies": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + } + }, + "node_modules/glsl-resolve/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", + "license": "MIT" + }, + "node_modules/glsl-resolve/node_modules/xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==", + "license": "MIT" + }, + "node_modules/glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", + "license": "MIT", + "dependencies": { + "glsl-tokenizer": "^2.0.0" + } + }, + "node_modules/glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==", + "license": "MIT" + }, + "node_modules/glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", + "license": "MIT", + "dependencies": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "node_modules/glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==", + "license": "MIT" + }, + "node_modules/glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==", + "license": "MIT" + }, + "node_modules/glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==", + "license": "MIT" + }, + "node_modules/glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==", + "license": "MIT" + }, + "node_modules/glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==", + "license": "MIT" + }, + "node_modules/glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "license": "MIT", + "dependencies": { + "through2": "^0.6.3" + } + }, + "node_modules/glsl-tokenizer/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/glsl-tokenizer/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glsl-tokenizer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, + "node_modules/glsl-tokenizer/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "license": "MIT", + "dependencies": { + "bl": "^2.2.1", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + }, + "bin": { + "glslify": "bin.js" + } + }, + "node_modules/glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "license": "MIT", + "dependencies": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "node_modules/glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "license": "ISC", + "dependencies": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-hover": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", + "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==", + "license": "MIT", + "dependencies": { + "is-browser": "^2.0.1" + } + }, + "node_modules/has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "license": "MIT", + "dependencies": { + "is-browser": "^2.0.1" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-mobile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", + "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string-blank": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==", + "license": "MIT" + }, + "node_modules/is-svg-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", + "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==", + "license": "MIT" + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", + "license": "ISC" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", + "license": "MIT", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/map-limit/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/mapbox-gl": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", + "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", + "license": "SEE LICENSE IN LICENSE.txt", + "peer": true, + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.1.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/maplibre-gl": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", + "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^20.3.1", + "@types/geojson": "^7946.0.14", + "@types/geojson-vt": "3.2.5", + "@types/mapbox__point-geometry": "^0.1.4", + "@types/mapbox__vector-tile": "^1.3.4", + "@types/pbf": "^3.0.5", + "@types/supercluster": "^7.1.3", + "earcut": "^3.0.0", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.3", + "global-prefix": "^4.0.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.3.0", + "potpack": "^2.0.0", + "quickselect": "^3.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0", + "vt-pbf": "^3.1.3" + }, + "engines": { + "node": ">=16.14.0", + "npm": ">=8.1.0" + }, + "funding": { + "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" + } + }, + "node_modules/maplibre-gl/node_modules/@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==", + "license": "BSD-2-Clause" + }, + "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/maplibre-gl/node_modules/earcut": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz", + "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/potpack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.0.2" + } + }, + "node_modules/maplibre-gl/node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", + "license": "MIT", + "dependencies": { + "mouse-event": "^1.0.0" + } + }, + "node_modules/mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==", + "license": "MIT" + }, + "node_modules/mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==", + "license": "MIT" + }, + "node_modules/mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", + "license": "MIT", + "dependencies": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT", + "peer": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-svg-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", + "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==", + "license": "MIT" + }, + "node_modules/number-is-integer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", + "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==", + "license": "MIT", + "dependencies": { + "is-finite": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parenthesis": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "license": "MIT", + "dependencies": { + "pick-by-alias": "^1.2.0" + } + }, + "node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "license": "MIT" + }, + "node_modules/parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/pick-by-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", + "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plotly.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-3.0.1.tgz", + "integrity": "sha512-eWEUkqdv4sblmUQJ7xGlEA+LghzEVPJOlPBZMJuagG0CsQxlmBb+7rd0UFVig5jhRnN8PQqRQaLv6qXIjnvzgg==", + "license": "MIT", + "dependencies": { + "@plotly/d3": "3.8.2", + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@plotly/mapbox-gl": "1.13.4", + "@turf/area": "^7.1.0", + "@turf/bbox": "^7.1.0", + "@turf/centroid": "^7.1.0", + "base64-arraybuffer": "^1.0.2", + "canvas-fit": "^1.5.0", + "color-alpha": "1.0.4", + "color-normalize": "1.5.0", + "color-parse": "2.0.0", + "color-rgba": "3.0.0", + "country-regex": "^1.1.0", + "css-loader": "^7.1.2", + "d3-force": "^1.2.1", + "d3-format": "^1.4.5", + "d3-geo": "^1.12.1", + "d3-geo-projection": "^2.9.0", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^3.0.1", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.3", + "esbuild-style-plugin": "^1.6.3", + "fast-isnumeric": "^1.1.4", + "gl-mat4": "^1.2.0", + "gl-text": "^1.4.0", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "is-mobile": "^4.0.0", + "maplibre-gl": "^4.7.1", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "native-promise-only": "^0.8.1", + "parse-svg-path": "^0.1.2", + "point-in-polygon": "^1.1.0", + "polybooljs": "^1.2.2", + "probe-image-size": "^7.2.3", + "regl": "npm:@plotly/regl@^2.1.2", + "regl-error2d": "^2.0.12", + "regl-line2d": "^3.1.3", + "regl-scatter2d": "^3.3.1", + "regl-splom": "^1.0.14", + "strongly-connected-components": "^1.0.1", + "style-loader": "^4.0.0", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.2", + "to-px": "1.0.1", + "topojson-client": "^3.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/plotly.js-dist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plotly.js-dist/-/plotly.js-dist-3.0.1.tgz", + "integrity": "sha512-/LvKEGxWime7KPzO6nlnfNyTt/pHn4Ctlgj98RUJyjUIu3IHowOqSu+tRq3B/xQ6GZWj5uDz2hS+eEBsgg/xHw==", + "license": "MIT" + }, + "node_modules/plotly.js-dist-min": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plotly.js-dist-min/-/plotly.js-dist-min-3.0.1.tgz", + "integrity": "sha512-RReOqr6TfoHaTbVAoHR1UbTCOSRDsQ7Hbthd+3XAxOwaKmxCE3oejMhLG7urQSqWC65DAcSKV23kZd8e+7mG7w==", + "license": "MIT" + }, + "node_modules/point-in-polygon": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", + "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", + "license": "MIT" + }, + "node_modules/polybooljs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.2.tgz", + "integrity": "sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-6.0.1.tgz", + "integrity": "sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==", + "license": "MIT", + "dependencies": { + "generic-names": "^4.0.0", + "icss-utils": "^5.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.3" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "license": "MIT", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "license": "ISC" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz", + "integrity": "sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-google-charts": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-google-charts/-/react-google-charts-5.2.1.tgz", + "integrity": "sha512-mCbPiObP8yWM5A9ogej7Qp3/HX4EzOwuEzUYvcfHtL98Xt4V/brD14KgfDzSNNtyD48MNXCpq5oVaYKt0ykQUQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-is": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "license": "MIT" + }, + "node_modules/react-plotly.js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", + "integrity": "sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "plotly.js": ">1.34.0", + "react": ">0.13.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/recharts": { + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.2.tgz", + "integrity": "sha512-xv9lVztv3ingk7V3Jf05wfAZbM9Q2umJzu5t/cfnAK7LUslNrGT7LPBr74G+ok8kSCeFMaePmWMg0rcYOnczTw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regl": { + "name": "@plotly/regl", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", + "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==", + "license": "MIT" + }, + "node_modules/regl-error2d": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", + "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "license": "MIT", + "dependencies": { + "array-bounds": "^1.0.1", + "color-normalize": "^1.5.0", + "flatten-vertex-data": "^1.0.2", + "object-assign": "^4.1.1", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "node_modules/regl-line2d": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.3.tgz", + "integrity": "sha512-fkgzW+tTn4QUQLpFKsUIE0sgWdCmXAM3ctXcCgoGBZTSX5FE2A0M7aynz7nrZT5baaftLrk9te54B+MEq4QcSA==", + "license": "MIT", + "dependencies": { + "array-bounds": "^1.0.1", + "array-find-index": "^1.0.2", + "array-normalize": "^1.1.4", + "color-normalize": "^1.5.0", + "earcut": "^2.1.5", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0" + } + }, + "node_modules/regl-scatter2d": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz", + "integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==", + "license": "MIT", + "dependencies": { + "@plotly/point-cluster": "^3.1.9", + "array-range": "^1.0.1", + "array-rearrange": "^2.2.2", + "clamp": "^1.0.1", + "color-id": "^1.1.0", + "color-normalize": "^1.5.0", + "color-rgba": "^2.1.1", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "is-iexplorer": "^1.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "node_modules/regl-scatter2d/node_modules/color-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", + "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/regl-scatter2d/node_modules/color-rgba": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz", + "integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==", + "license": "MIT", + "dependencies": { + "color-parse": "^1.4.2", + "color-space": "^2.0.0" + } + }, + "node_modules/regl-splom": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", + "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "license": "MIT", + "dependencies": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "color-alpha": "^1.0.4", + "flatten-vertex-data": "^1.0.2", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "raf": "^3.4.1", + "regl-scatter2d": "^3.2.3" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", + "engines": { + "node": "*" + } + }, + "node_modules/static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "license": "MIT", + "dependencies": { + "escodegen": "^2.1.0" + } + }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "license": "MIT", + "dependencies": { + "debug": "2" + } + }, + "node_modules/stream-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stream-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "license": "CC0-1.0" + }, + "node_modules/string-split-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", + "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "license": "MIT", + "dependencies": { + "parenthesis": "^3.1.5" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strongly-connected-components": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", + "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==", + "license": "MIT" + }, + "node_modules/style-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "license": "MIT", + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.27.0" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supercluster": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", + "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", + "license": "ISC", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/supercluster/node_modules/kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", + "license": "ISC" + }, + "node_modules/superscript-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", + "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "license": "ISC" + }, + "node_modules/svg-path-bounds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", + "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "license": "MIT", + "dependencies": { + "abs-svg-path": "^0.1.1", + "is-svg-path": "^1.0.1", + "normalize-svg-path": "^1.0.0", + "parse-svg-path": "^0.1.2" + } + }, + "node_modules/svg-path-bounds/node_modules/normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "license": "MIT", + "dependencies": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + }, + "node_modules/svg-path-sdf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", + "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "license": "MIT", + "dependencies": { + "bitmap-sdf": "^1.0.0", + "draw-svg-path": "^1.0.0", + "is-svg-path": "^1.0.1", + "parse-svg-path": "^0.1.2", + "svg-path-bounds": "^1.0.1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "license": "ISC" + }, + "node_modules/to-float32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==", + "license": "MIT" + }, + "node_modules/to-px": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", + "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==", + "license": "MIT", + "dependencies": { + "parse-unit": "^1.0.1" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typedarray-pool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", + "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "license": "MIT", + "dependencies": { + "bit-twiddle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", + "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==", + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/victory-vendor/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/vite": { + "version": "5.4.17", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.17.tgz", + "integrity": "sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-map": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", + "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==", + "license": "Apache-2.0" + }, + "node_modules/webgl-context": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", + "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==", + "license": "MIT", + "dependencies": { + "get-canvas-context": "^1.0.1" + } + }, + "node_modules/webpack": { + "version": "5.99.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.4.tgz", + "integrity": "sha512-TkHfuepzYbQ02GMRzZABrkguDyG6p5gaw4qxFb/cuE+XjN21lecJsNATdphBMXawFxIZxUvDHJfrs8BEfyZFzg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e0f73a1 --- /dev/null +++ b/package.json @@ -0,0 +1,46 @@ +{ + "name": "ayposweb", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.15.3", + "@mui/lab": "^5.0.0-alpha.165", + "@mui/material": "^5.15.3", + "@mui/x-tree-view": "^7.26.0", + "@types/plotly.js": "^2.35.2", + "axios": "^1.8.4", + "chart.js": "^4.4.1", + "date-fns": "^3.0.6", + "plotly.js": "^3.0.1", + "plotly.js-dist": "^3.0.1", + "plotly.js-dist-min": "^3.0.1", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "react-google-charts": "^5.2.1", + "react-plotly.js": "^2.6.0", + "react-router-dom": "^6.21.1", + "recharts": "^2.15.1" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..70b6b12 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,32 @@ +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import { ThemeProvider, CssBaseline } from '@mui/material'; +import { theme } from './theme'; +import MainLayout from './components/Layout/MainLayout'; +import Home from './pages/Home'; +import Temperature from './pages/Temperature'; +import Maintenance from './pages/Maintenance'; +import Migration from './pages/Migration'; +import MonitoringSystem from './pages/MonitoringSystem'; +import StressTesting from './pages/StressTesting'; + +function App() { + return ( + + + + + + } /> + } /> + } /> + } /> + } /> + } /> + + + + + ); +} + +export default App; diff --git a/src/assets/bgreen-logo.png b/src/assets/bgreen-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c56fecb3bf3e752e998ef29b4f0e60692b1b7b GIT binary patch literal 82379 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 O9tjay;VMD>fd2!)A26i= literal 0 HcmV?d00001 diff --git a/src/assets/blc-logo.png b/src/assets/blc-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2f58f5f00837675bb31085b3f17c4b4afc80df9a GIT binary patch literal 43417 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 + + + + + + + + + + + + + + diff --git a/src/components/DebugConsole.tsx b/src/components/DebugConsole.tsx new file mode 100644 index 0000000..538d5c8 --- /dev/null +++ b/src/components/DebugConsole.tsx @@ -0,0 +1,110 @@ +import React from 'react'; +import { + Box, + Paper, + Typography, + IconButton, + Button, + Collapse, + Divider, + styled, +} from '@mui/material'; +import BugReportIcon from '@mui/icons-material/BugReport'; +import CodeIcon from '@mui/icons-material/Code'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; + +const DebugPanel = styled(Paper)(({ theme }) => ({ + position: 'fixed', + bottom: 0, + right: 20, + width: 400, + maxHeight: '60vh', + borderRadius: theme.spacing(2, 2, 0, 0), + padding: theme.spacing(2), + zIndex: 1000, + backgroundColor: theme.palette.background.paper, + boxShadow: theme.shadows[10], + overflow: 'hidden', + display: 'flex', + flexDirection: 'column', +})); + +const ConfigDisplay = styled(Box)(({ theme }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? '#1e1e1e' : '#f5f5f5', + padding: theme.spacing(1.5), + borderRadius: theme.spacing(1), + fontFamily: 'monospace', + fontSize: '0.875rem', + overflowX: 'auto', + overflowY: 'auto', + maxHeight: '50vh', + '& pre': { + margin: 0, + }, +})); + +interface DebugConsoleProps { + configData: any | null; +} + +const DebugConsole: React.FC = ({ configData }) => { + const [showDebugPanel, setShowDebugPanel] = React.useState(false); + + const toggleDebugPanel = () => { + setShowDebugPanel(prev => !prev); + }; + + return ( + <> + {/* Debug Panel Toggle Button */} + + + {/* Debug Panel */} + + + + + + Last Monitoring Configuration + + + + + + + + {configData ? ( + +
{JSON.stringify(configData, null, 2)}
+
+ ) : ( + + No configuration has been sent yet. Start monitoring to see the data structure. + + )} + + + + Tip: You can also view this information in the browser console by pressing F12. + + +
+
+ + ); +}; + +export default DebugConsole; \ No newline at end of file diff --git a/src/components/Layout/MainLayout.tsx b/src/components/Layout/MainLayout.tsx new file mode 100644 index 0000000..c84ce4f --- /dev/null +++ b/src/components/Layout/MainLayout.tsx @@ -0,0 +1,63 @@ +import React, { useState } from 'react'; +import { Box, IconButton, useTheme, useMediaQuery } from '@mui/material'; +import MenuIcon from '@mui/icons-material/Menu'; +import Sidebar from './Sidebar'; + +const MainLayout = ({ children }: { children: React.ReactNode }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('md')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + const toggleSidebar = () => { + setSidebarOpen(!sidebarOpen); + }; + + return ( + + + + + {isMobile && ( + + + + )} + + + {children} + + + + ); +}; + +export default MainLayout; diff --git a/src/components/Layout/Sidebar.tsx b/src/components/Layout/Sidebar.tsx new file mode 100644 index 0000000..d589995 --- /dev/null +++ b/src/components/Layout/Sidebar.tsx @@ -0,0 +1,200 @@ +import { + Box, + List, + ListItem, + ListItemButton, + ListItemText, + styled, + Typography, + ListItemIcon, + Drawer, + useTheme, + IconButton +} from '@mui/material'; +import { useLocation, useNavigate } from 'react-router-dom'; +import HomeIcon from '@mui/icons-material/Home'; +import ThermostatIcon from '@mui/icons-material/Thermostat'; +import BuildIcon from '@mui/icons-material/Build'; +import SwapHorizIcon from '@mui/icons-material/SwapHoriz'; +import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; +import SpeedIcon from '@mui/icons-material/Speed'; +import bgreenLogo from '../../assets/bgreen-logo.png'; + +const DRAWER_WIDTH = 240; + +const LogoContainer = styled(Box)(() => ({ + padding: '20px', + borderBottom: '1px solid rgba(255,255,255,0.1)', + background: 'linear-gradient(180deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%)', + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', +})); + +const StyledListItemButton = styled(ListItemButton)(() => ({ + margin: '4px 8px', + borderRadius: 4, + '&.Mui-selected': { + backgroundColor: 'rgba(255,255,255,0.1)', + '&:hover': { + backgroundColor: 'rgba(255,255,255,0.15)', + }, + '& .MuiListItemIcon-root': { + color: '#ffffff', + }, + '& .MuiListItemText-primary': { + color: '#ffffff', + fontWeight: 500, + }, + }, + '&:hover': { + backgroundColor: 'rgba(255,255,255,0.05)', + }, +})); + +const menuItems = [ + { text: 'Home', path: '/', icon: }, + { text: 'Environmental Temperature', path: '/temperature', icon: }, + { text: 'Preventive Maintenance', path: '/maintenance', icon: }, + { text: 'Migration Advice', path: '/migration', icon: }, + { text: 'Stress Testing', path: '/stress-testing', icon: }, +]; + +interface SidebarProps { + open: boolean; + onToggle: () => void; + isMobile: boolean; +} + +const Sidebar = ({ open, onToggle, isMobile }: SidebarProps) => { + const theme = useTheme(); + const navigate = useNavigate(); + const location = useLocation(); + + const handleNavigation = (path: string) => { + navigate(path); + if (isMobile) { + onToggle(); + } + }; + + const drawerContent = ( + <> + + + B'GREEN Logo + + + B'GREEN + + + Monitor System + + + + {isMobile && ( + + + + )} + + + + {menuItems.map((item) => ( + + handleNavigation(item.path)} + > + + {item.icon} + + + + + ))} + + + + + 2024 B'GREEN + + + + ); + + return ( + + + {drawerContent} + + + ); +}; + +export default Sidebar; diff --git a/src/components/Migration/MigrationAdviceCard.tsx b/src/components/Migration/MigrationAdviceCard.tsx new file mode 100644 index 0000000..a3460cd --- /dev/null +++ b/src/components/Migration/MigrationAdviceCard.tsx @@ -0,0 +1,247 @@ +import React from 'react'; +import { + Paper, + Typography, + IconButton, + Box, + Grid, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Chip, + CircularProgress, + useTheme, +} from '@mui/material'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; +import { GainBeforeData, MigrationAdviceData } from './types'; + +interface MigrationAdviceCardProps { + isCardExpanded: boolean; + setIsCardExpanded: (expanded: boolean) => void; + gainBeforeData: GainBeforeData | null; + migrationAdviceData: MigrationAdviceData | null; + isLoadingGainData: boolean; + onRefresh: (e: React.MouseEvent) => void; + migrationMode: 'auto' | 'semiauto'; +} + +const MigrationAdviceCard: React.FC = ({ + isCardExpanded, + setIsCardExpanded, + gainBeforeData, + migrationAdviceData, + isLoadingGainData, + onRefresh, + migrationMode, +}) => { + const theme = useTheme(); + + return ( + + setIsCardExpanded(!isCardExpanded)} + sx={{ + height: isCardExpanded ? 'auto' : '320px', + bgcolor: 'background.paper', + boxShadow: 3, + display: 'flex', + flexDirection: 'column', + cursor: 'pointer', + transition: 'all 0.3s ease-in-out', + '&:hover': { + boxShadow: 6, + }, + position: isCardExpanded ? 'absolute' : 'relative', + right: isCardExpanded ? 0 : 'auto', + zIndex: isCardExpanded ? 1000 : 1, + width: isCardExpanded ? '100%' : 'auto', + maxHeight: isCardExpanded ? '80vh' : '320px', + overflowY: isCardExpanded ? 'auto' : 'hidden' + }} + > + + + + Migration Advice + } + label={`${migrationMode === 'auto' ? 'Auto' : 'Semi-Auto'} Mode`} + size="small" + sx={{ + bgcolor: migrationMode === 'auto' ? theme.palette.success.light : theme.palette.warning.light, + color: migrationMode === 'auto' ? theme.palette.success.dark : theme.palette.warning.dark, + fontWeight: 500, + fontSize: '0.7rem', + height: '24px', + }} + /> + + + {isLoadingGainData && } + + + + + + {/* Power Gain Information */} + {gainBeforeData && ( + + + + + Current Power + + + {gainBeforeData.cur_power.toFixed(2)} W + + + + + Proposed Power + + + {gainBeforeData.prop_power.toFixed(2)} W + + + + + Expected Gain + + 0 ? '#4caf50' : '#f44336' + }} + > + {(gainBeforeData.prop_gain * 100).toFixed(2)}% + + + + + )} + + {/* Migration Advice Table */} + {migrationAdviceData && ( + + + + + Virtual Machine + Current PM + + Proposed PM + + + + {Object.entries(migrationAdviceData).map(([vm, data]) => ( + + + + + + + + + → + + + + + + ))} + +
+
+ )} + + {!gainBeforeData && !migrationAdviceData && !isLoadingGainData && ( + + No migration advice available at this time + + )} +
+
+ + + + + + + +
+
+ ); +}; + +export default MigrationAdviceCard; \ No newline at end of file diff --git a/src/components/Migration/ResourceDistributionChart.tsx b/src/components/Migration/ResourceDistributionChart.tsx new file mode 100644 index 0000000..e6f0e5f --- /dev/null +++ b/src/components/Migration/ResourceDistributionChart.tsx @@ -0,0 +1,228 @@ +import React from 'react'; +import { Paper, Typography, IconButton, Box, Grid } from '@mui/material'; +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + BarElement, + PointElement, + LineElement, + Title, + Tooltip, + Legend, +} from 'chart.js'; +import { Chart } from 'react-chartjs-2'; +import RefreshIcon from '@mui/icons-material/Refresh'; + +ChartJS.register( + CategoryScale, + LinearScale, + BarElement, + PointElement, + LineElement, + Title, + Tooltip, + Legend +); + +interface VM { + name: string; + power: number; +} + +interface VMPlacementData { + data_center: string; + id: number; + physical_machines: Array<{ + name: string; + power_consumption: number; + vms: { + active: VM[]; + inactive: VM[]; + }; + }>; +} + +interface ResourceDistributionChartProps { + vmPlacementData: VMPlacementData | null; + isLoading: boolean; + onRefresh: () => Promise; +} + +const ResourceDistributionChart: React.FC = ({ + vmPlacementData, + isLoading, + onRefresh +}) => { + const chartData = React.useMemo(() => { + if (!vmPlacementData?.physical_machines) { + return { + labels: [], + datasets: [] + }; + } + + const physicalMachines = vmPlacementData.physical_machines; + const labels = physicalMachines.map(pm => pm.name); + const activeVMs = physicalMachines.map(pm => pm.vms.active.length); + const inactiveVMs = physicalMachines.map(pm => pm.vms.inactive.length); + const totalPower = physicalMachines.map(pm => pm.power_consumption); + const vmPower = physicalMachines.map(pm => + pm.vms.active.reduce((sum, vm) => sum + vm.power, 0) + ); + + return { + labels, + datasets: [ + { + type: 'bar' as const, + label: 'Active VMs', + data: activeVMs, + backgroundColor: '#4caf50', + yAxisID: 'vmAxis', + stack: 'vms', + }, + { + type: 'bar' as const, + label: 'Inactive VMs', + data: inactiveVMs, + backgroundColor: '#ff9800', + yAxisID: 'vmAxis', + stack: 'vms', + }, + { + type: 'line' as const, + label: 'Total Power (W)', + data: totalPower, + borderColor: '#f44336', + backgroundColor: 'transparent', + yAxisID: 'powerAxis', + tension: 0.4, + borderWidth: 2, + }, + { + type: 'line' as const, + label: 'VM Power (W)', + data: vmPower, + borderColor: '#2196f3', + backgroundColor: 'transparent', + yAxisID: 'powerAxis', + borderDash: [5, 5], + tension: 0.4, + borderWidth: 2, + } + ] + }; + }, [vmPlacementData]); + + const options = { + responsive: true, + maintainAspectRatio: false, + interaction: { + mode: 'index' as const, + intersect: false, + }, + plugins: { + legend: { + position: 'top' as const, + labels: { + usePointStyle: true, + }, + }, + tooltip: { + callbacks: { + label: (context: any) => { + const label = context.dataset.label || ''; + const value = context.parsed.y; + if (label.includes('Power')) { + return `${label}: ${value.toFixed(2)} W`; + } + return `${label}: ${value}`; + }, + }, + }, + }, + scales: { + x: { + grid: { + display: false, + }, + }, + vmAxis: { + type: 'linear' as const, + position: 'left' as const, + title: { + display: true, + text: 'Number of VMs', + }, + beginAtZero: true, + ticks: { + stepSize: 1, + }, + stacked: true, + }, + powerAxis: { + type: 'linear' as const, + position: 'right' as const, + title: { + display: true, + text: 'Power (W)', + }, + beginAtZero: true, + grid: { + drawOnChartArea: false, + }, + }, + }, + }; + + return ( + + + + Resource Distribution by Node + + + + + + + + {isLoading && ( + + Loading... + + )} + + + ); +}; + +export default ResourceDistributionChart; \ No newline at end of file diff --git a/src/components/Migration/SummaryStats.tsx b/src/components/Migration/SummaryStats.tsx new file mode 100644 index 0000000..abab3b0 --- /dev/null +++ b/src/components/Migration/SummaryStats.tsx @@ -0,0 +1,138 @@ +import React, { useState, useEffect } from 'react'; +import { Grid, Paper, Typography, Box, Divider } from '@mui/material'; +import StorageIcon from '@mui/icons-material/Storage'; +import ComputerIcon from '@mui/icons-material/Computer'; + +interface VM { + name: string; + power: number; +} + +interface VMPlacementData { + data_center: string; + id: number; + physical_machines: Array<{ + name: string; + power_consumption: number; + vms: { + active: VM[]; + inactive: VM[]; + }; + }>; +} + +const ENDPOINT = 'http://141.196.83.136:8003/prom/get_chart_data/vm_placement'; +const REFRESH_INTERVAL = 30000; // 30 seconds + +const SummaryStats: React.FC = () => { + const [data, setData] = useState(null); + + const fetchData = async () => { + try { + const response = await fetch(ENDPOINT); + if (!response.ok) { + throw new Error(`Failed to fetch data: ${response.status}`); + } + const jsonData = await response.json(); + setData(jsonData); + } catch (err) { + console.error('Error fetching VM placement data:', err); + } + }; + + useEffect(() => { + fetchData(); + const interval = setInterval(fetchData, REFRESH_INTERVAL); + return () => clearInterval(interval); + }, []); + + const stats = React.useMemo(() => { + if (!data?.physical_machines) { + return { + activeComputes: 0, + totalComputes: 0, + activeVMs: 0, + inactiveVMs: 0, + }; + } + + const activeComputes = data.physical_machines.filter( + pm => pm.power_consumption > 0 || pm.vms.active.length > 0 + ).length; + + const totalActiveVMs = data.physical_machines.reduce( + (sum, pm) => sum + pm.vms.active.length, + 0 + ); + + const totalInactiveVMs = data.physical_machines.reduce( + (sum, pm) => sum + pm.vms.inactive.length, + 0 + ); + + return { + activeComputes, + totalComputes: data.physical_machines.length, + activeVMs: totalActiveVMs, + inactiveVMs: totalInactiveVMs, + }; + }, [data]); + + return ( + + + + + + + Compute Nodes + + + {stats.activeComputes}/{stats.totalComputes} + + + + + + + + + + + Virtual Machines + + + + {stats.activeVMs} + + + active + + + / + + + {stats.activeVMs + stats.inactiveVMs} + + + total + + + + + + + ); +}; + +export default SummaryStats; \ No newline at end of file diff --git a/src/components/Migration/VerifiedMigration.tsx b/src/components/Migration/VerifiedMigration.tsx new file mode 100644 index 0000000..5d59bf3 --- /dev/null +++ b/src/components/Migration/VerifiedMigration.tsx @@ -0,0 +1,163 @@ +import React from 'react'; +import { + Paper, + Typography, + Box, + Grid, + Chip, + CircularProgress, + useTheme, +} from '@mui/material'; + +interface VerifiedMigrationProps { + gainAfterData: { + past_power: number; + cur_power: number; + prop_power: number; + actual_ratio: number; + val_ratio: number; + } | null; + isLoading: boolean; +} + +const VerifiedMigration: React.FC = ({ + gainAfterData, + isLoading, +}) => { + const theme = useTheme(); + + if (isLoading) { + return ( + + + + ); + } + + if (!gainAfterData) { + return ( + + No verification data available + + ); + } + + const isValidated = gainAfterData.val_ratio >= 0.95; + + return ( + + Migration Verification Results + + {/* Power Optimization Results */} + + + + + + Current Power + + + {gainAfterData.cur_power.toFixed(2)} W + + + + + + + Accuracy of migration proposal + + + {(gainAfterData.val_ratio * 100).toFixed(2)}% + + + + + + + Actual Power Change + + 0 ? '#4caf50' : '#ff9800' + }}> + {(gainAfterData.actual_ratio * 100).toFixed(2)}% + + + + + + + {/* Summary Footer */} + + + + Previous Power Consumption + + + {gainAfterData.past_power.toFixed(2)} W + + + + + + + + ); +}; + +export default VerifiedMigration; \ No newline at end of file diff --git a/src/components/Migration/hooks.ts b/src/components/Migration/hooks.ts new file mode 100644 index 0000000..cd29966 --- /dev/null +++ b/src/components/Migration/hooks.ts @@ -0,0 +1,161 @@ +import { useState, useEffect } from 'react'; +import { VMDetails, GainBeforeData, MigrationAdviceData } from './types'; + +const API_BASE_URL = 'http://141.196.83.136:8003'; +const REFRESH_INTERVAL = 30000; // 30 seconds + +interface GainAfterData { + past_power: number; + cur_power: number; + prop_power: number; + prop_ratio: number; + actual_ratio: number; + val_ratio: number; + val_difference: number; +} + +export const useMigrationData = () => { + const [gainBeforeData, setGainBeforeData] = useState(null); + const [migrationAdviceData, setMigrationAdviceData] = useState(null); + const [isLoadingGainData, setIsLoadingGainData] = useState(false); + + const fetchMigrationData = async () => { + try { + setIsLoadingGainData(true); + + const [gainResponse, migrationResponse] = await Promise.all([ + fetch(`${API_BASE_URL}/prom/get_chart_data/gain_before`), + fetch(`${API_BASE_URL}/prom/get_chart_data/migration`) + ]); + + if (!gainResponse.ok || !migrationResponse.ok) { + throw new Error('Failed to fetch migration data'); + } + + const [gainData, migrationData] = await Promise.all([ + gainResponse.json(), + migrationResponse.json() + ]); + + setGainBeforeData(gainData); + setMigrationAdviceData(migrationData); + } catch (error) { + console.error('Error fetching migration data:', error); + } finally { + setIsLoadingGainData(false); + } + }; + + useEffect(() => { + fetchMigrationData(); + const interval = setInterval(fetchMigrationData, REFRESH_INTERVAL); + return () => clearInterval(interval); + }, []); + + return { gainBeforeData, migrationAdviceData, isLoadingGainData, fetchMigrationData }; +}; + +export const useMonitoringData = () => { + const [monitoringData, setMonitoringData] = useState([]); + const [loading, setLoading] = useState(true); + const [stableHosts, setStableHosts] = useState([]); + const [computeCount, setComputeCount] = useState(0); + const [vmCount, setVmCount] = useState(0); + + const fetchMonitoringData = async () => { + try { + setLoading(true); + const response = await fetch(`${API_BASE_URL}/prom/monitoring`); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const result = await response.json(); + + if (result?.data) { + setMonitoringData(result.data); + const filteredData = result.data.filter((pm: any) => pm.virtual_machines?.length > 0); + setComputeCount(filteredData.length); + setVmCount(filteredData.reduce((acc: number, pm: any) => acc + pm.virtual_machines.length, 0)); + + const newHosts = result.data.map((pm: any) => pm.host); + setStableHosts(prevHosts => { + const allHosts = Array.from(new Set([...prevHosts, ...newHosts])); + return allHosts.filter(host => newHosts.includes(host)); + }); + } + } catch (error) { + console.error('Error fetching monitoring data:', error); + setMonitoringData([]); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchMonitoringData(); + const interval = setInterval(fetchMonitoringData, REFRESH_INTERVAL); + return () => clearInterval(interval); + }, []); + + return { monitoringData, loading, stableHosts, computeCount, vmCount }; +}; + +export const useVMDetails = () => { + const [vmDetails, setVmDetails] = useState>({}); + const [expandedVMs, setExpandedVMs] = useState>({}); + + const toggleVMDetails = (vmId: string) => { + setExpandedVMs(prev => ({ + ...prev, + [vmId]: !prev[vmId] + })); + }; + + useEffect(() => { + const fetchVMDetails = async () => { + try { + const response = await fetch(`${API_BASE_URL}/prom/vm_mac_details`); + if (!response.ok) { + throw new Error('Failed to fetch VM details'); + } + const data = await response.json(); + if (data?.res) { + setVmDetails(data.res); + } + } catch (error) { + console.error('Error fetching VM details:', error); + } + }; + + fetchVMDetails(); + const interval = setInterval(fetchVMDetails, REFRESH_INTERVAL); + return () => clearInterval(interval); + }, []); + + return { vmDetails, expandedVMs, toggleVMDetails }; +}; + +export const useGainAfterData = () => { + const [gainAfterData, setGainAfterData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + const fetchGainAfterData = async () => { + try { + setIsLoading(true); + const response = await fetch(`${API_BASE_URL}/prom/get_chart_data/gain_after`); + + if (!response.ok) { + throw new Error('Failed to fetch gain-after data'); + } + + const data = await response.json(); + setGainAfterData(data); + } catch (error) { + console.error('Error fetching gain-after data:', error); + } finally { + setIsLoading(false); + } + }; + + return { gainAfterData, isLoading, fetchGainAfterData }; +}; \ No newline at end of file diff --git a/src/components/Migration/types.ts b/src/components/Migration/types.ts new file mode 100644 index 0000000..02f1d16 --- /dev/null +++ b/src/components/Migration/types.ts @@ -0,0 +1,34 @@ +export interface VMDetails { + disk: number; + ephemeral: number; + extra_specs: Record; + host: string; + ip: string; + name: string; + original_name: string; + ram: number; + swap: number; + vcpus: number; +} + +export interface GainBeforeData { + prop_gain: number; + prop_power: number; + cur_power: number; +} + +export interface MigrationAdviceData { + [key: string]: { + current_pm: string; + proposed_pm: string; + }; +} + +export interface ChartData { + labels: string[]; + datasets: { + label: string; + data: number[]; + backgroundColor: string; + }[]; +} \ No newline at end of file diff --git a/src/components/styled/Logo.tsx b/src/components/styled/Logo.tsx new file mode 100644 index 0000000..975ad1b --- /dev/null +++ b/src/components/styled/Logo.tsx @@ -0,0 +1,10 @@ +import styled from '@mui/material/styles/styled'; + +export const Logo = styled('img')({ + height: '40px', + width: 'auto', + objectFit: 'contain' +}); + +// Then use it like: +// \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..e63eef4 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,9 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/pages/.gitignore b/src/pages/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/src/pages/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx new file mode 100644 index 0000000..2139784 --- /dev/null +++ b/src/pages/Home.tsx @@ -0,0 +1,1305 @@ +import { useState, useEffect, useCallback } from 'react'; +import { + Box, + Paper, + Typography, + FormControl, + InputLabel, + Select, + MenuItem, + Button, + Grid, + useTheme, + styled, + SelectChangeEvent, + Slider, + TextField, + Snackbar, + Alert, + Chip, + CircularProgress, + Tooltip, + ToggleButton, + ToggleButtonGroup, + Dialog, + DialogTitle, + DialogContent, + DialogActions, +} from '@mui/material'; +import ThermostatIcon from '@mui/icons-material/Thermostat'; +import BuildIcon from '@mui/icons-material/Build'; +import SwapHorizIcon from '@mui/icons-material/SwapHoriz'; +import TimelineIcon from '@mui/icons-material/Timeline'; +import ModelTrainingIcon from '@mui/icons-material/ModelTraining'; +import SpeedIcon from '@mui/icons-material/Speed'; +import StopIcon from '@mui/icons-material/Stop'; +import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import BalanceIcon from '@mui/icons-material/Balance'; +import BoltIcon from '@mui/icons-material/Bolt'; +import GridViewIcon from '@mui/icons-material/GridView'; +import CheckCircleIcon from '@mui/icons-material/CheckCircle'; +import ErrorIcon from '@mui/icons-material/Error'; +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; +import HandymanIcon from '@mui/icons-material/Handyman'; +import EditIcon from '@mui/icons-material/Edit'; +import { monitoringService, MonitoringStatus } from '../services/monitoringService'; +import DebugConsole from '../components/DebugConsole'; +import MonitoringSystem from './MonitoringSystem'; + +const StyledCard = styled(Paper)(({ theme }) => ({ + borderRadius: theme.spacing(2), + padding: theme.spacing(3), + height: '100%', + display: 'flex', + flexDirection: 'column', + backgroundColor: theme.palette.background.paper, + transition: 'transform 0.2s, box-shadow 0.2s', + '&:hover': { + transform: 'translateY(-4px)', + boxShadow: theme.shadows[8], + }, +})); + +const StyledSelect = styled(Select)(({ theme }) => ({ + '& .MuiOutlinedInput-notchedOutline': { + borderRadius: theme.spacing(1.5), + }, + '&:hover .MuiOutlinedInput-notchedOutline': { + borderColor: theme.palette.primary.main, + }, +})); + +const SectionTitle = styled(Typography)(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: theme.spacing(1), + marginBottom: theme.spacing(3), + color: theme.palette.text.primary, + fontWeight: 600, +})); + +const IconWrapper = styled(Box)(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: theme.spacing(0.5), + color: theme.palette.text.secondary, + marginBottom: theme.spacing(1), +})); + +const WeightSlider = styled(Slider)(({ theme }) => ({ + '& .MuiSlider-thumb': { + height: 24, + width: 24, + backgroundColor: '#fff', + border: '2px solid currentColor', + '&:focus, &:hover, &.Mui-active, &.Mui-focusVisible': { + boxShadow: 'inherit', + }, + }, + '& .MuiSlider-track': { + height: 4, + }, + '& .MuiSlider-rail': { + height: 4, + opacity: 0.5, + backgroundColor: theme.palette.mode === 'dark' ? '#bfbfbf' : '#d8d8d8', + }, + '& .MuiSlider-mark': { + backgroundColor: theme.palette.primary.main, + height: 12, + width: 2, + '&.MuiSlider-markActive': { + backgroundColor: theme.palette.primary.main, + }, + }, + '& .MuiSlider-markLabel': { + fontSize: '0.75rem', + color: theme.palette.text.secondary, + }, +})); + +const WeightInput = styled(TextField)(() => ({ + width: 70, + '& input': { + padding: '8px', + textAlign: 'center', + }, +})); + +const StatusChip = styled(Chip)(({ theme }) => ({ + borderRadius: theme.spacing(1), + fontWeight: 500, + '&.running': { + backgroundColor: theme.palette.success.light, + color: theme.palette.success.dark, + }, + '&.stopped': { + backgroundColor: theme.palette.error.light, + color: theme.palette.error.dark, + }, +})); + +interface Weights { + energy: number; + balance: number; + overload: number; + allocation: number; +} + +interface AlertState { + open: boolean; + message: string; + severity: 'success' | 'error' | 'info' | 'warning'; +} + +const StatusCard = styled(Box)(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: theme.spacing(1), + padding: theme.spacing(2), + borderRadius: theme.shape.borderRadius * 2, + backgroundColor: theme.palette.background.paper, + boxShadow: theme.shadows[1], + minWidth: 280, + position: 'relative', + overflow: 'hidden', +})); + +const StatusIndicator = styled('div')(({ theme }) => ({ + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + height: 3, + backgroundColor: 'transparent', + '&.loading': { + background: `linear-gradient(90deg, + ${theme.palette.primary.main}, + ${theme.palette.primary.light}, + ${theme.palette.primary.main})`, + backgroundSize: '200% 100%', + animation: '$shimmer 2s infinite', + }, + '&.success': { + backgroundColor: theme.palette.success.main, + }, + '&.error': { + backgroundColor: theme.palette.error.main, + }, + '&.partial': { + backgroundColor: theme.palette.warning.main, + }, +})); + +// Add keyframes for the loading animation +const shimmerKeyframes = ` + @keyframes shimmer { + 0% { background-position: 100% 0; } + 100% { background-position: 0 0; } + } +`; + +// Insert the keyframes +const styleElement = document.createElement('style'); +styleElement.type = 'text/css'; +styleElement.innerHTML = shimmerKeyframes; +document.head.appendChild(styleElement); + +const Home = () => { + const theme = useTheme(); + + // Initialize all states from localStorage if available + const savedState = localStorage.getItem('optimizationState'); + const parsedState = savedState ? JSON.parse(savedState) : null; + + const [hasSelectedOptimization, setHasSelectedOptimization] = useState(!!parsedState); + const [showOptimizationDialog, setShowOptimizationDialog] = useState(false); + + // Initialize state from localStorage if available + const [blockList, setBlockList] = useState(parsedState?.unselectedVMs || []); + // @ts-ignore - Will be used in future implementation + const [selectedVMs, setSelectedVMs] = useState(parsedState?.selectedVMs || []); + const [optimizationState, setOptimizationState] = useState<{ + selectedVMs: string[]; + unselectedVMs: string[]; + }>(parsedState || { + selectedVMs: [], + unselectedVMs: [] + }); + + // Environmental Temperature Section + const [envTimeUnit, setEnvTimeUnit] = useState('1'); + const [envSteps, setEnvSteps] = useState('3'); + const [envModelType, setEnvModelType] = useState('lstm'); + + // Preventive Maintenance Section + const [prevTimeUnit, setPrevTimeUnit] = useState('1'); + const [prevSteps, setPrevSteps] = useState('3'); + const [prevModelType, setPrevModelType] = useState('lstm'); + + // Migration Section + const [migrationTime, setMigrationTime] = useState('5'); + const [migrationModel, setMigrationModel] = useState('mul_reg'); + const [migrationMethod, setMigrationMethod] = useState('mathematical'); + const [migrationMode, setMigrationMode] = useState<'auto' | 'semiauto'>('auto'); + + const [isMonitoring, setIsMonitoring] = useState(false); + + // Weight Configuration Section + const [weights, setWeights] = useState({ + energy: 25, + balance: 25, + overload: 25, + allocation: 25 + }); + const [isValid, setIsValid] = useState(true); + const [weightError, setWeightError] = useState(false); + + const [isLoading, setIsLoading] = useState(false); + const [alert, setAlert] = useState({ + open: false, + message: '', + severity: 'info', + }); + + const [monitoringStatus, setMonitoringStatus] = useState(null); + const [isStatusLoading, setIsStatusLoading] = useState(false); + + // Add state for the last configuration sent (for debug console) + const [lastConfigSent, setLastConfigSent] = useState(null); + + // Updated options to match endpoint expectations but keeping original time options + const timeOptions = ['1', '5']; + const stepOptions = ['3', ...Array.from({ length: 47 }, (_, i) => (i + 4).toString())]; + const modelTypes = ['lstm']; + const migrationModelTypes = { + direct: ['ssl'], + indirect: ['xgboost', 'mul_reg'] + }; + const migrationMethodTypes = ['mathematical', 'AI']; + + // Inside the Home component, add new state + const [estimationMethod, setEstimationMethod] = useState<'direct' | 'indirect'>('indirect'); + + // Memoized validation function + const validateWeightSum = useCallback(() => { + const sum = Object.values(weights).reduce((a, b) => a + Number(b), 0); + return Math.abs(sum - 100) < 0.001; // Using small epsilon for floating point comparison + }, [weights]); + + // Real-time validation effect + useEffect(() => { + const isValidSum = validateWeightSum(); + setIsValid(isValidSum); + setWeightError(!isValidSum); + }, [weights, validateWeightSum]); + + const handleManualWeightChange = (type: keyof Weights) => ( + event: React.ChangeEvent + ) => { + const newValue = event.target.value === '' ? 0 : parseInt(event.target.value); + if (isNaN(newValue)) return; + + setWeights(prev => ({ + ...prev, + [type]: Math.min(100, Math.max(0, Math.round(newValue))) + })); + }; + + const handleSliderChange = (type: keyof Weights) => (_: Event, newValue: number | number[]) => { + const value = Math.round(newValue as number); + + const newWeights = { ...weights }; + newWeights[type] = value; + + const remainingTypes = Object.keys(weights).filter(k => k !== type) as Array; + const totalOthers = remainingTypes.reduce((sum, key) => sum + weights[key], 0); + + if (totalOthers > 0) { + const scale = (100 - value) / totalOthers; + remainingTypes.forEach(key => { + newWeights[key] = Math.round(weights[key] * scale); + }); + } else { + // If all others are 0, distribute remaining evenly + const remaining = Math.round((100 - value) / remainingTypes.length); + remainingTypes.forEach(key => { + newWeights[key] = remaining; + }); + } + + setWeights(newWeights); + }; + + const handleCloseAlert = () => { + setAlert(prev => ({ ...prev, open: false })); + }; + + const showAlert = (message: string, severity: AlertState['severity']) => { + setAlert({ + open: true, + message, + severity, + }); + }; + + const handleMigrationModeChange = ( + _: React.MouseEvent, + newMode: 'auto' | 'semiauto' | null, + ) => { + if (newMode !== null) { + setMigrationMode(newMode); + } + }; + + // Helper function to check if any service is running + const isAnyServiceRunning = (status: MonitoringStatus | null): boolean => { + if (!status) return false; + + return ( + status.statuses.migration.is_running || + status.statuses.environmental.is_running || + status.statuses.preventive.is_running + ); + }; + + const handleSelectChange = (event: SelectChangeEvent) => { + const setter = (value: string) => { + if (event.target.name === 'envTimeUnit') setEnvTimeUnit(value); + else if (event.target.name === 'envSteps') setEnvSteps(value); + else if (event.target.name === 'envModelType') setEnvModelType(value); + else if (event.target.name === 'prevTimeUnit') setPrevTimeUnit(value); + else if (event.target.name === 'prevSteps') setPrevSteps(value); + else if (event.target.name === 'prevModelType') setPrevModelType(value); + else if (event.target.name === 'migrationTime') setMigrationTime(value); + else if (event.target.name === 'migrationModel') setMigrationModel(value as string); + else if (event.target.name === 'migrationMethod') setMigrationMethod(value as string); + else if (event.target.name === 'estimationMethod') setEstimationMethod(value as 'direct' | 'indirect'); + }; + setter(event.target.value as string); + }; + + // Start polling when monitoring is active - we'll replace this with a constant polling approach + useEffect(() => { + // This effect is now only responsible for cleanup when component unmounts + return () => { + monitoringService.stopStatusPolling(); + }; + }, []); + + // Always check monitoring status, regardless of the isMonitoring state + useEffect(() => { + const fetchAndUpdateStatus = async () => { + try { + // Only show loading on initial fetch, not during regular status updates + if (!monitoringStatus) { + setIsStatusLoading(true); + } + + // Directly get the status instead of checking if active + const status = await monitoringService.getMonitoringStatus(); + + // Determine if any service is running using our helper function + const anyServiceRunning = isAnyServiceRunning(status); + + // Update the status display + setMonitoringStatus(status); + + // Update isMonitoring state only if it's different from current state + if (anyServiceRunning !== isMonitoring) { + console.log(`Monitoring state changed: ${isMonitoring} -> ${anyServiceRunning}`); + setIsMonitoring(anyServiceRunning); + } + } catch (error) { + console.error('Error fetching monitoring status:', error); + } finally { + setIsStatusLoading(false); + } + }; + + // Execute immediately when component mounts + fetchAndUpdateStatus(); + + // Set up polling every 3 seconds (decreased from 5 to be more responsive) + // This will help detect when monitoring is started from the backend + const pollingInterval = setInterval(fetchAndUpdateStatus, 3000); + + // Clean up on unmount + return () => { + clearInterval(pollingInterval); + }; + }, []); // Empty dependency array means this only runs on mount + + // Add function to force immediate status update + const forceStatusUpdate = async () => { + try { + setIsStatusLoading(true); + const status = await monitoringService.getMonitoringStatus(); + setMonitoringStatus(status); + + const anyServiceRunning = isAnyServiceRunning(status); + if (anyServiceRunning !== isMonitoring) { + setIsMonitoring(anyServiceRunning); + } + + return status; + } catch (error) { + console.error('Error in force status update:', error); + return null; + } finally { + setIsStatusLoading(false); + } + }; + + const renderStatusChip = (isRunning: boolean | undefined) => { + // If status is undefined, return a default "Unknown" chip + if (isRunning === undefined) { + return ( + + ); + } + + return ( + + ); + }; + + // Handler for when optimization selection is saved + const handleOptimizationSaved = (unselectedVMs: string[], selectedVMs: string[]) => { + const newState = { selectedVMs, unselectedVMs }; + setBlockList(unselectedVMs); + setSelectedVMs(selectedVMs); + setOptimizationState(newState); + setHasSelectedOptimization(true); + + // Save to localStorage + localStorage.setItem('optimizationState', JSON.stringify(newState)); + }; + + // Handler to edit optimization selection + const handleEditOptimization = () => { + setShowOptimizationDialog(true); + }; + + return ( + + {!hasSelectedOptimization ? ( + // Show only the MonitoringSystem component initially + + ) : ( + // Show the full Home page content after optimization selection + <> + + {/* Add Edit Optimization button with block list count */} + + + + {/* Environmental Temperature Section */} + + + + + Environmental Temperature + + + + + Time Configuration + + + Script Time Unit + + {timeOptions.map((option) => ( + {option} + ))} + + + + + + Steps Configuration + + + Number of Steps + + {stepOptions.map((option) => ( + {option} + ))} + + + + + + Model Selection + + + Model Type + + {modelTypes.map((option) => ( + {option} + ))} + + + + + + {/* Preventive Maintenance Section */} + + + + + Preventive Maintenance + + + + + Time Configuration + + + Script Time Unit + + {timeOptions.map((option) => ( + {option} + ))} + + + + + + Steps Configuration + + + Number of Steps + + {stepOptions.map((option) => ( + {option} + ))} + + + + + + Model Selection + + + Model Type + + {modelTypes.map((option) => ( + {option} + ))} + + + + + + {/* Migration Advice Section */} + + + + + Migration Advice + + + {/* Vm Energy Estimation */} + + + + + Auto + + + + Semi-Auto + + + + + + + Time Configuration + + + Script Time Unit + + {timeOptions.slice(0).map((option) => ( + {option} + ))} + + + + + + Migration Advice Method + + + Method Type + + {migrationMethodTypes.map((option) => ( + {option} + ))} + + + + + + Vm Energy Estimation + + + Estimation Method + + Direct + Indirect + + + + + Model + + {migrationModelTypes[estimationMethod].map((option) => ( + {option} + ))} + + + + + + {/* Weight Configuration Section */} + + + + + + Weight Of Sustainability Criteria + + + + + {/* Fixed height container for error message */} + {/* Fixed height container */} + {weightError && ( + + + Weights must sum to 100% + + )} + + + {/* Weight sliders container with fixed height */} + {/* Adjust the 90px based on your header height */} + {Object.entries(weights).map(([key, value]) => ( + + + {key === 'energy' && } + {key === 'balance' && } + {key === 'overload' && } + {key === 'allocation' && } + + {key.charAt(0).toUpperCase() + key.slice(1)} + + + + + + + + ))} + + + + + + {/* Start and Stop Monitoring Buttons with Status */} + + + {isAnyServiceRunning(monitoringStatus) ? ( + <> + Monitoring is Active + + ) : ( + <> + Monitoring is Inactive + + )} + + + + {/* Start Monitoring Button */} + + + {/* Stop Monitoring Button */} + + + + {/* Status Display - Always Visible */} + + + Monitoring Status + + + {!monitoringStatus ? ( + <> + + + + ) : ( + <> + {/* Overall status summary */} + + + + + {/* Individual service statuses */} + + + + + + Migration: + + {renderStatusChip(monitoringStatus.statuses?.migration?.is_running)} + + + + + + + + Env: + + {renderStatusChip(monitoringStatus.statuses?.environmental?.is_running)} + + + + + + + + Prev: + + {renderStatusChip(monitoringStatus.statuses?.preventive?.is_running)} + + + + + + {/* Subtle indicator at the bottom of the card */} + + + )} + + + + + {/* Dialog for editing optimization */} + setShowOptimizationDialog(false)} + maxWidth="xl" + fullWidth + > + Edit Optimization Selection + + { + const newState = { selectedVMs, unselectedVMs }; + setBlockList(unselectedVMs); + setSelectedVMs(selectedVMs); + setOptimizationState(newState); + setShowOptimizationDialog(false); + + // Save to localStorage + localStorage.setItem('optimizationState', JSON.stringify(newState)); + }} + isDialog={true} + initialBlockList={optimizationState.unselectedVMs} + initialSelectedVMs={optimizationState.selectedVMs} + /> + + + + + + + + + {alert.message} + + + + {/* COMMENT THIS LINE OUT TO REMOVE DEBUG CONSOLE */} + + + )} + + ); +}; + +export default Home; diff --git a/src/pages/Maintenance.tsx b/src/pages/Maintenance.tsx new file mode 100644 index 0000000..991ec38 --- /dev/null +++ b/src/pages/Maintenance.tsx @@ -0,0 +1,247 @@ +import { useState, useEffect } from 'react'; +import { Box, Paper, Typography, Fade, useTheme, AppBar, Toolbar, Chip } from '@mui/material'; +import Plot from 'react-plotly.js'; +import { Layout, PlotData } from 'plotly.js'; + +interface DataItem { + now_timestamp: string; + future_timestamp: string; + power: string; + power_future_15min: string; + positive_3p: string; + negative_3p: string; + positive_7p: string; + negative_7p: string; + flag: string; +} + +const Maintenance = () => { + const theme = useTheme(); + + const [chartData, setChartData] = useState[]>([]); + const [currentFlag, setCurrentFlag] = useState(''); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await fetch('http://141.196.83.136:8003/prom/get_chart_data/maintenance/20'); + const result = await response.json(); + + if (result.data && result.data.length > 0) { + const last20Data = result.data.slice(-20); + setCurrentFlag(last20Data[last20Data.length - 1].flag); + + const traces: Partial[] = [ + { + x: last20Data.map((item: DataItem) => item.now_timestamp), + y: last20Data.map((item: DataItem) => parseFloat(item.power)), + type: 'scatter' as const, + mode: 'lines+markers' as const, + name: 'Current Power', + line: { color: '#2196f3', width: 2 }, + marker: { size: 6, symbol: 'circle' } + }, + { + x: last20Data.map((item: DataItem) => item.future_timestamp), + y: last20Data.map((item: DataItem) => parseFloat(item.power_future_15min)), + type: 'scatter' as const, + mode: 'lines+markers' as const, + name: 'Predicted (15min)', + line: { color: '#4caf50', width: 2, dash: 'dot' }, + marker: { size: 6, symbol: 'circle' } + }, + { + x: last20Data.map((item: DataItem) => item.future_timestamp), + y: last20Data.map((item: DataItem) => parseFloat(item.positive_3p)), + type: 'scatter' as const, + mode: 'lines' as const, + name: '+3% Positive', + line: { color: '#2ca02c', width: 1.5 }, + showlegend: true, + }, + { + x: last20Data.map((item: DataItem) => item.future_timestamp), + y: last20Data.map((item: DataItem) => parseFloat(item.negative_3p)), + type: 'scatter' as const, + mode: 'lines' as const, + name: '-3% Negative', + line: { color: '#d62728', width: 1.5 }, + showlegend: true, + }, + { + x: last20Data.map((item: DataItem) => item.future_timestamp), + y: last20Data.map((item: DataItem) => parseFloat(item.positive_7p)), + type: 'scatter' as const, + mode: 'lines' as const, + name: '+7% Positive', + line: { color: '#9467bd', width: 1.5 }, + showlegend: true, + }, + { + x: last20Data.map((item: DataItem) => item.future_timestamp), + y: last20Data.map((item: DataItem) => parseFloat(item.negative_7p)), + type: 'scatter' as const, + mode: 'lines' as const, + name: '-7% Negative', + line: { color: '#8c564b', width: 1.5 }, + showlegend: true, + } + ]; + setChartData(traces); + } + } catch (error) { + console.error('Error fetching data:', error); + } + }; + + fetchData(); + const interval = setInterval(fetchData, 5000); + return () => clearInterval(interval); + }, []); + + const layout: Partial = { + xaxis: { + title: { + text: 'Time', + font: { size: 14, color: '#666', family: undefined } + }, + type: 'date', + gridcolor: '#eee', + tickfont: { size: 12, family: undefined, color: '#666' }, + showgrid: true, + gridwidth: 1, + rangeslider: { visible: true } + }, + yaxis: { + title: { + text: 'Power (W)', + font: { size: 14, color: '#666', family: undefined } + }, + gridcolor: '#eee', + tickfont: { size: 12, family: undefined, color: '#666' }, + showgrid: true, + gridwidth: 1, + rangemode: 'tozero' as const, + fixedrange: false, + range: [0, Math.max(...chartData.flatMap(trace => trace.y as number[]).filter(Boolean)) * 1.1] + }, + showlegend: true, + legend: { + orientation: 'h', + y: -0.2, + x: 0.5, + xanchor: 'center', + yanchor: 'top', + font: { + size: 12, + family: theme.typography.fontFamily, + color: theme.palette.text.secondary + }, + bgcolor: 'rgba(255, 255, 255, 0)', + bordercolor: 'rgba(255, 255, 255, 0)' + }, + margin: { t: 60, b: 100, l: 60, r: 20 }, + plot_bgcolor: 'rgba(0,0,0,0)', + paper_bgcolor: 'rgba(0,0,0,0)', + hovermode: 'closest', + modebar: { + bgcolor: 'rgba(255, 255, 255, 0)', + color: theme.palette.text.secondary, + activecolor: theme.palette.primary.main + } + }; + + return ( + + + + + Preventive Maintenance + + {currentFlag && ( + + )} + + + + + + + + + + + + + + ); +}; + +export default Maintenance; diff --git a/src/pages/Migration.tsx b/src/pages/Migration.tsx new file mode 100644 index 0000000..f0475ea --- /dev/null +++ b/src/pages/Migration.tsx @@ -0,0 +1,778 @@ +import { useState, useEffect } from 'react'; +import { + Box, + Paper, + Grid, + Typography, + Button, + useTheme, + Card, + CardContent, + IconButton, + CircularProgress, + Collapse, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + LinearProgress, +} from '@mui/material'; + +import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; +import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import LockIcon from '@mui/icons-material/Lock'; + +import SummaryStats from '../components/Migration/SummaryStats'; +import ResourceDistributionChart from '../components/Migration/ResourceDistributionChart'; +import MigrationAdviceCard from '../components/Migration/MigrationAdviceCard'; +import VerifiedMigration from '../components/Migration/VerifiedMigration'; +import { useMigrationData, useGainAfterData } from '../components/Migration/hooks'; + +// Constants +const API_BASE_URL = 'http://141.196.83.136:8003'; +const REFRESH_INTERVAL = 30000; // 30 seconds + +interface VMPlacementData { + data_center: string; + id: number; + physical_machines: Array<{ + status: 'blocked' | 'open'; + name: string; + power_consumption: number; + vms: { + active: Array<{ + status: 'blocked' | 'open'; + name: string; + power: number; + confg: { + cpu: number; + ram: number; + disk: number; + }; + }>; + inactive: Array<{ + status: 'blocked' | 'open'; + name: string; + power: number; + confg: { + cpu: number; + ram: number; + disk: number; + }; + }>; + }; + }>; +} + +interface VMCardProps { + vm: { + name: string; + power: number; + status: 'blocked' | 'open'; + confg: { + cpu: number; + ram: number; + disk: number; + }; + }; + vmId: string; + isActive: boolean; + expandedVMs: Record; + toggleVMDetails: (vmId: string) => void; + theme: any; +} + +const VMCard = ({ vm, vmId, isActive, expandedVMs, toggleVMDetails, theme }: VMCardProps) => ( + + + + + + {vm.name} + {vm.status === 'blocked' && ( + + )} + + + + + {vm.power.toFixed(2)}W + + { + e.stopPropagation(); + toggleVMDetails(vmId); + }} + > + + + + + + + + + + + Status + + + {vm.status === 'blocked' ? ( + <> + + Blocked + + ) : ( + 'Open' + )} + + + + + CPU Cores + + + {vm.confg.cpu} + + + + + RAM + + + {vm.confg.ram} GB + + + + + Disk Size + + + {vm.confg.disk} GB + + + + + Power + + + {vm.power.toFixed(2)}W + + + + + + +); + +const getMessageColor = (message: string, theme: any): string => { + if (message.includes('Error') || message.includes('BadRequestException')) { + return theme.palette.error.light; + } else if (message.includes('DEBUG')) { + return theme.palette.info.light; + } else if (message.includes('Attempting')) { + return theme.palette.warning.light; + } else if (message.includes('completed') || message.includes('Migration completed')) { + return theme.palette.success.light; + } + return 'white'; +}; + +const MigrationProgress = ({ open, progress, onClose }: { + open: boolean; + progress: string[]; + onClose: () => void; +}) => { + const theme = useTheme(); + + return ( + + + + + Migration Progress + + {progress.length > 0 && ( + + )} + + + + {progress.length > 0 ? ( + progress.map((message, index) => ( + + {message} + + )) + ) : ( + + + Starting migration process... + + )} + + + + + + + ); +}; + +const Migration = () => { + const theme = useTheme(); + + // Essential states + const [vmPlacementData, setVmPlacementData] = useState(null); + const [isLoadingVmPlacement, setIsLoadingVmPlacement] = useState(false); + const [expandedVMs, setExpandedVMs] = useState>({}); + const [showVerifiedSection, setShowVerifiedSection] = useState(false); + const [isCardExpanded, setIsCardExpanded] = useState(false); + const [migrationMode] = useState<'auto' | 'semiauto'>('auto'); + const [isProcessing, setIsProcessing] = useState(false); + const [migrationProgress, setMigrationProgress] = useState([]); + const [showProgress, setShowProgress] = useState(false); + const [hasProgress, setHasProgress] = useState(false); + + // Hooks for migration functionality + const { gainBeforeData, migrationAdviceData, isLoadingGainData, fetchMigrationData } = useMigrationData(); + const { gainAfterData, isLoading: isLoadingGainAfter, fetchGainAfterData } = useGainAfterData(); + + // Essential functions + const toggleVMDetails = (vmId: string) => { + setExpandedVMs(prev => ({ + ...prev, + [vmId]: !prev[vmId] + })); + }; + + const fetchVmPlacementData = async () => { + try { + setIsLoadingVmPlacement(true); + const response = await fetch(`${API_BASE_URL}/prom/get_chart_data/vm_placement`); + if (!response.ok) { + throw new Error(`Failed to fetch VM placement data: ${response.status}`); + } + const data = await response.json(); + console.log('Raw API response:', data); // Debug log + setVmPlacementData(data); // Use the data directly since it already has the correct structure + } catch (error) { + console.error('Error fetching VM placement data:', error); + } finally { + setIsLoadingVmPlacement(false); + } + }; + + const handleApproveMigration = async () => { + try { + setIsProcessing(true); + setMigrationProgress([]); + setHasProgress(true); + + // First, send the POST request for migration approval + const approvalResponse = await fetch('http://141.196.83.136:8003/prom/migration/decisions4?run_migration=true', { + method: 'POST', + headers: { + 'accept': 'application/json' + } + }); + + if (!approvalResponse.ok) { + throw new Error('Failed to approve migration'); + } + + const reader = approvalResponse.body?.getReader(); + const decoder = new TextDecoder(); + + if (reader) { + while (true) { + const { value, done } = await reader.read(); + if (done) break; + + const text = decoder.decode(value); + const lines = text.split('\n').filter(line => line.trim()); + + setMigrationProgress(prev => [...prev, ...lines]); + } + } + + // If approval is successful, show verified section and fetch gain after data + setShowVerifiedSection(true); + await fetchGainAfterData(); + + } catch (error) { + console.error('Error during migration approval:', error); + setMigrationProgress(prev => [...prev, `Error: ${error instanceof Error ? error.message : 'Unknown error occurred'}`]); + } finally { + setIsProcessing(false); + } + }; + + const handleDeclineMigration = async () => { + try { + setIsProcessing(true); + + const response = await fetch('http://141.196.83.136:8003/prom/migration/decisions4?run_migration=false', { + method: 'POST', + headers: { + 'accept': 'application/json' + } + }); + + if (!response.ok) { + throw new Error('Failed to decline migration'); + } + + // Hide verified section if it was shown + setShowVerifiedSection(false); + + } catch (error) { + console.error('Error declining migration:', error); + } finally { + setIsProcessing(false); + } + }; + + // Data fetching effect + useEffect(() => { + console.log('Initial data fetch'); + fetchVmPlacementData(); + const intervalId = setInterval(() => { + console.log('Interval data fetch'); + fetchVmPlacementData(); + }, REFRESH_INTERVAL); + return () => clearInterval(intervalId); + }, []); + + // Add effect to monitor vmPlacementData changes + useEffect(() => { + if (vmPlacementData) { + const blockedPMs = vmPlacementData.physical_machines.filter(pm => pm.status === 'blocked').length; + const blockedVMs = vmPlacementData.physical_machines.reduce((acc, pm) => { + const activeBlocked = pm.vms.active.filter(vm => vm.status === 'blocked').length; + const inactiveBlocked = pm.vms.inactive.filter(vm => vm.status === 'blocked').length; + return acc + activeBlocked + inactiveBlocked; + }, 0); + + console.log('VM Placement Data updated:', { + timestamp: new Date().toISOString(), + pmCount: vmPlacementData.physical_machines.length, + blockedPMs, + totalVMs: vmPlacementData.physical_machines.reduce((acc, pm) => + acc + pm.vms.active.length + pm.vms.inactive.length, 0 + ), + blockedVMs + }); + } + }, [vmPlacementData]); + + return ( + + + + + + + + + { + e.stopPropagation(); + fetchMigrationData(); + }} + /> + + + {/* Migration Action Buttons */} + + + {hasProgress && ( + + )} + + + + + + {/* Verified Migration Section */} + {showVerifiedSection && ( + + + + )} + + {/* PM & VM Monitoring Section */} + + + + PMs & VMs Monitoring + + + {isLoadingVmPlacement ? ( + + + + ) : vmPlacementData?.physical_machines ? ( + + {vmPlacementData.physical_machines.map((pm) => ( + + + + + + + {pm.name} + {pm.status === 'blocked' && ( + + )} + + + + {pm.power_consumption.toFixed(2)}W + + + + + {/* Active VMs */} + {pm.vms.active.map((vm, index) => ( + + ))} + + {/* Inactive VMs */} + {pm.vms.inactive.map((vm, index) => ( + + ))} + + {pm.vms.active.length === 0 && pm.vms.inactive.length === 0 && ( + + No VMs running + + )} + + + + + ))} + + ) : ( + + No monitoring data available + + )} + + + + + + setShowProgress(false)} + /> + + ); +}; + +export default Migration; diff --git a/src/pages/MonitoringSystem.tsx b/src/pages/MonitoringSystem.tsx new file mode 100644 index 0000000..42c9f3c --- /dev/null +++ b/src/pages/MonitoringSystem.tsx @@ -0,0 +1,600 @@ +import { useState, useEffect, useCallback } from 'react'; +import { + Box, + Paper, + Typography, + IconButton, + Switch, + AppBar, + Toolbar, + Button, + CircularProgress, + Tooltip, + Collapse, + Grid, + useTheme, + styled, + Chip, + FormControl, + InputLabel, + Select, + MenuItem, + FormControlLabel, + Alert, + Snackbar, + Tabs, + Tab, +} from '@mui/material'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import BusinessIcon from '@mui/icons-material/Business'; +import LocationOnIcon from '@mui/icons-material/LocationOn'; +import DnsIcon from '@mui/icons-material/Dns'; +import ComputerIcon from '@mui/icons-material/Computer'; +import MemoryIcon from '@mui/icons-material/Memory'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import SaveIcon from '@mui/icons-material/Save'; +import SpeedIcon from '@mui/icons-material/Speed'; +import { stressService } from '../services/stressService'; + +// Define the structure of our tree nodes +interface TreeNode { + id: string; + name: string; + type: 'organization' | 'region' | 'datacenter' | 'pm' | 'vm' | 'compute'; + children?: TreeNode[]; + ip?: string; +} + +interface ComputeNode { + host_ip: string; + hosted_vms: Record; +} + +interface ApiResponse { + optimization_space: Record; +} + +// Helper function to get all descendant node IDs +const getDescendantIds = (node: TreeNode): string[] => { + let ids: string[] = [node.id]; + if (node.children) { + node.children.forEach(child => { + ids = [...ids, ...getDescendantIds(child)]; + }); + } + return ids; +}; + +// Helper function to get all ancestor node IDs +const getAncestorIds = (nodeId: string, node: TreeNode): string[] => { + if (!node) return []; + if (node.id === nodeId) return [node.id]; + + if (node.children) { + for (const child of node.children) { + const path = getAncestorIds(nodeId, child); + if (path.length > 0) { + return [node.id, ...path]; + } + } + } + return []; +}; + +// Helper function to check if all children are selected +const areAllChildrenSelected = (node: TreeNode, selectedNodes: string[]): boolean => { + if (!node.children) return true; + return node.children.every(child => { + if (child.children) { + return areAllChildrenSelected(child, selectedNodes); + } + return selectedNodes.includes(child.id); + }); +}; + +// Add new styled components for stress testing +const StressTestingCard = styled(Paper)(({ theme }) => ({ + padding: theme.spacing(3), + borderRadius: theme.spacing(2), + backgroundColor: theme.palette.background.paper, + marginBottom: theme.spacing(3), +})); + +const StressLevelChip = styled(Chip)<{ level: 'low' | 'medium' | 'high' }>(({ theme, level }) => ({ + borderRadius: theme.spacing(1), + fontWeight: 500, + backgroundColor: + level === 'low' ? theme.palette.success.light : + level === 'medium' ? theme.palette.warning.light : + theme.palette.error.light, + color: + level === 'low' ? theme.palette.success.dark : + level === 'medium' ? theme.palette.warning.dark : + theme.palette.error.dark, +})); + +interface MonitoringSystemProps { + onSave?: (unselectedVMs: string[], selectedVMs: string[]) => void; + isDialog?: boolean; + initialBlockList?: string[]; + initialSelectedVMs?: string[]; +} + +const MonitoringSystem: React.FC = ({ + onSave, + isDialog = false, + initialBlockList = [], + initialSelectedVMs = [], +}) => { + const [expanded, setExpanded] = useState(['org-main', 'region-main', 'dc-old-lab']); + const [selectedNodes, setSelectedNodes] = useState([]); + const [loading, setLoading] = useState(false); + const [treeData, setTreeData] = useState([]); + const [isViewMode, setIsViewMode] = useState(false); + const [selectedVMs, setSelectedVMs] = useState(initialSelectedVMs); + const [activeTab, setActiveTab] = useState(0); + const [alert, setAlert] = useState<{ open: boolean; message: string; severity: 'success' | 'error' | 'info' }>({ + open: false, + message: '', + severity: 'info', + }); + + // Fetch data and initialize state + const fetchData = async () => { + setLoading(true); + try { + const response = await fetch('http://141.196.83.136:8003/prom/monitoring'); + const result: ApiResponse = await response.json(); + + // Create hierarchical structure + const hierarchicalData: TreeNode[] = [ + { + id: 'org-main', + name: 'Main Organization', + type: 'organization', + children: [ + { + id: 'region-main', + name: 'Region', + type: 'region', + children: [ + { + id: 'dc-ulak', + name: 'Ulak', + type: 'datacenter', + children: [] // Empty for now + }, + { + id: 'dc-old-lab', + name: 'Old Lab', + type: 'datacenter', + children: Object.entries(result.optimization_space).map(([computeName, computeData]) => ({ + id: computeName, + name: computeName, + type: 'compute', + ip: computeData.host_ip, + children: Object.entries(computeData.hosted_vms).map(([vmName, vmIp]) => ({ + id: `${computeName}-${vmName}`, + name: vmName, + type: 'vm', + ip: vmIp + })) + })) + }, + { + id: 'dc-new-lab', + name: 'New Lab', + type: 'datacenter', + children: [] // Empty for now + } + ] + } + ] + } + ]; + + setTreeData(hierarchicalData); + + // Initialize selection based on initial values only if they exist + if (initialBlockList.length > 0 || initialSelectedVMs.length > 0) { + const blockList = initialBlockList; + + // Select nodes that are not in the block list + const nodesToSelect = new Set(); + + // Helper function to process compute nodes + const processComputeNodes = (nodes: TreeNode[]) => { + nodes.forEach(node => { + if (node.type === 'compute') { + let hasSelectedVM = false; + + // Check compute node + if (node.ip && !blockList.includes(node.ip)) { + nodesToSelect.add(node.id); + } + + // Check VM nodes + node.children?.forEach(vm => { + if (vm.ip && !blockList.includes(vm.ip)) { + nodesToSelect.add(vm.id); + hasSelectedVM = true; + } + }); + + // If any VM is selected, ensure the compute is selected too + if (hasSelectedVM) { + nodesToSelect.add(node.id); + } + } + + // Recursively process children + if (node.children) { + processComputeNodes(node.children); + } + }); + }; + + // Process all nodes + processComputeNodes(hierarchicalData); + + // Set the selected nodes + setSelectedNodes(Array.from(nodesToSelect)); + } + + // Expand organization and region nodes by default + setExpanded(['org-main', 'region-main', 'dc-old-lab']); + } catch (error) { + console.error('Error fetching data:', error); + } finally { + setLoading(false); + } + }; + + // Initialize with previous state + useEffect(() => { + fetchData(); + }, [initialBlockList, initialSelectedVMs]); // Re-fetch when initial values change + + // Get appropriate icon for each node type + const getNodeIcon = (type: TreeNode['type']) => { + switch (type) { + case 'organization': + return ; + case 'region': + return ; + case 'datacenter': + return ; + case 'pm': + return ; + case 'vm': + return ; + default: + return null; + } + }; + + // Handle node expansion + const handleNodeToggle = (nodeId: string) => { + setExpanded(prev => { + const isExpanded = prev.includes(nodeId); + if (isExpanded) { + return prev.filter(id => id !== nodeId); + } else { + return [...prev, nodeId]; + } + }); + }; + + // Updated node selection handler for toggle-like selection with parent-child association + const handleNodeSelect = (nodeId: string) => { + setSelectedNodes(prev => { + const isSelected = prev.includes(nodeId); + let newSelected = [...prev]; + + // Find the node in the tree + const findNode = (nodes: TreeNode[]): TreeNode | null => { + for (const node of nodes) { + if (node.id === nodeId) return node; + if (node.children) { + const found = findNode(node.children); + if (found) return found; + } + } + return null; + }; + + // Find the parent compute node for a VM + const findParentCompute = (nodes: TreeNode[], vmId: string): TreeNode | null => { + for (const node of nodes) { + if (node.type === 'compute' && node.children?.some(vm => vm.id === vmId)) { + return node; + } + if (node.children) { + const found = findParentCompute(node.children, vmId); + if (found) return found; + } + } + return null; + }; + + const targetNode = findNode(treeData); + if (!targetNode) return prev; + + if (isSelected) { + // When deselecting a node + if (targetNode.type === 'compute') { + // If deselecting a compute, deselect all its VMs + const computeAndVMs = [targetNode.id, ...(targetNode.children?.map(vm => vm.id) || [])]; + newSelected = newSelected.filter(id => !computeAndVMs.includes(id)); + } else if (targetNode.type === 'vm') { + // If deselecting a VM, just deselect it + newSelected = newSelected.filter(id => id !== nodeId); + + // If this was the last VM, deselect the parent compute too + const parentCompute = findParentCompute(treeData, nodeId); + if (parentCompute) { + const siblingVMs = parentCompute.children?.filter(vm => vm.id !== nodeId) || []; + const hasSelectedSiblings = siblingVMs.some(vm => newSelected.includes(vm.id)); + if (!hasSelectedSiblings) { + newSelected = newSelected.filter(id => id !== parentCompute.id); + } + } + } + } else { + // When selecting a node + if (targetNode.type === 'compute') { + // If selecting a compute, select all its VMs + newSelected.push(targetNode.id); + targetNode.children?.forEach(vm => { + newSelected.push(vm.id); + }); + } else if (targetNode.type === 'vm') { + // If selecting a VM, select it and its parent compute + newSelected.push(nodeId); + const parentCompute = findParentCompute(treeData, nodeId); + if (parentCompute) { + newSelected.push(parentCompute.id); + } + } + } + + // Remove duplicates and return + return Array.from(new Set(newSelected)); + }); + }; + + // Updated render function with disabled switches in view mode + const renderTreeNode = (node: TreeNode, level: number = 0) => { + const isExpanded = expanded.includes(node.id); + const hasChildren = node.children && node.children.length > 0; + const isSelected = selectedNodes.includes(node.id); + + return ( + + + {hasChildren && ( + handleNodeToggle(node.id)} + sx={{ mr: 1 }} + > + {isExpanded ? : } + + )} + + {getNodeIcon(node.type)} + {node.name} + handleNodeSelect(node.id)} + disabled={isViewMode} + size="small" + sx={{ + ml: 1, + '& .MuiSwitch-switchBase.Mui-checked': { + color: '#4caf50', + }, + '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { + backgroundColor: '#4caf50', + }, + '& .MuiSwitch-track': { + backgroundColor: '#bdbdbd', + }, + }} + /> + + + {hasChildren && ( + + + {node.children!.map(child => renderTreeNode(child, level + 1))} + + + )} + + ); + }; + + // Get unselected and selected VMs including compute IPs + const getVMSelectionStatus = () => { + const allIPs: string[] = []; + const selectedIPs: string[] = []; + + // Find the Old Lab datacenter node that contains the dynamic data + const oldLabNode = treeData[0]?.children?.[0]?.children?.find(node => node.id === 'dc-old-lab'); + if (!oldLabNode) return { selectedVMs: [], unselectedVMs: [] }; + + // Process only the compute nodes in Old Lab + oldLabNode.children?.forEach(compute => { + // Add compute IP + if (compute.ip) { + allIPs.push(compute.ip); + if (selectedNodes.includes(compute.id)) { + selectedIPs.push(compute.ip); + } + } + + // Add VM IPs + compute.children?.forEach(vm => { + if (vm.ip) { + allIPs.push(vm.ip); + if (selectedNodes.includes(vm.id)) { + selectedIPs.push(vm.ip); + } + } + }); + }); + + // Calculate unselected IPs for block list + const unselectedIPs = allIPs.filter(ip => !selectedIPs.includes(ip)); + + console.log('Block list IPs:', unselectedIPs); + + return { + selectedVMs: selectedIPs, + unselectedVMs: unselectedIPs + }; + }; + + // Handle save action + const handleSave = async () => { + try { + setLoading(true); + const { selectedVMs, unselectedVMs } = getVMSelectionStatus(); + console.log('Selected VMs and Computes:', selectedVMs); + console.log('Unselected VMs and Computes:', unselectedVMs); + + // Store selected VMs in localStorage for stress testing + const oldLabNode = treeData[0]?.children?.[0]?.children?.find(node => node.id === 'dc-old-lab'); + if (oldLabNode) { + const selectedVMObjects = oldLabNode.children?.flatMap(compute => + compute.children?.filter(vm => selectedNodes.includes(vm.id)) + .map(vm => ({ id: vm.id, name: vm.name, ip: vm.ip })) || [] + ) || []; + + console.log('Storing VMs in localStorage:', selectedVMObjects); + localStorage.setItem('stressTestVMs', JSON.stringify(selectedVMObjects)); + } + + if (onSave) { + onSave(unselectedVMs, selectedVMs); + } + } catch (error) { + console.error('Error saving selection:', error); + } finally { + setLoading(false); + } + }; + + return ( + + {/* Header */} + + + + Optimization Space Selection + + {isDialog && ( + + + + + )} + + + + + + + + {loading ? : } + + + + + + {/* Main Content */} + + {loading ? ( + + + + ) : ( + + {treeData.map(node => renderTreeNode(node))} + + )} + + + setAlert({ ...alert, open: false })} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + > + setAlert({ ...alert, open: false })} + severity={alert.severity} + variant="filled" + sx={{ width: '100%' }} + > + {alert.message} + + + + ); +}; + +export default MonitoringSystem; diff --git a/src/pages/StressTesting.tsx b/src/pages/StressTesting.tsx new file mode 100644 index 0000000..6272288 --- /dev/null +++ b/src/pages/StressTesting.tsx @@ -0,0 +1,478 @@ +import { useState, useEffect } from 'react'; +import { + Box, + Paper, + Typography, + Button, + CircularProgress, + Grid, + FormControl, + InputLabel, + Select, + MenuItem, + FormControlLabel, + Switch, + Alert, + Snackbar, + Breadcrumbs, + Link, + Stepper, + Step, + StepLabel, + StepContent, +} from '@mui/material'; +import SpeedIcon from '@mui/icons-material/Speed'; +import HomeIcon from '@mui/icons-material/Home'; +import { stressService } from '../services/stressService'; + +// Define the structure of our VM nodes +interface VMNode { + id: string; + name: string; + ip: string; +} + +// Remove the props interface since we'll get VMs from localStorage +// interface StressTestingProps { +// selectedVMs: VMNode[]; +// } + +// Update component to not require props +const StressTesting: React.FC = () => { + // Initialize with empty array, will be populated from localStorage + const [selectedVMs, setSelectedVMs] = useState([]); + const [activeStep, setActiveStep] = useState(0); + const [stressLevel, setStressLevel] = useState<'low' | 'medium' | 'high'>('low'); + const [stressTestVMs, setStressTestVMs] = useState([]); + const [isStressTesting, setIsStressTesting] = useState(false); + const [isLoadingStress, setIsLoadingStress] = useState(false); + const [stressedVMs, setStressedVMs] = useState([]); + const [alert, setAlert] = useState<{ open: boolean; message: string; severity: 'success' | 'error' | 'info' }>({ + open: false, + message: '', + severity: 'info', + }); + + // Load selected VMs from localStorage + useEffect(() => { + const loadVMsFromStorage = () => { + const storedVMs = localStorage.getItem('stressTestVMs'); + console.log('Loading VMs from storage:', storedVMs); + + if (storedVMs) { + try { + const parsedVMs = JSON.parse(storedVMs); + console.log('Parsed VMs:', parsedVMs); + setSelectedVMs(parsedVMs); + } catch (error) { + console.error('Error parsing stored VMs:', error); + setAlert({ + open: true, + message: 'Error loading VMs from storage. Please select VMs in the Monitoring page first.', + severity: 'error', + }); + } + } else { + console.log('No VMs found in storage'); + setAlert({ + open: true, + message: 'No VMs found. Please select VMs in the Monitoring page first.', + severity: 'info', + }); + } + }; + + // Load VMs initially + loadVMsFromStorage(); + + // Set up event listener for storage changes + const handleStorageChange = (e: StorageEvent) => { + if (e.key === 'stressTestVMs') { + loadVMsFromStorage(); + } + }; + + // Add event listener + window.addEventListener('storage', handleStorageChange); + + return () => { + window.removeEventListener('storage', handleStorageChange); + }; + }, []); // Empty dependency array since we only want this to run once on mount + + // Add status polling for stress test + useEffect(() => { + let interval: NodeJS.Timeout; + + const pollStressStatus = async () => { + try { + // Get the currently selected VMs from the tree view + const selectedVMList = selectedVMs.filter(vm => stressTestVMs.includes(vm.id)); + const vmIPs = selectedVMList.map(vm => vm.ip); + + console.log('Polling stress status for VMs:', vmIPs); + + if (vmIPs.length > 0) { + const status = await stressService.getStressStatus(vmIPs); + console.log('Stress status response:', status); + setStressedVMs(status); + // Only update isStressTesting if we're not already in a stress testing state + if (!isStressTesting) { + setIsStressTesting(status.length > 0); + } + } else { + setStressedVMs([]); + setIsStressTesting(false); + } + } catch (error) { + console.error('Error polling stress status:', error); + setStressedVMs([]); + // Don't automatically set isStressTesting to false on error + // This allows the stop button to remain enabled even if there's a temporary polling error + } + }; + + // Start polling immediately and then every 5 seconds + pollStressStatus(); + interval = setInterval(pollStressStatus, 5000); + + return () => { + if (interval) { + clearInterval(interval); + } + }; + }, [selectedVMs, stressTestVMs, isStressTesting]); // Added isStressTesting to dependencies + + // Handle VM selection for stress testing + const handleStressTestVMSelection = (vmId: string) => { + setStressTestVMs(prev => { + if (prev.includes(vmId)) { + return prev.filter(id => id !== vmId); + } else { + return [...prev, vmId]; + } + }); + }; + + // Handle next step + const handleNext = () => { + setActiveStep((prevActiveStep) => prevActiveStep + 1); + }; + + // Handle back step + const handleBack = () => { + setActiveStep((prevActiveStep) => prevActiveStep - 1); + }; + + // Handle reset + const handleReset = () => { + setActiveStep(0); + setStressTestVMs([]); + }; + + // Start stress test + const handleStartStressTest = async () => { + try { + setIsLoadingStress(true); + + // Get the VMs selected for stress testing + const selectedVMList = selectedVMs.filter(vm => stressTestVMs.includes(vm.id)); + const vmIPs = selectedVMList.map(vm => vm.ip); + + // Log the selected VMs for debugging + console.log('Selected VMs for stress test:', vmIPs); + + if (vmIPs.length === 0) { + setAlert({ + open: true, + message: 'Please select at least one VM to stress test', + severity: 'error', + }); + return; + } + + await stressService.startStressTest({ + vms: vmIPs, + level: stressLevel, + force: true, + }); + setIsStressTesting(true); + setAlert({ + open: true, + message: 'Stress test started successfully', + severity: 'success', + }); + } catch (error) { + console.error('Error in handleStartStressTest:', error); + setAlert({ + open: true, + message: error instanceof Error ? error.message : 'Failed to start stress test', + severity: 'error', + }); + } finally { + setIsLoadingStress(false); + } + }; + + // Stop stress test + const handleStopStressTest = async () => { + try { + setIsLoadingStress(true); + + // Get the VMs selected for stress testing + const selectedVMList = selectedVMs.filter(vm => stressTestVMs.includes(vm.id)); + const vmIPs = selectedVMList.map(vm => vm.ip); + + console.log('Stopping stress test for VMs:', vmIPs); + + await stressService.stopStressTest(vmIPs); + setIsStressTesting(false); + setStressedVMs([]); + setAlert({ + open: true, + message: 'Stress test stopped successfully', + severity: 'success', + }); + } catch (error) { + console.error('Error in handleStopStressTest:', error); + setAlert({ + open: true, + message: error instanceof Error ? error.message : 'Failed to stop stress test', + severity: 'error', + }); + } finally { + setIsLoadingStress(false); + } + }; + + // Steps for the stepper + const steps = [ + { + label: 'Select VMs', + description: 'Select the VMs you want to include in the stress test.', + content: ( + + + {selectedVMs.length === 0 ? ( + + No VMs found. Please select VMs in the Monitoring page first. + + ) : ( + + {selectedVMs.map((vm) => ( + + handleStressTestVMSelection(vm.id)} + disabled={isStressTesting || isLoadingStress} + size="small" + /> + } + label={ + + {vm.name} + + {vm.ip} + + + } + /> + + ))} + + )} + + + ), + }, + { + label: 'Configure Stress Level', + description: 'Select the stress level for the test.', + content: ( + + + Stress Level + + + + + Low: Minimal stress, suitable for testing basic functionality. + + + Medium: Moderate stress, tests system under typical load conditions. + + + High: Maximum stress, tests system under extreme conditions. + + + + ), + }, + { + label: 'Run Stress Test', + description: 'Start or stop the stress test.', + content: ( + + + + + + + {stressedVMs.length > 0 && ( + + Currently Stressed VMs: + + {stressedVMs.map((vm) => ( + + {vm} + + ))} + + + )} + + ), + }, + ]; + + return ( + + {/* Breadcrumbs */} + + + + Home + + + Monitoring + + + + Stress Testing + + + + {/* Header */} + + + Stress Testing + + + + {/* Stepper */} + + + {steps.map((step, index) => ( + + {step.label} + + {step.description} + {step.content} + +
+ + +
+
+
+
+ ))} +
+
+ + {/* Alert Snackbar */} + setAlert({ ...alert, open: false })} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + > + setAlert({ ...alert, open: false })} + severity={alert.severity} + variant="filled" + sx={{ width: '100%' }} + > + {alert.message} + + +
+ ); +}; + +export default StressTesting; \ No newline at end of file diff --git a/src/pages/Temperature.tsx b/src/pages/Temperature.tsx new file mode 100644 index 0000000..7fa2926 --- /dev/null +++ b/src/pages/Temperature.tsx @@ -0,0 +1,667 @@ +import { useEffect, useState, useCallback, useRef } from 'react'; +import { Box, Paper, Typography, Fade, useTheme, Grid, AppBar, Toolbar, CircularProgress, IconButton, Tooltip, Chip, Button, Snackbar, Alert } from '@mui/material'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import CheckCircleIcon from '@mui/icons-material/CheckCircle'; +import CancelIcon from '@mui/icons-material/Cancel'; +import Plot from 'react-plotly.js'; +import { Layout, PlotData, Config } from 'plotly.js'; + +// Extend the Window interface to include Google Charts +declare global { + interface Window { + google?: { + charts?: any; + }; + } +} + +// Define the structure of our data +interface ChartData { + power: string; + flag: string; + env_temp_cur: string; + now_timestamp: string; + future_timestamp: string; + env_temp_min: string; + power_future_min: string; +} + +const Temperature = () => { + const theme = useTheme(); + const [data, setData] = useState([]); + const [loading, setLoading] = useState(true); + const [lastUpdated, setLastUpdated] = useState(null); + const [refreshing, setRefreshing] = useState(false); + const [decisionLoading, setDecisionLoading] = useState(false); + const [powerZoom, setPowerZoom] = useState<{xRange?: [number, number]; yRange?: [number, number]}>({}); + const [tempZoom, setTempZoom] = useState<{xRange?: [number, number]; yRange?: [number, number]}>({}); + const [alert, setAlert] = useState<{ open: boolean; message: string; severity: 'success' | 'error' }>({ + open: false, + message: '', + severity: 'success' + }); + + // Use refs to keep track of the interval + const intervalRef = useRef(null); + const updateIntervalMs = 5000; // 5 seconds refresh rate + + // Create a memoized fetchData function with useCallback + const fetchData = useCallback(async (showLoadingIndicator = false) => { + try { + if (showLoadingIndicator) { + setRefreshing(true); + } + + const response = await fetch('http://141.196.83.136:8003/prom/get_chart_data/temperature/20'); + const result = await response.json(); + + if (result.data && result.data.length > 0) { + // Sort by timestamp first to ensure we get the latest data + const sortedData = [...result.data].sort((a, b) => + new Date(b.now_timestamp).getTime() - new Date(a.now_timestamp).getTime() + ); + + // Log the most recent flag + console.log('Most recent flag:', sortedData[0].flag); + + // Filter valid data points + const validData = sortedData.filter((item: any) => + item.now_timestamp && + item.future_timestamp && + item.power && + item.power_future_min && + item.env_temp_cur && + item.env_temp_min + ); + + // Limit to last 20 records but maintain chronological order + const last20Data = validData.slice(-20).sort((a, b) => + new Date(a.now_timestamp).getTime() - new Date(b.now_timestamp).getTime() + ); + + console.log(`Data updated at ${new Date().toLocaleTimeString()}:`, { + totalRecords: result.data.length, + validRecords: validData.length, + displayedRecords: last20Data.length, + latestFlag: last20Data[last20Data.length - 1]?.flag + }); + + setData(last20Data); + setLastUpdated(new Date()); + } + } catch (error) { + console.error('Error fetching data:', error); + } finally { + setLoading(false); + setRefreshing(false); + } + }, []); + + // Manual refresh handler + const handleRefresh = () => { + fetchData(true); + }; + + // Set up the interval for real-time updates + useEffect(() => { + // Initial fetch + fetchData(true); + + // Set up interval for auto-refresh + intervalRef.current = setInterval(() => { + console.log(`Auto-refreshing data at ${new Date().toLocaleTimeString()}`); + fetchData(false); + }, updateIntervalMs); + + // Cleanup function to clear the interval when component unmounts + return () => { + if (intervalRef.current) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } + }; + }, [fetchData]); + + // Process data for Plotly charts + const preparePlotlyData = () => { + if (!data || data.length === 0) return { powerData: [], tempData: [] }; + + const currentTimestamps = data.map(item => new Date(item.now_timestamp)); + const futureTimestamps = data.map(item => new Date(item.future_timestamp)); + const currentPower = data.map(item => parseFloat(item.power)); + const predictedPower = data.map(item => parseFloat(item.power_future_min)); + const currentTemp = data.map(item => parseFloat(item.env_temp_cur)); + const predictedTemp = data.map(item => parseFloat(item.env_temp_min)); + + // Calculate min and max values for range sliders + const powerMin = Math.min(...currentPower, ...predictedPower); + const powerMax = Math.max(...currentPower, ...predictedPower); + const tempMin = Math.min(...currentTemp, ...predictedTemp); + const tempMax = Math.max(...currentTemp, ...predictedTemp); + + const powerData: Partial[] = [ + { + x: currentTimestamps, + y: currentPower, + type: 'scatter', + mode: 'lines+markers', + name: 'Current Power', + line: { color: theme.palette.primary.main, width: 2 }, + marker: { size: 6 } + }, + { + x: futureTimestamps, + y: predictedPower, + type: 'scatter', + mode: 'lines+markers', + name: 'Predicted Power', + line: { color: theme.palette.success.main, width: 2, dash: 'dash' }, + marker: { size: 6 } + }, + // Range slider trace + { + x: [...currentTimestamps, ...futureTimestamps], + y: Array(currentTimestamps.length + futureTimestamps.length).fill(0.5), + type: 'scatter', + mode: 'lines', + name: 'Y Range', + yaxis: 'y2', + line: { color: 'transparent' }, + showlegend: false, + hoverinfo: 'skip' as const + } + ]; + + const tempData: Partial[] = [ + { + x: currentTimestamps, + y: currentTemp, + type: 'scatter', + mode: 'lines+markers', + name: 'Current Temperature', + line: { color: theme.palette.primary.main, width: 2 }, + marker: { size: 6 } + }, + { + x: futureTimestamps, + y: predictedTemp, + type: 'scatter', + mode: 'lines+markers', + name: 'Predicted Temperature', + line: { color: theme.palette.success.main, width: 2, dash: 'dash' }, + marker: { size: 6 } + }, + // Range slider trace + { + x: [...currentTimestamps, ...futureTimestamps], + y: Array(currentTimestamps.length + futureTimestamps.length).fill(0.5), + type: 'scatter', + mode: 'lines', + name: 'Y Range', + yaxis: 'y2', + line: { color: 'transparent' }, + showlegend: false, + hoverinfo: 'skip' as const + } + ]; + + return { + powerData, + tempData, + ranges: { + power: { min: powerMin, max: powerMax }, + temp: { min: tempMin, max: tempMax } + } + }; + }; + + const { powerData, tempData, ranges } = preparePlotlyData(); + + // Common layout settings for both charts + const commonLayoutSettings: Partial = { + showlegend: true, + legend: { + orientation: 'h', + y: -0.2, + x: 0.5, + xanchor: 'center', + yanchor: 'top', + font: { + size: 12, + family: theme.typography.fontFamily, + color: theme.palette.text.secondary + }, + bgcolor: 'rgba(255, 255, 255, 0)', + bordercolor: 'rgba(255, 255, 255, 0)' + }, + margin: { t: 60, b: 100, l: 60, r: 60 }, // Increased right margin for Y-axis range slider + plot_bgcolor: 'rgba(0,0,0,0)', + paper_bgcolor: 'rgba(0,0,0,0)', + hovermode: 'closest', + xaxis: { + type: 'date', + gridcolor: theme.palette.divider, + tickfont: { size: 12, color: theme.palette.text.secondary }, + showgrid: true, + rangeslider: { visible: true } + }, + yaxis2: { + overlaying: 'y', + side: 'right', + showgrid: false, + zeroline: false, + showticklabels: false, + range: [0, 1], + rangeslider: { + visible: true, + thickness: 0.1, + bgcolor: 'rgba(0,0,0,0)', + bordercolor: theme.palette.divider + } + } + }; + + // Add handlers for zoom events + const handlePowerZoom = (event: any) => { + if (event['xaxis.range[0]']) { + setPowerZoom({ + xRange: [new Date(event['xaxis.range[0]']).getTime(), new Date(event['xaxis.range[1]']).getTime()], + yRange: [event['yaxis.range[0]'], event['yaxis.range[1]']] + }); + } + }; + + const handleTempZoom = (event: any) => { + if (event['xaxis.range[0]']) { + setTempZoom({ + xRange: [new Date(event['xaxis.range[0]']).getTime(), new Date(event['xaxis.range[1]']).getTime()], + yRange: [event['yaxis.range[0]'], event['yaxis.range[1]']] + }); + } + }; + + // Modify the power layout to use preserved zoom + const powerLayout: Partial = { + ...commonLayoutSettings, + yaxis: { + title: 'Power (W)', + gridcolor: theme.palette.divider, + tickfont: { size: 12, color: theme.palette.text.secondary }, + titlefont: { size: 14, color: theme.palette.text.primary }, + showgrid: true, + rangemode: 'tozero', + fixedrange: false, + range: powerZoom.yRange || (ranges ? [ranges.power.min * 0.9, ranges.power.max * 1.1] : undefined) + }, + xaxis: { + ...commonLayoutSettings.xaxis, + range: powerZoom.xRange ? [new Date(powerZoom.xRange[0]), new Date(powerZoom.xRange[1])] : undefined + } + }; + + // Modify the temperature layout to use preserved zoom + const tempLayout: Partial = { + ...commonLayoutSettings, + yaxis: { + title: 'Temperature (°C)', + gridcolor: theme.palette.divider, + tickfont: { size: 12, color: theme.palette.text.secondary }, + titlefont: { size: 14, color: theme.palette.text.primary }, + showgrid: true, + rangemode: 'tozero', + fixedrange: false, + range: tempZoom.yRange || (ranges ? [ranges.temp.min * 0.9, ranges.temp.max * 1.1] : undefined) + }, + xaxis: { + ...commonLayoutSettings.xaxis, + range: tempZoom.xRange ? [new Date(tempZoom.xRange[0]), new Date(tempZoom.xRange[1])] : undefined + } + }; + + // Common Plotly config with additional modebar buttons + const plotConfig: Partial = { + responsive: true, + displayModeBar: true, + displaylogo: false, + modeBarButtonsToRemove: ['lasso2d', 'select2d'] as ('lasso2d' | 'select2d')[], + toImageButtonOptions: { + format: 'png' as const, + filename: 'temperature_monitoring', + height: 1000, + width: 1500, + scale: 2 + } + }; + + // Handle temperature decision + const handleTemperatureDecision = async (approval: boolean) => { + try { + setDecisionLoading(true); + const response = await fetch('http://141.196.83.136:8003/prom/temperature/decisions?approval=' + approval, { + method: 'POST', + headers: { + 'accept': 'application/json', + } + }); + + if (!response.ok) { + throw new Error(`Failed to send temperature decision: ${response.statusText}`); + } + + const result = await response.json(); + setAlert({ + open: true, + message: result.message || `Temperature change ${approval ? 'approved' : 'declined'} successfully`, + severity: 'success' + }); + + // Refresh data after decision + await fetchData(true); + } catch (error) { + console.error('Error sending temperature decision:', error); + setAlert({ + open: true, + message: error instanceof Error ? error.message : 'Failed to send temperature decision', + severity: 'error' + }); + } finally { + setDecisionLoading(false); + } + }; + + const handleCloseAlert = () => { + setAlert(prev => ({ ...prev, open: false })); + }; + + return ( + + + + + Environmental Temperature & Power Monitoring (Last 20 Records) + + + {lastUpdated && ( + + Last updated: {lastUpdated.toLocaleTimeString()} + + )} + + + + + + + + + + + {/* Temperature Decision Panel */} + + + + Temperature Change Decision + + + + + + + + + + + {/* Power Chart */} + + + + + Power Consumption + + {data.length > 0 && ( + + )} + + + {refreshing && ( + + + + )} + + {loading ? ( + + + + Loading power data... + + + ) : data.length === 0 ? ( + + No power data available + + ) : ( + + + + )} + + + + {/* Temperature Chart */} + + + + + Environmental Temperature + + {data.length > 0 && ( + + )} + + + {refreshing && ( + + + + )} + + {loading ? ( + + + + Loading temperature data... + + + ) : data.length === 0 ? ( + + No temperature data available + + ) : ( + + + + )} + + + + + + + {/* Snackbar for alerts */} + + + {alert.message} + + + + ); +}; + +export default Temperature; diff --git a/src/plotly.d.ts b/src/plotly.d.ts new file mode 100644 index 0000000..0b96cdc --- /dev/null +++ b/src/plotly.d.ts @@ -0,0 +1,25 @@ +declare module 'react-plotly.js' { + import * as Plotly from 'plotly.js'; + import * as React from 'react'; + + interface PlotParams { + data: Plotly.Data[]; + layout?: Partial; + frames?: Plotly.Frame[]; + config?: Partial; + onClick?: (event: Plotly.PlotMouseEvent) => void; + onHover?: (event: Plotly.PlotMouseEvent) => void; + onUnHover?: (event: Plotly.PlotMouseEvent) => void; + onSelected?: (event: Plotly.PlotSelectionEvent) => void; + onDeselect?: () => void; + onDoubleClick?: () => void; + style?: React.CSSProperties; + className?: string; + debug?: boolean; + useResizeHandler?: boolean; + [key: string]: any; + } + + class Plot extends React.Component {} + export default Plot; +} \ No newline at end of file diff --git a/src/services/monitoringService.ts b/src/services/monitoringService.ts new file mode 100644 index 0000000..032c7a4 --- /dev/null +++ b/src/services/monitoringService.ts @@ -0,0 +1,302 @@ +import axios from 'axios'; + +const BASE_URL = 'http://141.196.83.136:8003'; + +export interface MonitoringConfig { + migration: { + script_time_unit: string; + virtual_machine_estimation: { + estimation_method: string; + model_type: string; + }; + migration_advices: { + migration_method: string; + migration_weights: { + power: string; + balance: string; + overload: string; + allocation: string; + }; + }; + block_list: string[]; + }; + environmental: { + number_of_steps: string; + script_time_unit: string; + model_type: string; + }; + preventive: { + number_of_steps: string; + script_time_unit: string; + model_type: string; + }; +} + +export interface MonitoringStatus { + statuses: { + environmental: { + is_running: boolean; + pid: number; + }; + migration: { + is_running: boolean; + pid: number; + }; + preventive: { + is_running: boolean; + pid: number; + }; + }; +} + +class MonitoringService { + private static instance: MonitoringService; + private controller: AbortController | null = null; + private statusPollingInterval: NodeJS.Timeout | null = null; + private previousStatus: MonitoringStatus | null = null; + + private constructor() {} + + public static getInstance(): MonitoringService { + if (!MonitoringService.instance) { + MonitoringService.instance = new MonitoringService(); + } + return MonitoringService.instance; + } + + public async startMonitoring(config: MonitoringConfig): Promise { + try { + // Validate required fields based on API documentation + if (!config.migration || !config.environmental || !config.preventive) { + throw new Error('Invalid configuration: Missing required sections'); + } + + // Ensure script_time_unit has valid values + if (!config.migration.script_time_unit || + !config.environmental.script_time_unit || + !config.preventive.script_time_unit) { + throw new Error('Invalid configuration: Missing script_time_unit values'); + } + + // Log the configuration being sent + console.log('Sending monitoring configuration:', JSON.stringify(config, null, 2)); + + // Always create a new AbortController for this request + if (this.controller) { + this.controller.abort(); + } + this.controller = new AbortController(); + + const response = await axios.post( + `${BASE_URL}/prom/start_monitoring`, + config, + { + signal: this.controller.signal, + headers: { + 'Content-Type': 'application/json', + }, + timeout: 15000, // 15 second timeout to prevent hanging + } + ); + + if (response.status !== 200) { + throw new Error(`Failed to start monitoring: Status ${response.status}`); + } + + console.log('Monitoring started successfully:', response.data); + return; + } catch (error) { + if (axios.isCancel(error)) { + console.log('Start monitoring request cancelled'); + } else { + console.error('Error starting monitoring:', error); + throw this.handleError(error); + } + } + } + + public async stopMonitoring(): Promise { + try { + console.log('Attempting to stop monitoring...'); + + // Cancel any ongoing monitoring request + if (this.controller) { + this.controller.abort(); + this.controller = null; + } + + // Stop status polling if it's running + this.stopStatusPolling(); + + // According to API docs, this needs an empty body + const response = await axios.post(`${BASE_URL}/prom/stop_monitoring`, {}, { + headers: { + 'Content-Type': 'application/json', + }, + timeout: 10000, // 10 second timeout + }); + + if (response.status !== 200) { + throw new Error(`Failed to stop monitoring: Status ${response.status}`); + } + + console.log('Monitoring stopped successfully:', response.data); + return; + } catch (error) { + console.error('Error stopping monitoring:', error); + throw this.handleError(error); + } + } + + public async getMonitoringStatus(): Promise { + try { + const response = await axios.get(`${BASE_URL}/prom/monitoring_status`, { + headers: { + 'Content-Type': 'application/json', + }, + timeout: 5000, // Shorter timeout for faster feedback + }); + + if (response.status !== 200) { + throw new Error('Failed to get monitoring status'); + } + + const data = response.data; + + // Ensure the response always has the expected structure + const normalizedData = { + statuses: { + environmental: { + is_running: data?.statuses?.environmental?.is_running || false, + pid: data?.statuses?.environmental?.pid || 0 + }, + migration: { + is_running: data?.statuses?.migration?.is_running || false, + pid: data?.statuses?.migration?.pid || 0 + }, + preventive: { + is_running: data?.statuses?.preventive?.is_running || false, + pid: data?.statuses?.preventive?.pid || 0 + } + } + }; + + // Only log when status actually changes + if (!this.previousStatus || + this.hasStatusChanged(normalizedData, this.previousStatus)) { + console.log('Monitoring status changed:', JSON.stringify(normalizedData, null, 2)); + this.previousStatus = JSON.parse(JSON.stringify(normalizedData)); + } + + return normalizedData; + } catch (error) { + // Only log errors once per minute to reduce console noise + const now = new Date(); + if (!this._lastErrorLog || now.getTime() - this._lastErrorLog.getTime() > 60000) { + console.error('Error getting monitoring status:', error); + this._lastErrorLog = now; + } + + // Return a default structure that indicates no services are running + return { + statuses: { + environmental: { + is_running: false, + pid: 0 + }, + migration: { + is_running: false, + pid: 0 + }, + preventive: { + is_running: false, + pid: 0 + } + } + }; + } + } + + private hasStatusChanged(current: MonitoringStatus, previous: MonitoringStatus): boolean { + return current.statuses.migration.is_running !== previous.statuses.migration.is_running || + current.statuses.environmental.is_running !== previous.statuses.environmental.is_running || + current.statuses.preventive.is_running !== previous.statuses.preventive.is_running; + } + + private _lastErrorLog: Date | null = null; + + public startStatusPolling(callback: (status: MonitoringStatus) => void, interval: number = 5000): void { + this.stopStatusPolling(); + + this.statusPollingInterval = setInterval(async () => { + try { + const status = await this.getMonitoringStatus(); + callback(status); + } catch (error) { + console.error('Error polling monitoring status:', error); + callback({ + statuses: { + environmental: { + is_running: false, + pid: 0 + }, + migration: { + is_running: false, + pid: 0 + }, + preventive: { + is_running: false, + pid: 0 + } + } + }); + } + }, interval); + } + + public stopStatusPolling(): void { + if (this.statusPollingInterval) { + clearInterval(this.statusPollingInterval); + this.statusPollingInterval = null; + } + } + + private handleError(error: any): Error { + if (error.response) { + // Server responded with error status + return new Error( + `Server error: ${error.response.status} - ${error.response.data?.message || 'Unknown error'}` + ); + } else if (error.request) { + // Request made but no response received + return new Error('No response received from server'); + } else { + // Error in request setup + return new Error(`Request error: ${error.message}`); + } + } + + public async checkMonitoringActive(): Promise { + try { + console.log('Checking if monitoring is active...'); + + const status = await this.getMonitoringStatus(); + + // Check if any of the monitoring services are running + const migrationRunning = status?.statuses?.migration?.is_running; + const environmentalRunning = status?.statuses?.environmental?.is_running; + const preventiveRunning = status?.statuses?.preventive?.is_running; + + const isActive = migrationRunning || environmentalRunning || preventiveRunning; + console.log(`Monitoring active status: ${isActive} (Migration: ${migrationRunning}, Environmental: ${environmentalRunning}, Preventive: ${preventiveRunning})`); + + return isActive; + } catch (error) { + console.error('Error checking monitoring status:', error); + // Assume not active if we can't check + return false; + } + } +} + +export const monitoringService = MonitoringService.getInstance(); \ No newline at end of file diff --git a/src/services/stressService.ts b/src/services/stressService.ts new file mode 100644 index 0000000..e707bbc --- /dev/null +++ b/src/services/stressService.ts @@ -0,0 +1,196 @@ +import axios from 'axios'; + +const BASE_URL = 'http://141.196.83.136:8003'; + +export interface StressConfig { + vms: string[]; + level: 'low' | 'medium' | 'high'; + force: boolean; +} + +export interface StressStatus { + status: string[]; +} + +class StressService { + private static instance: StressService; + + private constructor() {} + + public static getInstance(): StressService { + if (!StressService.instance) { + StressService.instance = new StressService(); + } + return StressService.instance; + } + + public async startStressTest(config: StressConfig): Promise { + try { + // Log the request configuration + console.log('Starting stress test with config:', { + url: `${BASE_URL}/stress/start`, + data: { + vms: config.vms, + level: config.level, + force: true + } + }); + + const response = await axios.post( + `${BASE_URL}/stress/start`, + { + vms: config.vms, + level: config.level, + force: true + }, + { + headers: { + 'Content-Type': 'application/json', + }, + timeout: 10000, + } + ); + + if (response.status !== 200) { + throw new Error(`Failed to start stress test: Status ${response.status}`); + } + + console.log('Stress test started successfully:', response.data); + return; + } catch (error) { + // Enhanced error logging + if (axios.isAxiosError(error)) { + console.error('Axios error details:', { + status: error.response?.status, + statusText: error.response?.statusText, + data: error.response?.data, + config: { + url: error.config?.url, + method: error.config?.method, + data: error.config?.data, + headers: error.config?.headers + } + }); + } else { + console.error('Non-axios error:', error); + } + throw this.handleError(error); + } + } + + public async stopStressTest(vms: string[]): Promise { + try { + console.log('Stopping stress test for VMs:', vms); + + const response = await axios.post( + `${BASE_URL}/stress/stop`, + vms, + { + headers: { + 'Content-Type': 'application/json', + }, + timeout: 10000, + } + ); + + if (response.status !== 200) { + throw new Error(`Failed to stop stress test: Status ${response.status}`); + } + + console.log('Stress test stopped successfully:', response.data); + return; + } catch (error) { + if (axios.isAxiosError(error)) { + console.error('Axios error details:', { + status: error.response?.status, + statusText: error.response?.statusText, + data: error.response?.data, + config: { + url: error.config?.url, + method: error.config?.method, + data: error.config?.data, + headers: error.config?.headers + } + }); + } else { + console.error('Non-axios error:', error); + } + throw this.handleError(error); + } + } + + public async getStressStatus(vms: string[]): Promise { + try { + console.log('Fetching stress status for VMs:', vms); + + const response = await axios.post( + `${BASE_URL}/stress/status`, + vms, + { + headers: { + 'Content-Type': 'application/json', + }, + timeout: 5000, + } + ); + + // Log the raw response for debugging + console.log('Raw stress status response:', { + status: response.status, + statusText: response.statusText, + data: response.data, + headers: response.headers + }); + + if (response.status !== 200) { + throw new Error(`Failed to get stress test status: ${response.status}`); + } + + // Handle the new response format where data is an object with VM IPs as keys + if (response.data && typeof response.data === 'object') { + // Extract VMs that are running + const runningVMs = Object.entries(response.data) + .filter(([_, status]: [string, any]) => status.is_running) + .map(([ip]) => ip); + + console.log('Running VMs:', runningVMs); + return runningVMs; + } + + return []; + } catch (error) { + if (axios.isAxiosError(error)) { + console.error('Axios error details:', { + status: error.response?.status, + statusText: error.response?.statusText, + data: error.response?.data, + config: { + url: error.config?.url, + method: error.config?.method, + data: error.config?.data, + headers: error.config?.headers + } + }); + } else { + console.error('Non-axios error:', error); + } + throw this.handleError(error); + } + } + + private handleError(error: any): Error { + if (axios.isAxiosError(error)) { + const response = error.response; + if (response) { + return new Error( + `Server error: ${response.status} - ${JSON.stringify(response.data)}` + ); + } else if (error.request) { + return new Error('No response received from server'); + } + } + return new Error(`Request error: ${error.message}`); + } +} + +export const stressService = StressService.getInstance(); \ No newline at end of file diff --git a/src/theme.ts b/src/theme.ts new file mode 100644 index 0000000..d6bafdd --- /dev/null +++ b/src/theme.ts @@ -0,0 +1,95 @@ +import { createTheme } from '@mui/material'; + +export const theme = createTheme({ + palette: { + mode: 'light', + primary: { + main: '#0B1A33', // Deep navy blue from BLC + light: '#1e3a6b', + dark: '#060d19', + }, + secondary: { + main: '#FF5722', // Orange accent from icons + light: '#ff784e', + dark: '#c41c00', + }, + background: { + default: '#f5f5f5', + paper: '#ffffff', + }, + text: { + primary: '#0B1A33', + secondary: '#546e7a', + }, + }, + typography: { + fontFamily: '"Segoe UI", "Roboto", "Helvetica", sans-serif', + h1: { + fontSize: '2.5rem', + fontWeight: 600, + color: '#0B1A33', + }, + h5: { + fontWeight: 500, + color: '#0B1A33', + }, + }, + components: { + MuiButton: { + styleOverrides: { + root: { + borderRadius: 4, + textTransform: 'none', + padding: '8px 24px', + transition: 'all 0.3s ease-in-out', + '&:hover': { + transform: 'translateY(-2px)', + boxShadow: '0 4px 12px rgba(11, 26, 51, 0.15)', + }, + }, + contained: { + background: '#0B1A33', + color: '#ffffff', + '&:hover': { + background: '#1e3a6b', + }, + }, + }, + }, + MuiCard: { + styleOverrides: { + root: { + borderRadius: 8, + boxShadow: '0 2px 12px rgba(11, 26, 51, 0.08)', + border: '1px solid rgba(11, 26, 51, 0.1)', + }, + }, + }, + MuiPaper: { + styleOverrides: { + root: { + borderRadius: 8, + boxShadow: '0 2px 12px rgba(11, 26, 51, 0.08)', + border: '1px solid rgba(11, 26, 51, 0.1)', + }, + }, + }, + MuiTextField: { + styleOverrides: { + root: { + '& .MuiOutlinedInput-root': { + '& fieldset': { + borderColor: 'rgba(11, 26, 51, 0.2)', + }, + '&:hover fieldset': { + borderColor: 'rgba(11, 26, 51, 0.3)', + }, + '&.Mui-focused fieldset': { + borderColor: '#0B1A33', + }, + }, + }, + }, + }, + }, +}); diff --git a/src/types/images.d.ts b/src/types/images.d.ts new file mode 100644 index 0000000..8232e9d --- /dev/null +++ b/src/types/images.d.ts @@ -0,0 +1,14 @@ +declare module '*.png' { + const content: string; + export default content; +} + +declare module '*.jpg' { + const content: string; + export default content; +} + +declare module '*.svg' { + const content: string; + export default content; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d0104ed --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..099658c --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +})