diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..03fd5b4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+# --- JetBrains / IntelliJ ---
+.idea/
+.idea/*
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+client/node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+/kaiaulu_react.iml
diff --git a/README.md b/README.md
index e69de29..2924ea7 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,14 @@
+## Requires Node.js and NPM
+https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
+
+## Requires PNPM
+https://pnpm.io/installation
+
+
+## Starting the Application:
+
+1. Navigate into 'client' directory via terminal.
+
+2. Once inside, run the following command: pnpm install
+
+3. After installation has completed run the following command: pnpm run dev
diff --git a/client/README.md b/client/README.md
new file mode 100644
index 0000000..7959ce4
--- /dev/null
+++ b/client/README.md
@@ -0,0 +1,69 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default tseslint.config([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+
+ // Remove tseslint.configs.recommended and replace with this
+ ...tseslint.configs.recommendedTypeChecked,
+ // Alternatively, use this for stricter rules
+ ...tseslint.configs.strictTypeChecked,
+ // Optionally, add this for stylistic rules
+ ...tseslint.configs.stylisticTypeChecked,
+
+ // Other configs...
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
+
+You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default tseslint.config([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+ // Enable lint rules for React
+ reactX.configs['recommended-typescript'],
+ // Enable lint rules for React DOM
+ reactDom.configs.recommended,
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
diff --git a/client/eslint.config.js b/client/eslint.config.js
new file mode 100644
index 0000000..9b4e9a5
--- /dev/null
+++ b/client/eslint.config.js
@@ -0,0 +1,30 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+import { globalIgnores } from 'eslint/config'
+
+export default tseslint.config([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs['recommended-latest'],
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ rules: {
+ 'react-refresh/only-export-components': [
+ 'warn',
+ { allowExportNames: ['useNetworkGraph'] },
+ ],
+ },
+ },
+
+])
diff --git a/client/index.html b/client/index.html
new file mode 100644
index 0000000..5070f50
--- /dev/null
+++ b/client/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ Kaiaulu React
+
+
+
+
+
+
+
+
diff --git a/client/package.json b/client/package.json
new file mode 100644
index 0000000..56f651a
--- /dev/null
+++ b/client/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "client",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@dnd-kit/core": "^6.3.1",
+ "@dnd-kit/utilities": "^3.2.2",
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.1",
+ "@fontsource/roboto": "^5.2.9",
+ "@mui/material": "^7.3.5",
+ "@tailwindcss/vite": "^4.1.17",
+ "@tanstack/react-query": "^5.90.3",
+ "d3": "^7.9.0",
+ "react": "^19.1.1",
+ "react-dom": "^19.1.1",
+ "react-router-dom": "^7.9.3",
+ "tailwindcss": "^4.1.17",
+ "yaml": "^2.8.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.33.0",
+ "@types/d3": "^7.4.3",
+ "@types/node": "^24.10.1",
+ "@types/react": "^19.1.10",
+ "@types/react-dom": "^19.1.7",
+ "@vitejs/plugin-react": "^5.0.0",
+ "eslint": "^9.33.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.20",
+ "globals": "^16.3.0",
+ "typescript": "~5.8.3",
+ "typescript-eslint": "^8.39.1",
+ "vite": "7.1.11"
+ }
+}
diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml
new file mode 100644
index 0000000..442f685
--- /dev/null
+++ b/client/pnpm-lock.yaml
@@ -0,0 +1,3633 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@dnd-kit/core':
+ specifier: ^6.3.1
+ version: 6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ '@dnd-kit/utilities':
+ specifier: ^3.2.2
+ version: 3.2.2(react@19.1.1)
+ '@emotion/react':
+ specifier: ^11.14.0
+ version: 11.14.0(@types/react@19.1.12)(react@19.1.1)
+ '@emotion/styled':
+ specifier: ^11.14.1
+ version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
+ '@fontsource/roboto':
+ specifier: ^5.2.9
+ version: 5.2.9
+ '@mui/material':
+ specifier: ^7.3.5
+ version: 7.3.5(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ '@tailwindcss/vite':
+ specifier: ^4.1.17
+ version: 4.1.17(vite@7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1))
+ '@tanstack/react-query':
+ specifier: ^5.90.3
+ version: 5.90.3(react@19.1.1)
+ d3:
+ specifier: ^7.9.0
+ version: 7.9.0
+ react:
+ specifier: ^19.1.1
+ version: 19.1.1
+ react-dom:
+ specifier: ^19.1.1
+ version: 19.1.1(react@19.1.1)
+ react-router-dom:
+ specifier: ^7.9.3
+ version: 7.9.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ tailwindcss:
+ specifier: ^4.1.17
+ version: 4.1.17
+ yaml:
+ specifier: ^2.8.1
+ version: 2.8.1
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.33.0
+ version: 9.35.0
+ '@types/d3':
+ specifier: ^7.4.3
+ version: 7.4.3
+ '@types/node':
+ specifier: ^24.10.1
+ version: 24.10.1
+ '@types/react':
+ specifier: ^19.1.10
+ version: 19.1.12
+ '@types/react-dom':
+ specifier: ^19.1.7
+ version: 19.1.9(@types/react@19.1.12)
+ '@vitejs/plugin-react':
+ specifier: ^5.0.0
+ version: 5.0.2(vite@7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1))
+ eslint:
+ specifier: ^9.33.0
+ version: 9.35.0(jiti@2.6.1)
+ eslint-plugin-react-hooks:
+ specifier: ^5.2.0
+ version: 5.2.0(eslint@9.35.0(jiti@2.6.1))
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.20
+ version: 0.4.20(eslint@9.35.0(jiti@2.6.1))
+ globals:
+ specifier: ^16.3.0
+ version: 16.4.0
+ typescript:
+ specifier: ~5.8.3
+ version: 5.8.3
+ typescript-eslint:
+ specifier: ^8.39.1
+ version: 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ vite:
+ specifier: 7.1.11
+ version: 7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1)
+
+packages:
+
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.28.4':
+ resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.28.4':
+ resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.28.3':
+ resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.27.1':
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.27.1':
+ resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.28.4':
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.28.4':
+ resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.28.4':
+ resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.28.4':
+ resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.28.4':
+ resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@dnd-kit/accessibility@3.1.1':
+ resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@dnd-kit/core@6.3.1':
+ resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@dnd-kit/utilities@3.2.2':
+ resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@emotion/babel-plugin@11.13.5':
+ resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==}
+
+ '@emotion/cache@11.14.0':
+ resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==}
+
+ '@emotion/hash@0.9.2':
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
+
+ '@emotion/is-prop-valid@1.4.0':
+ resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==}
+
+ '@emotion/memoize@0.9.0':
+ resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==}
+
+ '@emotion/react@11.14.0':
+ resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@emotion/serialize@1.3.3':
+ resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==}
+
+ '@emotion/sheet@1.4.0':
+ resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==}
+
+ '@emotion/styled@11.14.1':
+ resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==}
+ peerDependencies:
+ '@emotion/react': ^11.0.0-rc.0
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@emotion/unitless@0.10.0':
+ resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0':
+ resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@emotion/utils@1.4.2':
+ resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==}
+
+ '@emotion/weak-memoize@0.4.0':
+ resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==}
+
+ '@esbuild/aix-ppc64@0.25.9':
+ resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.9':
+ resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.9':
+ resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.9':
+ resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.9':
+ resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.9':
+ resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.9':
+ resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.9':
+ resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.9':
+ resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.9':
+ resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.9':
+ resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.9':
+ resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.9':
+ resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.9':
+ resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.9':
+ resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.9':
+ resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.9':
+ resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.9':
+ resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.9':
+ resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.9':
+ resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.9':
+ resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.9':
+ resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.9':
+ resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.9':
+ resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.9':
+ resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.9':
+ resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.9.0':
+ resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.21.0':
+ resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.3.1':
+ resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.15.2':
+ resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.1':
+ resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.35.0':
+ resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.6':
+ resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.3.5':
+ resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@fontsource/roboto@5.2.9':
+ resolution: {integrity: sha512-ZTkyHiPk74B/aj8BZWbsxD5Yu+Lq+nR64eV4wirlrac2qXR7jYk2h6JlLYuOuoruTkGQWNw2fMuKNavw7/rg0w==}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.7':
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.30':
+ resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
+
+ '@mui/core-downloads-tracker@7.3.5':
+ resolution: {integrity: sha512-kOLwlcDPnVz2QMhiBv0OQ8le8hTCqKM9cRXlfVPL91l3RGeOsxrIhNRsUt3Xb8wb+pTVUolW+JXKym93vRKxCw==}
+
+ '@mui/material@7.3.5':
+ resolution: {integrity: sha512-8VVxFmp1GIm9PpmnQoCoYo0UWHoOrdA57tDL62vkpzEgvb/d71Wsbv4FRg7r1Gyx7PuSo0tflH34cdl/NvfHNQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@emotion/react': ^11.5.0
+ '@emotion/styled': ^11.3.0
+ '@mui/material-pigment-css': ^7.3.5
+ '@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
+ '@mui/material-pigment-css':
+ optional: true
+ '@types/react':
+ optional: true
+
+ '@mui/private-theming@7.3.5':
+ resolution: {integrity: sha512-cTx584W2qrLonwhZLbEN7P5pAUu0nZblg8cLBlTrZQ4sIiw8Fbvg7GvuphQaSHxPxrCpa7FDwJKtXdbl2TSmrA==}
+ engines: {node: '>=14.0.0'}
+ 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
+
+ '@mui/styled-engine@7.3.5':
+ resolution: {integrity: sha512-zbsZ0uYYPndFCCPp2+V3RLcAN6+fv4C8pdwRx6OS3BwDkRCN8WBehqks7hWyF3vj1kdQLIWrpdv/5Y0jHRxYXQ==}
+ engines: {node: '>=14.0.0'}
+ 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
+
+ '@mui/system@7.3.5':
+ resolution: {integrity: sha512-yPaf5+gY3v80HNkJcPi6WT+r9ebeM4eJzrREXPxMt7pNTV/1eahyODO4fbH3Qvd8irNxDFYn5RQ3idHW55rA6g==}
+ engines: {node: '>=14.0.0'}
+ 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
+
+ '@mui/types@7.4.8':
+ resolution: {integrity: sha512-ZNXLBjkPV6ftLCmmRCafak3XmSn8YV0tKE/ZOhzKys7TZXUiE0mZxlH8zKDo6j6TTUaDnuij68gIG+0Ucm7Xhw==}
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/utils@7.3.5':
+ resolution: {integrity: sha512-jisvFsEC3sgjUjcPnR4mYfhzjCDIudttSGSbe1o/IXFNu0kZuR+7vqQI0jg8qtcVZBHWrwTfvAZj9MNMumcq1g==}
+ engines: {node: '>=14.0.0'}
+ 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
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@popperjs/core@2.11.8':
+ resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
+
+ '@rolldown/pluginutils@1.0.0-beta.34':
+ resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==}
+
+ '@rollup/rollup-android-arm-eabi@4.50.1':
+ resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.50.1':
+ resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.50.1':
+ resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.50.1':
+ resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.50.1':
+ resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.50.1':
+ resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.50.1':
+ resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.50.1':
+ resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.50.1':
+ resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.50.1':
+ resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.50.1':
+ resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.50.1':
+ resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.50.1':
+ resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.50.1':
+ resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.50.1':
+ resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.50.1':
+ resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.50.1':
+ resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openharmony-arm64@4.50.1':
+ resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.50.1':
+ resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.50.1':
+ resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.50.1':
+ resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/node@4.1.17':
+ resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==}
+
+ '@tailwindcss/oxide-android-arm64@4.1.17':
+ resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.17':
+ resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.1.17':
+ resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.17':
+ resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17':
+ resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.17':
+ resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.17':
+ resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.17':
+ resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.17':
+ resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.17':
+ resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.17':
+ resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.17':
+ resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.1.17':
+ resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==}
+ engines: {node: '>= 10'}
+
+ '@tailwindcss/vite@4.1.17':
+ resolution: {integrity: sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7
+
+ '@tanstack/query-core@5.90.3':
+ resolution: {integrity: sha512-HtPOnCwmx4dd35PfXU8jjkhwYrsHfuqgC8RCJIwWglmhIUIlzPP0ZcEkDAc+UtAWCiLm7T8rxeEfHZlz3hYMCA==}
+
+ '@tanstack/react-query@5.90.3':
+ resolution: {integrity: sha512-i/LRL6DtuhG6bjGzavIMIVuKKPWx2AnEBIsBfuMm3YoHne0a20nWmsatOCBcVSaT0/8/5YFjNkebHAPLVUSi0Q==}
+ peerDependencies:
+ react: ^18 || ^19
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.27.0':
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
+ '@types/d3-array@3.2.2':
+ resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
+
+ '@types/d3-axis@3.0.6':
+ resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
+
+ '@types/d3-brush@3.0.6':
+ resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
+
+ '@types/d3-chord@3.0.6':
+ resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
+
+ '@types/d3-color@3.1.3':
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+ '@types/d3-contour@3.0.6':
+ resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
+
+ '@types/d3-delaunay@6.0.4':
+ resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==}
+
+ '@types/d3-dispatch@3.0.7':
+ resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
+
+ '@types/d3-drag@3.0.7':
+ resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
+
+ '@types/d3-dsv@3.0.7':
+ resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
+
+ '@types/d3-ease@3.0.2':
+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+ '@types/d3-fetch@3.0.7':
+ resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
+
+ '@types/d3-force@3.0.10':
+ resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
+
+ '@types/d3-format@3.0.4':
+ resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
+
+ '@types/d3-geo@3.1.0':
+ resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
+
+ '@types/d3-hierarchy@3.1.7':
+ resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
+
+ '@types/d3-interpolate@3.0.4':
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+ '@types/d3-path@3.1.1':
+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+
+ '@types/d3-polygon@3.0.2':
+ resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
+
+ '@types/d3-quadtree@3.0.6':
+ resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
+
+ '@types/d3-random@3.0.3':
+ resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
+
+ '@types/d3-scale-chromatic@3.1.0':
+ resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
+
+ '@types/d3-scale@4.0.9':
+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+
+ '@types/d3-selection@3.0.11':
+ resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
+
+ '@types/d3-shape@3.1.7':
+ resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
+
+ '@types/d3-time-format@4.0.3':
+ resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
+
+ '@types/d3-time@3.0.4':
+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
+
+ '@types/d3-timer@3.0.2':
+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+
+ '@types/d3-transition@3.0.9':
+ resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
+
+ '@types/d3-zoom@3.0.8':
+ resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
+
+ '@types/d3@7.4.3':
+ resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/geojson@7946.0.16':
+ resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/node@24.10.1':
+ resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==}
+
+ '@types/parse-json@4.0.2':
+ resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+ '@types/prop-types@15.7.15':
+ resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
+
+ '@types/react-dom@19.1.9':
+ resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==}
+ peerDependencies:
+ '@types/react': ^19.0.0
+
+ '@types/react-transition-group@4.4.12':
+ resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==}
+ peerDependencies:
+ '@types/react': '*'
+
+ '@types/react@19.1.12':
+ resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==}
+
+ '@typescript-eslint/eslint-plugin@8.43.0':
+ resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.43.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.43.0':
+ resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/project-service@8.43.0':
+ resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/scope-manager@8.43.0':
+ resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.43.0':
+ resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/type-utils@8.43.0':
+ resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/types@8.43.0':
+ resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.43.0':
+ resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/utils@8.43.0':
+ resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/visitor-keys@8.43.0':
+ resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@vitejs/plugin-react@5.0.2':
+ resolution: {integrity: sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.25.4:
+ resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ caniuse-lite@1.0.30001741:
+ resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie@1.0.2:
+ resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
+ engines: {node: '>=18'}
+
+ cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ d3-array@3.2.4:
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+ engines: {node: '>=12'}
+
+ d3-axis@3.0.0:
+ resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
+ engines: {node: '>=12'}
+
+ d3-brush@3.0.0:
+ resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
+ engines: {node: '>=12'}
+
+ d3-chord@3.0.1:
+ resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
+ engines: {node: '>=12'}
+
+ d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+
+ d3-contour@4.0.2:
+ resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
+ engines: {node: '>=12'}
+
+ d3-delaunay@6.0.4:
+ resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
+ engines: {node: '>=12'}
+
+ d3-dispatch@3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+
+ d3-drag@3.0.0:
+ resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+ engines: {node: '>=12'}
+
+ d3-dsv@3.0.1:
+ resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+
+ d3-fetch@3.0.1:
+ resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
+ engines: {node: '>=12'}
+
+ d3-force@3.0.0:
+ resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+ engines: {node: '>=12'}
+
+ d3-format@3.1.0:
+ resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
+ engines: {node: '>=12'}
+
+ d3-geo@3.1.1:
+ resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
+ engines: {node: '>=12'}
+
+ d3-hierarchy@3.1.2:
+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+
+ d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+
+ d3-path@3.1.0:
+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+ engines: {node: '>=12'}
+
+ d3-polygon@3.0.1:
+ resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
+ engines: {node: '>=12'}
+
+ d3-quadtree@3.0.1:
+ resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+ engines: {node: '>=12'}
+
+ d3-random@3.0.1:
+ resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
+ engines: {node: '>=12'}
+
+ d3-scale-chromatic@3.1.0:
+ resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
+ engines: {node: '>=12'}
+
+ d3-scale@4.0.2:
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+ engines: {node: '>=12'}
+
+ d3-selection@3.0.0:
+ resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+ engines: {node: '>=12'}
+
+ d3-shape@3.2.0:
+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+ engines: {node: '>=12'}
+
+ d3-time-format@4.1.0:
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+ engines: {node: '>=12'}
+
+ d3-time@3.1.0:
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+ engines: {node: '>=12'}
+
+ d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+
+ d3-transition@3.0.1:
+ resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ d3-selection: 2 - 3
+
+ d3-zoom@3.0.0:
+ resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+ engines: {node: '>=12'}
+
+ d3@7.9.0:
+ resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
+ engines: {node: '>=12'}
+
+ debug@4.4.1:
+ resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ delaunator@5.0.1:
+ resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ dom-helpers@5.2.1:
+ resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+
+ electron-to-chromium@1.5.215:
+ resolution: {integrity: sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==}
+
+ enhanced-resolve@5.18.3:
+ resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
+ engines: {node: '>=10.13.0'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ esbuild@0.25.9:
+ resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-plugin-react-hooks@5.2.0:
+ resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react-refresh@0.4.20:
+ resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==}
+ peerDependencies:
+ eslint: '>=8.40'
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.35.0:
+ resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@16.4.0:
+ resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==}
+ engines: {node: '>=18'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jiti@2.6.1:
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lightningcss-android-arm64@1.30.2:
+ resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.30.2:
+ resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.30.2:
+ resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.30.2:
+ resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.30.2:
+ resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.30.2:
+ resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.30.2:
+ resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.30.2:
+ resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.30.2:
+ resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.30.2:
+ resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.30.2:
+ resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.30.2:
+ resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
+ engines: {node: '>= 12.0.0'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ node-releases@2.0.20:
+ resolution: {integrity: sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ react-dom@19.1.1:
+ resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==}
+ peerDependencies:
+ react: ^19.1.1
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-is@19.2.0:
+ resolution: {integrity: sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==}
+
+ react-refresh@0.17.0:
+ resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
+ engines: {node: '>=0.10.0'}
+
+ react-router-dom@7.9.3:
+ resolution: {integrity: sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+
+ react-router@7.9.3:
+ resolution: {integrity: sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+
+ react-transition-group@4.4.5:
+ resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
+ peerDependencies:
+ react: '>=16.6.0'
+ react-dom: '>=16.6.0'
+
+ react@19.1.1:
+ resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ robust-predicates@3.0.2:
+ resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
+
+ rollup@4.50.1:
+ resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ rw@1.3.3:
+ resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ scheduler@0.26.0:
+ resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ set-cookie-parser@2.7.1:
+ resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ stylis@4.2.0:
+ resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ tailwindcss@4.1.17:
+ resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==}
+
+ tapable@2.3.0:
+ resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
+ engines: {node: '>=6'}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ ts-api-utils@2.1.0:
+ resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ typescript-eslint@8.43.0:
+ resolution: {integrity: sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ typescript@5.8.3:
+ resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ update-browserslist-db@1.1.3:
+ resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ vite@7.1.11:
+ resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ lightningcss: ^1.21.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+
+ yaml@2.8.1:
+ resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.27.1
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.28.4': {}
+
+ '@babel/core@7.28.4':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.3
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.4
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.1
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.28.3':
+ dependencies:
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.30
+ jsesc: 3.1.0
+
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.4
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.25.4
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.27.1': {}
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.27.1': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helpers@7.28.4':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.4
+
+ '@babel/parser@7.28.4':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/runtime@7.28.4': {}
+
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+
+ '@babel/traverse@7.28.4':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.3
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.4
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.4
+ debug: 4.4.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.28.4':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+
+ '@dnd-kit/accessibility@3.1.1(react@19.1.1)':
+ dependencies:
+ react: 19.1.1
+ tslib: 2.8.1
+
+ '@dnd-kit/core@6.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
+ dependencies:
+ '@dnd-kit/accessibility': 3.1.1(react@19.1.1)
+ '@dnd-kit/utilities': 3.2.2(react@19.1.1)
+ react: 19.1.1
+ react-dom: 19.1.1(react@19.1.1)
+ tslib: 2.8.1
+
+ '@dnd-kit/utilities@3.2.2(react@19.1.1)':
+ dependencies:
+ react: 19.1.1
+ tslib: 2.8.1
+
+ '@emotion/babel-plugin@11.13.5':
+ dependencies:
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/runtime': 7.28.4
+ '@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.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.2.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/cache@11.14.0':
+ 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
+
+ '@emotion/hash@0.9.2': {}
+
+ '@emotion/is-prop-valid@1.4.0':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+
+ '@emotion/memoize@0.9.0': {}
+
+ '@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@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(react@19.1.1)
+ '@emotion/utils': 1.4.2
+ '@emotion/weak-memoize': 0.4.0
+ hoist-non-react-statics: 3.3.2
+ react: 19.1.1
+ optionalDependencies:
+ '@types/react': 19.1.12
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/serialize@1.3.3':
+ dependencies:
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/unitless': 0.10.0
+ '@emotion/utils': 1.4.2
+ csstype: 3.1.3
+
+ '@emotion/sheet@1.4.0': {}
+
+ '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@emotion/babel-plugin': 11.13.5
+ '@emotion/is-prop-valid': 1.4.0
+ '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
+ '@emotion/serialize': 1.3.3
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.1)
+ '@emotion/utils': 1.4.2
+ react: 19.1.1
+ optionalDependencies:
+ '@types/react': 19.1.12
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/unitless@0.10.0': {}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.1)':
+ dependencies:
+ react: 19.1.1
+
+ '@emotion/utils@1.4.2': {}
+
+ '@emotion/weak-memoize@0.4.0': {}
+
+ '@esbuild/aix-ppc64@0.25.9':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/android-arm@0.25.9':
+ optional: true
+
+ '@esbuild/android-x64@0.25.9':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.9':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.9':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.9':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.9':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.9':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.9':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.9':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.9':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.9':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.9':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.9':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.9':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.9':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.9':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.9':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.9':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.6.1))':
+ dependencies:
+ eslint: 9.35.0(jiti@2.6.1)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.21.0':
+ dependencies:
+ '@eslint/object-schema': 2.1.6
+ debug: 4.4.1
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.3.1': {}
+
+ '@eslint/core@0.15.2':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.1':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.1
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.35.0': {}
+
+ '@eslint/object-schema@2.1.6': {}
+
+ '@eslint/plugin-kit@0.3.5':
+ dependencies:
+ '@eslint/core': 0.15.2
+ levn: 0.4.1
+
+ '@fontsource/roboto@5.2.9': {}
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.30
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.30
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.30':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@mui/core-downloads-tracker@7.3.5': {}
+
+ '@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@mui/core-downloads-tracker': 7.3.5
+ '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
+ '@mui/types': 7.4.8(@types/react@19.1.12)
+ '@mui/utils': 7.3.5(@types/react@19.1.12)(react@19.1.1)
+ '@popperjs/core': 2.11.8
+ '@types/react-transition-group': 4.4.12(@types/react@19.1.12)
+ clsx: 2.1.1
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ react: 19.1.1
+ react-dom: 19.1.1(react@19.1.1)
+ react-is: 19.2.0
+ react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ optionalDependencies:
+ '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
+ '@types/react': 19.1.12
+
+ '@mui/private-theming@7.3.5(@types/react@19.1.12)(react@19.1.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@mui/utils': 7.3.5(@types/react@19.1.12)(react@19.1.1)
+ prop-types: 15.8.1
+ react: 19.1.1
+ optionalDependencies:
+ '@types/react': 19.1.12
+
+ '@mui/styled-engine@7.3.5(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@emotion/cache': 11.14.0
+ '@emotion/serialize': 1.3.3
+ '@emotion/sheet': 1.4.0
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ react: 19.1.1
+ optionalDependencies:
+ '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
+
+ '@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@mui/private-theming': 7.3.5(@types/react@19.1.12)(react@19.1.1)
+ '@mui/styled-engine': 7.3.5(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(react@19.1.1)
+ '@mui/types': 7.4.8(@types/react@19.1.12)
+ '@mui/utils': 7.3.5(@types/react@19.1.12)(react@19.1.1)
+ clsx: 2.1.1
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ react: 19.1.1
+ optionalDependencies:
+ '@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
+ '@types/react': 19.1.12
+
+ '@mui/types@7.4.8(@types/react@19.1.12)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ optionalDependencies:
+ '@types/react': 19.1.12
+
+ '@mui/utils@7.3.5(@types/react@19.1.12)(react@19.1.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@mui/types': 7.4.8(@types/react@19.1.12)
+ '@types/prop-types': 15.7.15
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 19.1.1
+ react-is: 19.2.0
+ optionalDependencies:
+ '@types/react': 19.1.12
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+
+ '@popperjs/core@2.11.8': {}
+
+ '@rolldown/pluginutils@1.0.0-beta.34': {}
+
+ '@rollup/rollup-android-arm-eabi@4.50.1':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.50.1':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.50.1':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.50.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.50.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.50.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.50.1':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.50.1':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.50.1':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.50.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.50.1':
+ optional: true
+
+ '@tailwindcss/node@4.1.17':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.18.3
+ jiti: 2.6.1
+ lightningcss: 1.30.2
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.1.17
+
+ '@tailwindcss/oxide-android-arm64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide@4.1.17':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.1.17
+ '@tailwindcss/oxide-darwin-arm64': 4.1.17
+ '@tailwindcss/oxide-darwin-x64': 4.1.17
+ '@tailwindcss/oxide-freebsd-x64': 4.1.17
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17
+ '@tailwindcss/oxide-linux-arm64-musl': 4.1.17
+ '@tailwindcss/oxide-linux-x64-gnu': 4.1.17
+ '@tailwindcss/oxide-linux-x64-musl': 4.1.17
+ '@tailwindcss/oxide-wasm32-wasi': 4.1.17
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17
+ '@tailwindcss/oxide-win32-x64-msvc': 4.1.17
+
+ '@tailwindcss/vite@4.1.17(vite@7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1))':
+ dependencies:
+ '@tailwindcss/node': 4.1.17
+ '@tailwindcss/oxide': 4.1.17
+ tailwindcss: 4.1.17
+ vite: 7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1)
+
+ '@tanstack/query-core@5.90.3': {}
+
+ '@tanstack/react-query@5.90.3(react@19.1.1)':
+ dependencies:
+ '@tanstack/query-core': 5.90.3
+ react: 19.1.1
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
+
+ '@types/babel__generator@7.27.0':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+
+ '@types/babel__traverse@7.28.0':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@types/d3-array@3.2.2': {}
+
+ '@types/d3-axis@3.0.6':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-brush@3.0.6':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-chord@3.0.6': {}
+
+ '@types/d3-color@3.1.3': {}
+
+ '@types/d3-contour@3.0.6':
+ dependencies:
+ '@types/d3-array': 3.2.2
+ '@types/geojson': 7946.0.16
+
+ '@types/d3-delaunay@6.0.4': {}
+
+ '@types/d3-dispatch@3.0.7': {}
+
+ '@types/d3-drag@3.0.7':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-dsv@3.0.7': {}
+
+ '@types/d3-ease@3.0.2': {}
+
+ '@types/d3-fetch@3.0.7':
+ dependencies:
+ '@types/d3-dsv': 3.0.7
+
+ '@types/d3-force@3.0.10': {}
+
+ '@types/d3-format@3.0.4': {}
+
+ '@types/d3-geo@3.1.0':
+ dependencies:
+ '@types/geojson': 7946.0.16
+
+ '@types/d3-hierarchy@3.1.7': {}
+
+ '@types/d3-interpolate@3.0.4':
+ dependencies:
+ '@types/d3-color': 3.1.3
+
+ '@types/d3-path@3.1.1': {}
+
+ '@types/d3-polygon@3.0.2': {}
+
+ '@types/d3-quadtree@3.0.6': {}
+
+ '@types/d3-random@3.0.3': {}
+
+ '@types/d3-scale-chromatic@3.1.0': {}
+
+ '@types/d3-scale@4.0.9':
+ dependencies:
+ '@types/d3-time': 3.0.4
+
+ '@types/d3-selection@3.0.11': {}
+
+ '@types/d3-shape@3.1.7':
+ dependencies:
+ '@types/d3-path': 3.1.1
+
+ '@types/d3-time-format@4.0.3': {}
+
+ '@types/d3-time@3.0.4': {}
+
+ '@types/d3-timer@3.0.2': {}
+
+ '@types/d3-transition@3.0.9':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-zoom@3.0.8':
+ dependencies:
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3@7.4.3':
+ dependencies:
+ '@types/d3-array': 3.2.2
+ '@types/d3-axis': 3.0.6
+ '@types/d3-brush': 3.0.6
+ '@types/d3-chord': 3.0.6
+ '@types/d3-color': 3.1.3
+ '@types/d3-contour': 3.0.6
+ '@types/d3-delaunay': 6.0.4
+ '@types/d3-dispatch': 3.0.7
+ '@types/d3-drag': 3.0.7
+ '@types/d3-dsv': 3.0.7
+ '@types/d3-ease': 3.0.2
+ '@types/d3-fetch': 3.0.7
+ '@types/d3-force': 3.0.10
+ '@types/d3-format': 3.0.4
+ '@types/d3-geo': 3.1.0
+ '@types/d3-hierarchy': 3.1.7
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-path': 3.1.1
+ '@types/d3-polygon': 3.0.2
+ '@types/d3-quadtree': 3.0.6
+ '@types/d3-random': 3.0.3
+ '@types/d3-scale': 4.0.9
+ '@types/d3-scale-chromatic': 3.1.0
+ '@types/d3-selection': 3.0.11
+ '@types/d3-shape': 3.1.7
+ '@types/d3-time': 3.0.4
+ '@types/d3-time-format': 4.0.3
+ '@types/d3-timer': 3.0.2
+ '@types/d3-transition': 3.0.9
+ '@types/d3-zoom': 3.0.8
+
+ '@types/estree@1.0.8': {}
+
+ '@types/geojson@7946.0.16': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/node@24.10.1':
+ dependencies:
+ undici-types: 7.16.0
+
+ '@types/parse-json@4.0.2': {}
+
+ '@types/prop-types@15.7.15': {}
+
+ '@types/react-dom@19.1.9(@types/react@19.1.12)':
+ dependencies:
+ '@types/react': 19.1.12
+
+ '@types/react-transition-group@4.4.12(@types/react@19.1.12)':
+ dependencies:
+ '@types/react': 19.1.12
+
+ '@types/react@19.1.12':
+ dependencies:
+ csstype: 3.1.3
+
+ '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ '@typescript-eslint/scope-manager': 8.43.0
+ '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ '@typescript-eslint/visitor-keys': 8.43.0
+ eslint: 9.35.0(jiti@2.6.1)
+ graphemer: 1.4.0
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.1.0(typescript@5.8.3)
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.43.0
+ '@typescript-eslint/types': 8.43.0
+ '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3)
+ '@typescript-eslint/visitor-keys': 8.43.0
+ debug: 4.4.1
+ eslint: 9.35.0(jiti@2.6.1)
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.43.0(typescript@5.8.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.8.3)
+ '@typescript-eslint/types': 8.43.0
+ debug: 4.4.1
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.43.0':
+ dependencies:
+ '@typescript-eslint/types': 8.43.0
+ '@typescript-eslint/visitor-keys': 8.43.0
+
+ '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.8.3)':
+ dependencies:
+ typescript: 5.8.3
+
+ '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.43.0
+ '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3)
+ '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ debug: 4.4.1
+ eslint: 9.35.0(jiti@2.6.1)
+ ts-api-utils: 2.1.0(typescript@5.8.3)
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.43.0': {}
+
+ '@typescript-eslint/typescript-estree@8.43.0(typescript@5.8.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.43.0(typescript@5.8.3)
+ '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.8.3)
+ '@typescript-eslint/types': 8.43.0
+ '@typescript-eslint/visitor-keys': 8.43.0
+ debug: 4.4.1
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.7.2
+ ts-api-utils: 2.1.0(typescript@5.8.3)
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.6.1))
+ '@typescript-eslint/scope-manager': 8.43.0
+ '@typescript-eslint/types': 8.43.0
+ '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3)
+ eslint: 9.35.0(jiti@2.6.1)
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.43.0':
+ dependencies:
+ '@typescript-eslint/types': 8.43.0
+ eslint-visitor-keys: 4.2.1
+
+ '@vitejs/plugin-react@5.0.2(vite@7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1))':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4)
+ '@rolldown/pluginutils': 1.0.0-beta.34
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.17.0
+ vite: 7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ acorn-jsx@5.3.2(acorn@8.15.0):
+ dependencies:
+ acorn: 8.15.0
+
+ acorn@8.15.0: {}
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ argparse@2.0.1: {}
+
+ babel-plugin-macros@3.1.0:
+ dependencies:
+ '@babel/runtime': 7.28.4
+ cosmiconfig: 7.1.0
+ resolve: 1.22.11
+
+ balanced-match@1.0.2: {}
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.25.4:
+ dependencies:
+ caniuse-lite: 1.0.30001741
+ electron-to-chromium: 1.5.215
+ node-releases: 2.0.20
+ update-browserslist-db: 1.1.3(browserslist@4.25.4)
+
+ callsites@3.1.0: {}
+
+ caniuse-lite@1.0.30001741: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ clsx@2.1.1: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ commander@7.2.0: {}
+
+ concat-map@0.0.1: {}
+
+ convert-source-map@1.9.0: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie@1.0.2: {}
+
+ cosmiconfig@7.1.0:
+ dependencies:
+ '@types/parse-json': 4.0.2
+ import-fresh: 3.3.1
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ csstype@3.1.3: {}
+
+ d3-array@3.2.4:
+ dependencies:
+ internmap: 2.0.3
+
+ d3-axis@3.0.0: {}
+
+ d3-brush@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+
+ d3-chord@3.0.1:
+ dependencies:
+ d3-path: 3.1.0
+
+ d3-color@3.1.0: {}
+
+ d3-contour@4.0.2:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-delaunay@6.0.4:
+ dependencies:
+ delaunator: 5.0.1
+
+ d3-dispatch@3.0.1: {}
+
+ d3-drag@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-selection: 3.0.0
+
+ d3-dsv@3.0.1:
+ dependencies:
+ commander: 7.2.0
+ iconv-lite: 0.6.3
+ rw: 1.3.3
+
+ d3-ease@3.0.1: {}
+
+ d3-fetch@3.0.1:
+ dependencies:
+ d3-dsv: 3.0.1
+
+ d3-force@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+
+ d3-format@3.1.0: {}
+
+ d3-geo@3.1.1:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-hierarchy@3.1.2: {}
+
+ d3-interpolate@3.0.1:
+ dependencies:
+ d3-color: 3.1.0
+
+ d3-path@3.1.0: {}
+
+ d3-polygon@3.0.1: {}
+
+ d3-quadtree@3.0.1: {}
+
+ d3-random@3.0.1: {}
+
+ d3-scale-chromatic@3.1.0:
+ dependencies:
+ d3-color: 3.1.0
+ d3-interpolate: 3.0.1
+
+ d3-scale@4.0.2:
+ dependencies:
+ d3-array: 3.2.4
+ d3-format: 3.1.0
+ d3-interpolate: 3.0.1
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+
+ d3-selection@3.0.0: {}
+
+ d3-shape@3.2.0:
+ dependencies:
+ d3-path: 3.1.0
+
+ d3-time-format@4.1.0:
+ dependencies:
+ d3-time: 3.1.0
+
+ d3-time@3.1.0:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-timer@3.0.1: {}
+
+ d3-transition@3.0.1(d3-selection@3.0.0):
+ dependencies:
+ d3-color: 3.1.0
+ d3-dispatch: 3.0.1
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-timer: 3.0.1
+
+ d3-zoom@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+
+ d3@7.9.0:
+ dependencies:
+ d3-array: 3.2.4
+ d3-axis: 3.0.0
+ d3-brush: 3.0.0
+ d3-chord: 3.0.1
+ d3-color: 3.1.0
+ d3-contour: 4.0.2
+ d3-delaunay: 6.0.4
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-dsv: 3.0.1
+ d3-ease: 3.0.1
+ d3-fetch: 3.0.1
+ d3-force: 3.0.0
+ d3-format: 3.1.0
+ d3-geo: 3.1.1
+ d3-hierarchy: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-path: 3.1.0
+ d3-polygon: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-random: 3.0.1
+ d3-scale: 4.0.2
+ d3-scale-chromatic: 3.1.0
+ d3-selection: 3.0.0
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ d3-timer: 3.0.1
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ d3-zoom: 3.0.0
+
+ debug@4.4.1:
+ dependencies:
+ ms: 2.1.3
+
+ deep-is@0.1.4: {}
+
+ delaunator@5.0.1:
+ dependencies:
+ robust-predicates: 3.0.2
+
+ detect-libc@2.1.2: {}
+
+ dom-helpers@5.2.1:
+ dependencies:
+ '@babel/runtime': 7.28.4
+ csstype: 3.1.3
+
+ electron-to-chromium@1.5.215: {}
+
+ enhanced-resolve@5.18.3:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.0
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ esbuild@0.25.9:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.9
+ '@esbuild/android-arm': 0.25.9
+ '@esbuild/android-arm64': 0.25.9
+ '@esbuild/android-x64': 0.25.9
+ '@esbuild/darwin-arm64': 0.25.9
+ '@esbuild/darwin-x64': 0.25.9
+ '@esbuild/freebsd-arm64': 0.25.9
+ '@esbuild/freebsd-x64': 0.25.9
+ '@esbuild/linux-arm': 0.25.9
+ '@esbuild/linux-arm64': 0.25.9
+ '@esbuild/linux-ia32': 0.25.9
+ '@esbuild/linux-loong64': 0.25.9
+ '@esbuild/linux-mips64el': 0.25.9
+ '@esbuild/linux-ppc64': 0.25.9
+ '@esbuild/linux-riscv64': 0.25.9
+ '@esbuild/linux-s390x': 0.25.9
+ '@esbuild/linux-x64': 0.25.9
+ '@esbuild/netbsd-arm64': 0.25.9
+ '@esbuild/netbsd-x64': 0.25.9
+ '@esbuild/openbsd-arm64': 0.25.9
+ '@esbuild/openbsd-x64': 0.25.9
+ '@esbuild/openharmony-arm64': 0.25.9
+ '@esbuild/sunos-x64': 0.25.9
+ '@esbuild/win32-arm64': 0.25.9
+ '@esbuild/win32-ia32': 0.25.9
+ '@esbuild/win32-x64': 0.25.9
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-plugin-react-hooks@5.2.0(eslint@9.35.0(jiti@2.6.1)):
+ dependencies:
+ eslint: 9.35.0(jiti@2.6.1)
+
+ eslint-plugin-react-refresh@0.4.20(eslint@9.35.0(jiti@2.6.1)):
+ dependencies:
+ eslint: 9.35.0(jiti@2.6.1)
+
+ eslint-scope@8.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint@9.35.0(jiti@2.6.1):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.6.1))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.21.0
+ '@eslint/config-helpers': 0.3.1
+ '@eslint/core': 0.15.2
+ '@eslint/eslintrc': 3.3.1
+ '@eslint/js': 9.35.0
+ '@eslint/plugin-kit': 0.3.5
+ '@humanfs/node': 0.16.7
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.1
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.6.1
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 4.2.1
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.19.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-root@1.1.0: {}
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+
+ flatted@3.3.3: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ globals@14.0.0: {}
+
+ globals@16.4.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ has-flag@4.0.0: {}
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hoist-non-react-statics@3.3.2:
+ dependencies:
+ react-is: 16.13.1
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ internmap@2.0.3: {}
+
+ is-arrayish@0.2.1: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-extglob@2.1.1: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-number@7.0.0: {}
+
+ isexe@2.0.0: {}
+
+ jiti@2.6.1: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@2.2.3: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lightningcss-android-arm64@1.30.2:
+ optional: true
+
+ lightningcss-darwin-arm64@1.30.2:
+ optional: true
+
+ lightningcss-darwin-x64@1.30.2:
+ optional: true
+
+ lightningcss-freebsd-x64@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.30.2:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.30.2:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.30.2:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.30.2:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.30.2:
+ optional: true
+
+ lightningcss@1.30.2:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.30.2
+ lightningcss-darwin-arm64: 1.30.2
+ lightningcss-darwin-x64: 1.30.2
+ lightningcss-freebsd-x64: 1.30.2
+ lightningcss-linux-arm-gnueabihf: 1.30.2
+ lightningcss-linux-arm64-gnu: 1.30.2
+ lightningcss-linux-arm64-musl: 1.30.2
+ lightningcss-linux-x64-gnu: 1.30.2
+ lightningcss-linux-x64-musl: 1.30.2
+ lightningcss-win32-arm64-msvc: 1.30.2
+ lightningcss-win32-x64-msvc: 1.30.2
+
+ lines-and-columns@1.2.4: {}
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.merge@4.6.2: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.11: {}
+
+ natural-compare@1.4.0: {}
+
+ node-releases@2.0.20: {}
+
+ object-assign@4.1.1: {}
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-type@4.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.3: {}
+
+ postcss@8.5.6:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ react-dom@19.1.1(react@19.1.1):
+ dependencies:
+ react: 19.1.1
+ scheduler: 0.26.0
+
+ react-is@16.13.1: {}
+
+ react-is@19.2.0: {}
+
+ react-refresh@0.17.0: {}
+
+ react-router-dom@7.9.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
+ dependencies:
+ react: 19.1.1
+ react-dom: 19.1.1(react@19.1.1)
+ react-router: 7.9.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+
+ react-router@7.9.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
+ dependencies:
+ cookie: 1.0.2
+ react: 19.1.1
+ set-cookie-parser: 2.7.1
+ optionalDependencies:
+ react-dom: 19.1.1(react@19.1.1)
+
+ react-transition-group@4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
+ dependencies:
+ '@babel/runtime': 7.28.4
+ dom-helpers: 5.2.1
+ loose-envify: 1.4.0
+ prop-types: 15.8.1
+ react: 19.1.1
+ react-dom: 19.1.1(react@19.1.1)
+
+ react@19.1.1: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve@1.22.11:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ reusify@1.1.0: {}
+
+ robust-predicates@3.0.2: {}
+
+ rollup@4.50.1:
+ dependencies:
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.50.1
+ '@rollup/rollup-android-arm64': 4.50.1
+ '@rollup/rollup-darwin-arm64': 4.50.1
+ '@rollup/rollup-darwin-x64': 4.50.1
+ '@rollup/rollup-freebsd-arm64': 4.50.1
+ '@rollup/rollup-freebsd-x64': 4.50.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.50.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.50.1
+ '@rollup/rollup-linux-arm64-gnu': 4.50.1
+ '@rollup/rollup-linux-arm64-musl': 4.50.1
+ '@rollup/rollup-linux-loongarch64-gnu': 4.50.1
+ '@rollup/rollup-linux-ppc64-gnu': 4.50.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.50.1
+ '@rollup/rollup-linux-riscv64-musl': 4.50.1
+ '@rollup/rollup-linux-s390x-gnu': 4.50.1
+ '@rollup/rollup-linux-x64-gnu': 4.50.1
+ '@rollup/rollup-linux-x64-musl': 4.50.1
+ '@rollup/rollup-openharmony-arm64': 4.50.1
+ '@rollup/rollup-win32-arm64-msvc': 4.50.1
+ '@rollup/rollup-win32-ia32-msvc': 4.50.1
+ '@rollup/rollup-win32-x64-msvc': 4.50.1
+ fsevents: 2.3.3
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ rw@1.3.3: {}
+
+ safer-buffer@2.1.2: {}
+
+ scheduler@0.26.0: {}
+
+ semver@6.3.1: {}
+
+ semver@7.7.2: {}
+
+ set-cookie-parser@2.7.1: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.5.7: {}
+
+ strip-json-comments@3.1.1: {}
+
+ stylis@4.2.0: {}
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ tailwindcss@4.1.17: {}
+
+ tapable@2.3.0: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ ts-api-utils@2.1.0(typescript@5.8.3):
+ dependencies:
+ typescript: 5.8.3
+
+ tslib@2.8.1: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ typescript-eslint@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3)
+ '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.6.1))(typescript@5.8.3)
+ eslint: 9.35.0(jiti@2.6.1)
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.8.3: {}
+
+ undici-types@7.16.0: {}
+
+ update-browserslist-db@1.1.3(browserslist@4.25.4):
+ dependencies:
+ browserslist: 4.25.4
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ vite@7.1.11(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1):
+ dependencies:
+ esbuild: 0.25.9
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.50.1
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 24.10.1
+ fsevents: 2.3.3
+ jiti: 2.6.1
+ lightningcss: 1.30.2
+ yaml: 2.8.1
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ yallist@3.1.1: {}
+
+ yaml@1.10.2: {}
+
+ yaml@2.8.1: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/client/public/Projects/DummyProject/file-graph-data-test-large.json b/client/public/Projects/DummyProject/file-graph-data-test-large.json
new file mode 100644
index 0000000..717c7a3
--- /dev/null
+++ b/client/public/Projects/DummyProject/file-graph-data-test-large.json
@@ -0,0 +1,340 @@
+{
+ "nodes": [
+ {"id": "file_1", "group": "file", "value": 2},
+ {"id": "file_2", "group": "file", "value": 2},
+ {"id": "file_3", "group": "file", "value": 2},
+ {"id": "file_4", "group": "file", "value": 2},
+ {"id": "file_5", "group": "file", "value": 2},
+ {"id": "file_6", "group": "file", "value": 2},
+ {"id": "file_7", "group": "file", "value": 2},
+ {"id": "file_8", "group": "file", "value": 2},
+ {"id": "file_9", "group": "file", "value": 2},
+ {"id": "file_10", "group": "file", "value": 3},
+ {"id": "file_11", "group": "file", "value": 4},
+ {"id": "file_12", "group": "file", "value": 4},
+ {"id": "file_13", "group": "file", "value": 2},
+ {"id": "file_14", "group": "file", "value": 2},
+ {"id": "file_15", "group": "file", "value": 2},
+ {"id": "file_16", "group": "file", "value": 2},
+ {"id": "file_17", "group": "file", "value": 2},
+ {"id": "file_18", "group": "file", "value": 2},
+ {"id": "file_19", "group": "file", "value": 2},
+ {"id": "file_20", "group": "file", "value": 2},
+ {"id": "file_21", "group": "file", "value": 2},
+ {"id": "file_22", "group": "file", "value": 3},
+ {"id": "file_23", "group": "file", "value": 4},
+ {"id": "file_24", "group": "file", "value": 8},
+ {"id": "file_25", "group": "file", "value": 2},
+ {"id": "file_26", "group": "file", "value": 2},
+ {"id": "file_27", "group": "file", "value": 2},
+ {"id": "file_28", "group": "file", "value": 3},
+ {"id": "file_29", "group": "file", "value": 2},
+ {"id": "file_30", "group": "file", "value": 2},
+ {"id": "file_31", "group": "file", "value": 2},
+ {"id": "file_32", "group": "file", "value": 2},
+ {"id": "file_33", "group": "file", "value": 2},
+ {"id": "file_34", "group": "file", "value": 3},
+ {"id": "file_35", "group": "file", "value": 5},
+ {"id": "file_36", "group": "file", "value": 2},
+ {"id": "file_37", "group": "file", "value": 2},
+ {"id": "file_38", "group": "file", "value": 2},
+ {"id": "file_39", "group": "file", "value": 2},
+ {"id": "file_40", "group": "file", "value": 2},
+ {"id": "file_41", "group": "file", "value": 2},
+ {"id": "file_42", "group": "file", "value": 4},
+ {"id": "file_43", "group": "file", "value": 2},
+ {"id": "file_44", "group": "file", "value": 2},
+ {"id": "file_45", "group": "file", "value": 2},
+ {"id": "file_46", "group": "file", "value": 2},
+ {"id": "file_47", "group": "file", "value": 2},
+ {"id": "file_48", "group": "file", "value": 2},
+ {"id": "file_49", "group": "file", "value": 3},
+ {"id": "file_50", "group": "file", "value": 7},
+ {"id": "file_51", "group": "file", "value": 2},
+ {"id": "file_52", "group": "file", "value": 2},
+ {"id": "file_53", "group": "file", "value": 2},
+ {"id": "file_54", "group": "file", "value": 2},
+ {"id": "file_55", "group": "file", "value": 5},
+ {"id": "file_56", "group": "file", "value": 4},
+ {"id": "file_57", "group": "file", "value": 2},
+ {"id": "file_58", "group": "file", "value": 2},
+ {"id": "file_59", "group": "file", "value": 2},
+ {"id": "file_60", "group": "file", "value": 2},
+ {"id": "file_61", "group": "file", "value": 2},
+ {"id": "file_62", "group": "file", "value": 2},
+ {"id": "file_63", "group": "file", "value": 3},
+ {"id": "file_64", "group": "file", "value": 2},
+ {"id": "file_65", "group": "file", "value": 2},
+ {"id": "file_66", "group": "file", "value": 2},
+ {"id": "file_67", "group": "file", "value": 2},
+ {"id": "file_68", "group": "file", "value": 2},
+ {"id": "file_69", "group": "file", "value": 2},
+ {"id": "file_70", "group": "file", "value": 4},
+ {"id": "file_71", "group": "file", "value": 2},
+ {"id": "file_72", "group": "file", "value": 6},
+ {"id": "file_73", "group": "file", "value": 2},
+ {"id": "file_74", "group": "file", "value": 2},
+ {"id": "file_75", "group": "file", "value": 2},
+ {"id": "file_76", "group": "file", "value": 2},
+ {"id": "file_77", "group": "file", "value": 2},
+ {"id": "file_78", "group": "file", "value": 5},
+ {"id": "file_79", "group": "file", "value": 2},
+ {"id": "file_80", "group": "file", "value": 2},
+ {"id": "file_81", "group": "file", "value": 2},
+ {"id": "file_82", "group": "file", "value": 2},
+ {"id": "file_83", "group": "file", "value": 2},
+ {"id": "file_84", "group": "file", "value": 4},
+ {"id": "file_85", "group": "file", "value": 2},
+ {"id": "file_86", "group": "file", "value": 2},
+ {"id": "file_87", "group": "file", "value": 2},
+ {"id": "file_88", "group": "file", "value": 7},
+ {"id": "file_89", "group": "file", "value": 2},
+ {"id": "file_90", "group": "file", "value": 2},
+ {"id": "file_91", "group": "file", "value": 3},
+ {"id": "file_92", "group": "file", "value": 2},
+ {"id": "file_93", "group": "file", "value": 2},
+ {"id": "file_94", "group": "file", "value": 2},
+ {"id": "file_95", "group": "file", "value": 2},
+ {"id": "file_96", "group": "file", "value": 2},
+ {"id": "file_97", "group": "file", "value": 2},
+ {"id": "file_98", "group": "file", "value": 4},
+ {"id": "file_99", "group": "file", "value": 2},
+ {"id": "file_100", "group": "file", "value": 8}
+ ],
+ "links": [
+ {"source": "file_4", "target": "file_2", "value": 1},
+ {"source": "file_4", "target": "file_3", "value": 1},
+ {"source": "file_4", "target": "file_1", "value": 1},
+ {"source": "file_4", "target": "file_6", "value": 1},
+ {"source": "file_4", "target": "issue_2", "value": 1},
+ {"source": "file_6", "target": "file_1", "value": 1},
+ {"source": "file_6", "target": "file_3", "value": 1},
+ {"source": "file_6", "target": "file_5", "value": 1},
+ {"source": "file_7", "target": "file_8", "value": 2},
+ {"source": "file_8", "target": "file_9", "value": 2},
+ {"source": "file_9", "target": "file_10", "value": 2},
+ {"source": "file_9", "target": "file_22", "value": 2},
+ {"source": "file_10", "target": "file_11", "value": 3},
+ {"source": "file_11", "target": "file_12", "value": 4},
+ {"source": "file_23", "target": "issue_1", "value": 4},
+ {"source": "file_23", "target": "file_24", "value": 4},
+ {"source": "file_12", "target": "file_13", "value": 1},
+ {"source": "file_13", "target": "file_14", "value": 1},
+ {"source": "file_14", "target": "file_15", "value": 1},
+ {"source": "file_15", "target": "file_16", "value": 1},
+ {"source": "file_16", "target": "file_17", "value": 1},
+ {"source": "file_17", "target": "file_18", "value": 1},
+ {"source": "file_18", "target": "file_19", "value": 1},
+ {"source": "file_19", "target": "file_20", "value": 1},
+ {"source": "file_20", "target": "file_21", "value": 2},
+ {"source": "file_21", "target": "file_22", "value": 2},
+ {"source": "file_22", "target": "file_23", "value": 2},
+ {"source": "file_23", "target": "file_24", "value": 2},
+ {"source": "file_24", "target": "file_25", "value": 2},
+ {"source": "file_25", "target": "file_26", "value": 2},
+ {"source": "file_26", "target": "file_27", "value": 2},
+ {"source": "file_27", "target": "file_28", "value": 2},
+ {"source": "file_28", "target": "file_29", "value": 2},
+ {"source": "file_29", "target": "file_30", "value": 2},
+ {"source": "file_30", "target": "file_31", "value": 2},
+ {"source": "file_31", "target": "file_32", "value": 2},
+ {"source": "file_32", "target": "file_33", "value": 2},
+ {"source": "file_33", "target": "file_34", "value": 2},
+ {"source": "file_34", "target": "file_35", "value": 2},
+ {"source": "file_35", "target": "file_36", "value": 2},
+ {"source": "file_36", "target": "file_37", "value": 2},
+ {"source": "file_37", "target": "file_38", "value": 2},
+ {"source": "file_38", "target": "file_39", "value": 2},
+ {"source": "file_39", "target": "file_40", "value": 2},
+ {"source": "file_24", "target": "file_13", "value": 2},
+ {"source": "file_24", "target": "file_14", "value": 2},
+ {"source": "file_24", "target": "file_15", "value": 2},
+ {"source": "file_24", "target": "file_16", "value": 2},
+ {"source": "file_24", "target": "file_17", "value": 2},
+ {"source": "file_24", "target": "file_18", "value": 2},
+ {"source": "file_24", "target": "file_19", "value": 2},
+ {"source": "file_24", "target": "file_20", "value": 2},
+ {"source": "file_24", "target": "file_21", "value": 2},
+ {"source": "file_24", "target": "file_22", "value": 2},
+ {"source": "file_24", "target": "file_25", "value": 3},
+ {"source": "file_24", "target": "file_26", "value": 3},
+ {"source": "file_24", "target": "file_27", "value": 3},
+ {"source": "file_24", "target": "file_28", "value": 3},
+ {"source": "file_24", "target": "file_29", "value": 3},
+ {"source": "file_24", "target": "file_30", "value": 3},
+ {"source": "file_24", "target": "file_31", "value": 3},
+ {"source": "file_24", "target": "file_32", "value": 3},
+ {"source": "file_50", "target": "file_33", "value": 2},
+ {"source": "file_50", "target": "file_34", "value": 2},
+ {"source": "file_50", "target": "file_35", "value": 2},
+ {"source": "file_50", "target": "file_36", "value": 2},
+ {"source": "file_50", "target": "file_37", "value": 2},
+ {"source": "file_50", "target": "file_38", "value": 2},
+ {"source": "file_50", "target": "file_39", "value": 2},
+ {"source": "file_50", "target": "file_40", "value": 2},
+ {"source": "file_50", "target": "file_41", "value": 2},
+ {"source": "file_50", "target": "file_42", "value": 2},
+ {"source": "file_50", "target": "file_43", "value": 2},
+ {"source": "file_50", "target": "file_44", "value": 2},
+ {"source": "file_50", "target": "file_45", "value": 3},
+ {"source": "file_50", "target": "file_46", "value": 3},
+ {"source": "file_50", "target": "file_47", "value": 3},
+ {"source": "file_50", "target": "file_48", "value": 3},
+ {"source": "file_50", "target": "file_49", "value": 3},
+ {"source": "file_50", "target": "file_51", "value": 3},
+ {"source": "file_50", "target": "file_52", "value": 3},
+ {"source": "file_50", "target": "file_53", "value": 3},
+ {"source": "file_50", "target": "file_54", "value": 3},
+ {"source": "file_50", "target": "file_55", "value": 3},
+ {"source": "file_40", "target": "file_42", "value": 2},
+ {"source": "file_41", "target": "file_43", "value": 1},
+ {"source": "file_42", "target": "file_44", "value": 2},
+ {"source": "file_43", "target": "file_45", "value": 1},
+ {"source": "file_44", "target": "file_46", "value": 2},
+ {"source": "file_45", "target": "file_47", "value": 1},
+ {"source": "file_46", "target": "file_48", "value": 2},
+ {"source": "file_47", "target": "file_49", "value": 1},
+ {"source": "file_48", "target": "file_50", "value": 2},
+ {"source": "file_49", "target": "file_51", "value": 1},
+ {"source": "file_50", "target": "file_52", "value": 2},
+ {"source": "file_51", "target": "file_53", "value": 1},
+ {"source": "file_52", "target": "file_54", "value": 2},
+ {"source": "file_53", "target": "file_55", "value": 1},
+ {"source": "file_54", "target": "file_56", "value": 2},
+ {"source": "file_55", "target": "file_57", "value": 1},
+ {"source": "file_56", "target": "file_58", "value": 2},
+ {"source": "file_57", "target": "file_59", "value": 1},
+ {"source": "file_58", "target": "file_60", "value": 2},
+ {"source": "file_59", "target": "file_61", "value": 1},
+ {"source": "file_24", "target": "issue_3", "value": 3},
+ {"source": "file_37", "target": "issue_3", "value": 3},
+ {"source": "file_50", "target": "issue_3", "value": 3},
+ {"source": "file_58", "target": "issue_3", "value": 3},
+ {"source": "file_63", "target": "issue_3", "value": 3},
+ {"source": "file_72", "target": "issue_3", "value": 3},
+ {"source": "file_88", "target": "issue_3", "value": 3},
+ {"source": "file_100", "target": "issue_3", "value": 3},
+ {"source": "file_4", "target": "issue_2", "value": 2},
+ {"source": "file_6", "target": "issue_2", "value": 2},
+ {"source": "file_18", "target": "issue_2", "value": 2},
+ {"source": "file_33", "target": "issue_2", "value": 2},
+ {"source": "file_41", "target": "issue_2", "value": 2},
+ {"source": "file_57", "target": "issue_2", "value": 2},
+ {"source": "file_75", "target": "issue_2", "value": 2},
+ {"source": "file_23", "target": "issue_1", "value": 3},
+ {"source": "file_24", "target": "issue_1", "value": 3},
+ {"source": "file_45", "target": "issue_1", "value": 3},
+ {"source": "file_50", "target": "issue_1", "value": 3},
+ {"source": "file_67", "target": "issue_1", "value": 3},
+ {"source": "file_88", "target": "issue_1", "value": 3},
+ {"source": "file_60", "target": "file_61", "value": 1},
+ {"source": "file_60", "target": "file_65", "value": 2},
+ {"source": "file_61", "target": "file_62", "value": 1},
+ {"source": "file_61", "target": "file_66", "value": 2},
+ {"source": "file_62", "target": "file_63", "value": 1},
+ {"source": "file_62", "target": "file_67", "value": 2},
+ {"source": "file_63", "target": "file_64", "value": 1},
+ {"source": "file_63", "target": "file_68", "value": 2},
+ {"source": "file_64", "target": "file_65", "value": 1},
+ {"source": "file_64", "target": "file_69", "value": 2},
+ {"source": "file_65", "target": "file_66", "value": 1},
+ {"source": "file_65", "target": "file_70", "value": 2},
+ {"source": "file_66", "target": "file_67", "value": 1},
+ {"source": "file_66", "target": "file_71", "value": 2},
+ {"source": "file_67", "target": "file_68", "value": 1},
+ {"source": "file_67", "target": "file_72", "value": 2},
+ {"source": "file_68", "target": "file_69", "value": 1},
+ {"source": "file_68", "target": "file_73", "value": 2},
+ {"source": "file_69", "target": "file_70", "value": 1},
+ {"source": "file_69", "target": "file_74", "value": 2},
+ {"source": "file_70", "target": "file_71", "value": 1},
+ {"source": "file_70", "target": "file_75", "value": 2},
+ {"source": "file_71", "target": "file_72", "value": 1},
+ {"source": "file_71", "target": "file_76", "value": 2},
+ {"source": "file_72", "target": "file_73", "value": 1},
+ {"source": "file_72", "target": "file_77", "value": 2},
+ {"source": "file_73", "target": "file_74", "value": 1},
+ {"source": "file_73", "target": "file_78", "value": 2},
+ {"source": "file_74", "target": "file_75", "value": 1},
+ {"source": "file_74", "target": "file_79", "value": 2},
+ {"source": "file_75", "target": "file_76", "value": 1},
+ {"source": "file_75", "target": "file_80", "value": 2},
+ {"source": "file_76", "target": "file_77", "value": 1},
+ {"source": "file_77", "target": "file_78", "value": 1},
+ {"source": "file_78", "target": "file_79", "value": 1},
+ {"source": "file_79", "target": "file_80", "value": 1},
+ {"source": "file_72", "target": "file_61", "value": 2},
+ {"source": "file_72", "target": "file_62", "value": 2},
+ {"source": "file_72", "target": "file_63", "value": 2},
+ {"source": "file_72", "target": "file_64", "value": 2},
+ {"source": "file_72", "target": "file_65", "value": 2},
+ {"source": "file_72", "target": "file_66", "value": 2},
+ {"source": "file_72", "target": "file_67", "value": 2},
+ {"source": "file_72", "target": "file_68", "value": 2},
+ {"source": "file_72", "target": "file_69", "value": 2},
+ {"source": "file_72", "target": "file_70", "value": 2},
+ {"source": "file_72", "target": "file_71", "value": 2},
+ {"source": "file_72", "target": "file_73", "value": 2},
+ {"source": "file_72", "target": "file_74", "value": 2},
+ {"source": "file_72", "target": "file_75", "value": 2},
+ {"source": "file_72", "target": "file_76", "value": 2},
+ {"source": "file_72", "target": "file_77", "value": 2},
+ {"source": "file_72", "target": "file_78", "value": 2},
+ {"source": "file_72", "target": "file_79", "value": 2},
+ {"source": "file_72", "target": "file_80", "value": 2},
+ {"source": "file_72", "target": "file_81", "value": 2},
+ {"source": "file_72", "target": "file_82", "value": 2},
+ {"source": "file_80", "target": "file_81", "value": 2},
+ {"source": "file_81", "target": "file_82", "value": 2},
+ {"source": "file_82", "target": "file_83", "value": 2},
+ {"source": "file_83", "target": "file_84", "value": 2},
+ {"source": "file_84", "target": "file_85", "value": 2},
+ {"source": "file_85", "target": "file_86", "value": 2},
+ {"source": "file_86", "target": "file_87", "value": 2},
+ {"source": "file_87", "target": "file_88", "value": 2},
+ {"source": "file_88", "target": "file_89", "value": 2},
+ {"source": "file_89", "target": "file_90", "value": 2},
+ {"source": "file_90", "target": "file_91", "value": 3},
+ {"source": "file_91", "target": "file_92", "value": 3},
+ {"source": "file_92", "target": "file_93", "value": 3},
+ {"source": "file_93", "target": "file_94", "value": 3},
+ {"source": "file_94", "target": "file_95", "value": 3},
+ {"source": "file_95", "target": "file_96", "value": 3},
+ {"source": "file_96", "target": "file_97", "value": 3},
+ {"source": "file_97", "target": "file_98", "value": 3},
+ {"source": "file_98", "target": "file_99", "value": 3},
+ {"source": "file_99", "target": "file_100", "value": 3},
+ {"source": "file_82", "target": "file_84", "value": 2},
+ {"source": "file_84", "target": "file_86", "value": 2},
+ {"source": "file_82", "target": "file_86", "value": 1},
+ {"source": "file_85", "target": "file_87", "value": 2},
+ {"source": "file_87", "target": "file_89", "value": 2},
+ {"source": "file_85", "target": "file_89", "value": 1},
+ {"source": "file_90", "target": "file_92", "value": 2},
+ {"source": "file_92", "target": "file_94", "value": 2},
+ {"source": "file_90", "target": "file_94", "value": 1},
+ {"source": "file_93", "target": "file_95", "value": 2},
+ {"source": "file_95", "target": "file_97", "value": 2},
+ {"source": "file_93", "target": "file_97", "value": 1},
+ {"source": "file_96", "target": "file_98", "value": 2},
+ {"source": "file_98", "target": "file_100", "value": 2},
+ {"source": "file_96", "target": "file_100", "value": 1},
+ {"source": "file_88", "target": "file_83", "value": 3},
+ {"source": "file_88", "target": "file_84", "value": 3},
+ {"source": "file_88", "target": "file_85", "value": 3},
+ {"source": "file_88", "target": "file_86", "value": 3},
+ {"source": "file_88", "target": "file_87", "value": 3},
+ {"source": "file_88", "target": "file_89", "value": 3},
+ {"source": "file_88", "target": "file_90", "value": 3},
+ {"source": "file_88", "target": "file_91", "value": 3},
+ {"source": "file_88", "target": "file_92", "value": 3},
+ {"source": "file_88", "target": "file_93", "value": 3},
+ {"source": "file_88", "target": "file_94", "value": 3},
+ {"source": "file_88", "target": "file_95", "value": 3},
+ {"source": "file_88", "target": "file_96", "value": 3},
+ {"source": "file_88", "target": "file_97", "value": 3},
+ {"source": "file_88", "target": "file_98", "value": 3},
+ {"source": "file_88", "target": "file_99", "value": 3},
+ {"source": "file_88", "target": "file_100", "value": 3}
+ ]
+}
\ No newline at end of file
diff --git a/client/public/Projects/DummyProject/file-graph-data.json b/client/public/Projects/DummyProject/file-graph-data.json
new file mode 100644
index 0000000..71a4c6a
--- /dev/null
+++ b/client/public/Projects/DummyProject/file-graph-data.json
@@ -0,0 +1,340 @@
+{
+ "nodes": [
+ {"id": "file_1", "group": "file", "value": 2},
+ {"id": "file_2", "group": "file", "value": 2},
+ {"id": "file_3", "group": "file", "value": 2},
+ {"id": "file_4", "group": "file", "value": 2},
+ {"id": "file_5", "group": "file", "value": 2},
+ {"id": "file_6", "group": "file", "value": 2},
+ {"id": "file_7", "group": "file", "value": 2},
+ {"id": "file_8", "group": "file", "value": 2},
+ {"id": "file_9", "group": "file", "value": 2},
+ {"id": "file_10", "group": "file", "value": 3},
+ {"id": "file_11", "group": "file", "value": 4},
+ {"id": "file_12", "group": "file", "value": 4},
+ {"id": "file_13", "group": "file", "value": 2},
+ {"id": "file_14", "group": "file", "value": 2},
+ {"id": "file_15", "group": "file", "value": 2},
+ {"id": "file_16", "group": "file", "value": 2},
+ {"id": "file_17", "group": "file", "value": 2},
+ {"id": "file_18", "group": "file", "value": 2},
+ {"id": "file_19", "group": "file", "value": 2},
+ {"id": "file_20", "group": "file", "value": 2},
+ {"id": "file_21", "group": "file", "value": 2},
+ {"id": "file_22", "group": "file", "value": 3},
+ {"id": "file_23", "group": "file", "value": 4},
+ {"id": "file_24", "group": "file", "value": 8},
+ {"id": "file_25", "group": "file", "value": 2},
+ {"id": "file_26", "group": "file", "value": 2},
+ {"id": "file_27", "group": "file", "value": 2},
+ {"id": "file_28", "group": "file", "value": 3},
+ {"id": "file_29", "group": "file", "value": 2},
+ {"id": "file_30", "group": "file", "value": 2},
+ {"id": "file_31", "group": "file", "value": 2},
+ {"id": "file_32", "group": "file", "value": 2},
+ {"id": "file_33", "group": "file", "value": 2},
+ {"id": "file_34", "group": "file", "value": 3},
+ {"id": "file_35", "group": "file", "value": 5},
+ {"id": "file_36", "group": "file", "value": 2},
+ {"id": "file_37", "group": "file", "value": 2},
+ {"id": "file_38", "group": "file", "value": 2},
+ {"id": "file_39", "group": "file", "value": 2},
+ {"id": "file_40", "group": "file", "value": 2},
+ {"id": "file_41", "group": "file", "value": 2},
+ {"id": "file_42", "group": "file", "value": 4},
+ {"id": "file_43", "group": "file", "value": 2},
+ {"id": "file_44", "group": "file", "value": 2},
+ {"id": "file_45", "group": "file", "value": 2},
+ {"id": "file_46", "group": "file", "value": 2},
+ {"id": "file_47", "group": "file", "value": 2},
+ {"id": "file_48", "group": "file", "value": 2},
+ {"id": "file_49", "group": "file", "value": 3},
+ {"id": "file_50", "group": "file", "value": 7},
+ {"id": "file_51", "group": "file", "value": 2},
+ {"id": "file_52", "group": "file", "value": 2},
+ {"id": "file_53", "group": "file", "value": 2},
+ {"id": "file_54", "group": "file", "value": 2},
+ {"id": "file_55", "group": "file", "value": 5},
+ {"id": "file_56", "group": "file", "value": 4},
+ {"id": "file_57", "group": "file", "value": 2},
+ {"id": "file_58", "group": "file", "value": 2},
+ {"id": "file_59", "group": "file", "value": 2},
+ {"id": "file_60", "group": "file", "value": 2},
+ {"id": "file_61", "group": "file", "value": 2},
+ {"id": "file_62", "group": "file", "value": 2},
+ {"id": "file_63", "group": "file", "value": 3},
+ {"id": "file_64", "group": "file", "value": 2},
+ {"id": "file_65", "group": "file", "value": 2},
+ {"id": "file_66", "group": "file", "value": 2},
+ {"id": "file_67", "group": "file", "value": 2},
+ {"id": "file_68", "group": "file", "value": 2},
+ {"id": "file_69", "group": "file", "value": 2},
+ {"id": "file_70", "group": "file", "value": 4},
+ {"id": "file_71", "group": "file", "value": 2},
+ {"id": "file_72", "group": "file", "value": 6},
+ {"id": "file_73", "group": "file", "value": 2},
+ {"id": "file_74", "group": "file", "value": 2},
+ {"id": "file_75", "group": "file", "value": 2},
+ {"id": "file_76", "group": "file", "value": 2},
+ {"id": "file_77", "group": "file", "value": 2},
+ {"id": "file_78", "group": "file", "value": 5},
+ {"id": "file_79", "group": "file", "value": 2},
+ {"id": "file_80", "group": "file", "value": 2},
+ {"id": "file_81", "group": "file", "value": 2},
+ {"id": "file_82", "group": "file", "value": 2},
+ {"id": "file_83", "group": "file", "value": 2},
+ {"id": "file_84", "group": "file", "value": 4},
+ {"id": "file_85", "group": "file", "value": 2},
+ {"id": "file_86", "group": "file", "value": 2},
+ {"id": "file_87", "group": "file", "value": 2},
+ {"id": "file_88", "group": "file", "value": 7},
+ {"id": "file_89", "group": "file", "value": 2},
+ {"id": "file_90", "group": "file", "value": 2},
+ {"id": "file_91", "group": "file", "value": 3},
+ {"id": "file_92", "group": "file", "value": 2},
+ {"id": "file_93", "group": "file", "value": 2},
+ {"id": "file_94", "group": "file", "value": 2},
+ {"id": "file_95", "group": "file", "value": 2},
+ {"id": "file_96", "group": "file", "value": 2},
+ {"id": "file_97", "group": "file", "value": 2},
+ {"id": "file_98", "group": "file", "value": 4},
+ {"id": "file_99", "group": "file", "value": 2},
+ {"id": "file_100", "group": "file", "value": 8}
+ ],
+ "links": [
+ {"source": "file_4", "target": "file_2", "value": 1},
+ {"source": "file_4", "target": "file_3", "value": 1},
+ {"source": "file_4", "target": "file_1", "value": 1},
+ {"source": "file_4", "target": "file_6", "value": 1},
+ {"source": "file_4", "target": "issue_2", "value": 1},
+ {"source": "file_6", "target": "file_1", "value": 1},
+ {"source": "file_6", "target": "file_3", "value": 1},
+ {"source": "file_6", "target": "file_5", "value": 1},
+ {"source": "file_7", "target": "file_8", "value": 2},
+ {"source": "file_8", "target": "file_9", "value": 2},
+ {"source": "file_9", "target": "file_10", "value": 2},
+ {"source": "file_9", "target": "file_22", "value": 2},
+ {"source": "file_10", "target": "file_11", "value": 3},
+ {"source": "file_11", "target": "file_12", "value": 4},
+ {"source": "file_23", "target": "issue_1", "value": 4},
+ {"source": "file_23", "target": "file_24", "value": 4},
+ {"source": "file_12", "target": "file_13", "value": 1},
+ {"source": "file_13", "target": "file_14", "value": 1},
+ {"source": "file_14", "target": "file_15", "value": 1},
+ {"source": "file_15", "target": "file_16", "value": 1},
+ {"source": "file_16", "target": "file_17", "value": 1},
+ {"source": "file_17", "target": "file_18", "value": 1},
+ {"source": "file_18", "target": "file_19", "value": 1},
+ {"source": "file_19", "target": "file_20", "value": 1},
+ {"source": "file_20", "target": "file_21", "value": 2},
+ {"source": "file_21", "target": "file_22", "value": 2},
+ {"source": "file_22", "target": "file_23", "value": 2},
+ {"source": "file_23", "target": "file_24", "value": 2},
+ {"source": "file_24", "target": "file_25", "value": 2},
+ {"source": "file_25", "target": "file_26", "value": 2},
+ {"source": "file_26", "target": "file_27", "value": 2},
+ {"source": "file_27", "target": "file_28", "value": 2},
+ {"source": "file_28", "target": "file_29", "value": 2},
+ {"source": "file_29", "target": "file_30", "value": 2},
+ {"source": "file_30", "target": "file_31", "value": 2},
+ {"source": "file_31", "target": "file_32", "value": 2},
+ {"source": "file_32", "target": "file_33", "value": 2},
+ {"source": "file_33", "target": "file_34", "value": 2},
+ {"source": "file_34", "target": "file_35", "value": 2},
+ {"source": "file_35", "target": "file_36", "value": 2},
+ {"source": "file_36", "target": "file_37", "value": 2},
+ {"source": "file_37", "target": "file_38", "value": 2},
+ {"source": "file_38", "target": "file_39", "value": 2},
+ {"source": "file_39", "target": "file_40", "value": 2},
+ {"source": "file_24", "target": "file_13", "value": 2},
+ {"source": "file_24", "target": "file_14", "value": 2},
+ {"source": "file_24", "target": "file_15", "value": 2},
+ {"source": "file_24", "target": "file_16", "value": 2},
+ {"source": "file_24", "target": "file_17", "value": 2},
+ {"source": "file_24", "target": "file_18", "value": 2},
+ {"source": "file_24", "target": "file_19", "value": 2},
+ {"source": "file_24", "target": "file_20", "value": 2},
+ {"source": "file_24", "target": "file_21", "value": 2},
+ {"source": "file_24", "target": "file_22", "value": 2},
+ {"source": "file_24", "target": "file_25", "value": 3},
+ {"source": "file_24", "target": "file_26", "value": 3},
+ {"source": "file_24", "target": "file_27", "value": 3},
+ {"source": "file_24", "target": "file_28", "value": 3},
+ {"source": "file_24", "target": "file_29", "value": 3},
+ {"source": "file_24", "target": "file_30", "value": 3},
+ {"source": "file_24", "target": "file_31", "value": 3},
+ {"source": "file_24", "target": "file_32", "value": 3},
+ {"source": "file_50", "target": "file_33", "value": 2},
+ {"source": "file_50", "target": "file_34", "value": 2},
+ {"source": "file_50", "target": "file_35", "value": 2},
+ {"source": "file_50", "target": "file_36", "value": 2},
+ {"source": "file_50", "target": "file_37", "value": 2},
+ {"source": "file_50", "target": "file_38", "value": 2},
+ {"source": "file_50", "target": "file_39", "value": 2},
+ {"source": "file_50", "target": "file_40", "value": 2},
+ {"source": "file_50", "target": "file_41", "value": 2},
+ {"source": "file_50", "target": "file_42", "value": 2},
+ {"source": "file_50", "target": "file_43", "value": 2},
+ {"source": "file_50", "target": "file_44", "value": 2},
+ {"source": "file_50", "target": "file_45", "value": 3},
+ {"source": "file_50", "target": "file_46", "value": 3},
+ {"source": "file_50", "target": "file_47", "value": 3},
+ {"source": "file_50", "target": "file_48", "value": 3},
+ {"source": "file_50", "target": "file_49", "value": 3},
+ {"source": "file_50", "target": "file_51", "value": 3},
+ {"source": "file_50", "target": "file_52", "value": 3},
+ {"source": "file_50", "target": "file_53", "value": 3},
+ {"source": "file_50", "target": "file_54", "value": 3},
+ {"source": "file_50", "target": "file_55", "value": 3},
+ {"source": "file_40", "target": "file_42", "value": 2},
+ {"source": "file_41", "target": "file_43", "value": 1},
+ {"source": "file_42", "target": "file_44", "value": 2},
+ {"source": "file_43", "target": "file_45", "value": 1},
+ {"source": "file_44", "target": "file_46", "value": 2},
+ {"source": "file_45", "target": "file_47", "value": 1},
+ {"source": "file_46", "target": "file_48", "value": 2},
+ {"source": "file_47", "target": "file_49", "value": 1},
+ {"source": "file_48", "target": "file_50", "value": 2},
+ {"source": "file_49", "target": "file_51", "value": 1},
+ {"source": "file_50", "target": "file_52", "value": 2},
+ {"source": "file_51", "target": "file_53", "value": 1},
+ {"source": "file_52", "target": "file_54", "value": 2},
+ {"source": "file_53", "target": "file_55", "value": 1},
+ {"source": "file_54", "target": "file_56", "value": 2},
+ {"source": "file_55", "target": "file_57", "value": 1},
+ {"source": "file_56", "target": "file_58", "value": 2},
+ {"source": "file_57", "target": "file_59", "value": 1},
+ {"source": "file_58", "target": "file_60", "value": 2},
+ {"source": "file_59", "target": "file_61", "value": 1},
+ {"source": "file_24", "target": "issue_3", "value": 3},
+ {"source": "file_37", "target": "issue_3", "value": 3},
+ {"source": "file_50", "target": "issue_3", "value": 3},
+ {"source": "file_58", "target": "issue_3", "value": 3},
+ {"source": "file_63", "target": "issue_3", "value": 3},
+ {"source": "file_72", "target": "issue_3", "value": 3},
+ {"source": "file_88", "target": "issue_3", "value": 3},
+ {"source": "file_100", "target": "issue_3", "value": 3},
+ {"source": "file_4", "target": "issue_2", "value": 2},
+ {"source": "file_6", "target": "issue_2", "value": 2},
+ {"source": "file_18", "target": "issue_2", "value": 2},
+ {"source": "file_33", "target": "issue_2", "value": 2},
+ {"source": "file_41", "target": "issue_2", "value": 2},
+ {"source": "file_57", "target": "issue_2", "value": 2},
+ {"source": "file_75", "target": "issue_2", "value": 2},
+ {"source": "file_23", "target": "issue_1", "value": 3},
+ {"source": "file_24", "target": "issue_1", "value": 3},
+ {"source": "file_45", "target": "issue_1", "value": 3},
+ {"source": "file_50", "target": "issue_1", "value": 3},
+ {"source": "file_67", "target": "issue_1", "value": 3},
+ {"source": "file_88", "target": "issue_1", "value": 3},
+ {"source": "file_60", "target": "file_61", "value": 1},
+ {"source": "file_60", "target": "file_65", "value": 2},
+ {"source": "file_61", "target": "file_62", "value": 1},
+ {"source": "file_61", "target": "file_66", "value": 2},
+ {"source": "file_62", "target": "file_63", "value": 1},
+ {"source": "file_62", "target": "file_67", "value": 2},
+ {"source": "file_63", "target": "file_64", "value": 1},
+ {"source": "file_63", "target": "file_68", "value": 2},
+ {"source": "file_64", "target": "file_65", "value": 1},
+ {"source": "file_64", "target": "file_69", "value": 2},
+ {"source": "file_65", "target": "file_66", "value": 1},
+ {"source": "file_65", "target": "file_70", "value": 2},
+ {"source": "file_66", "target": "file_67", "value": 1},
+ {"source": "file_66", "target": "file_71", "value": 2},
+ {"source": "file_67", "target": "file_68", "value": 1},
+ {"source": "file_67", "target": "file_72", "value": 2},
+ {"source": "file_68", "target": "file_69", "value": 1},
+ {"source": "file_68", "target": "file_73", "value": 2},
+ {"source": "file_69", "target": "file_70", "value": 1},
+ {"source": "file_69", "target": "file_74", "value": 2},
+ {"source": "file_70", "target": "file_71", "value": 1},
+ {"source": "file_70", "target": "file_75", "value": 2},
+ {"source": "file_71", "target": "file_72", "value": 1},
+ {"source": "file_71", "target": "file_76", "value": 2},
+ {"source": "file_72", "target": "file_73", "value": 1},
+ {"source": "file_72", "target": "file_77", "value": 2},
+ {"source": "file_73", "target": "file_74", "value": 1},
+ {"source": "file_73", "target": "file_78", "value": 2},
+ {"source": "file_74", "target": "file_75", "value": 1},
+ {"source": "file_74", "target": "file_79", "value": 2},
+ {"source": "file_75", "target": "file_76", "value": 1},
+ {"source": "file_75", "target": "file_80", "value": 2},
+ {"source": "file_76", "target": "file_77", "value": 1},
+ {"source": "file_77", "target": "file_78", "value": 1},
+ {"source": "file_78", "target": "file_79", "value": 1},
+ {"source": "file_79", "target": "file_80", "value": 1},
+ {"source": "file_72", "target": "file_61", "value": 2},
+ {"source": "file_72", "target": "file_62", "value": 2},
+ {"source": "file_72", "target": "file_63", "value": 2},
+ {"source": "file_72", "target": "file_64", "value": 2},
+ {"source": "file_72", "target": "file_65", "value": 2},
+ {"source": "file_72", "target": "file_66", "value": 2},
+ {"source": "file_72", "target": "file_67", "value": 2},
+ {"source": "file_72", "target": "file_68", "value": 2},
+ {"source": "file_72", "target": "file_69", "value": 2},
+ {"source": "file_72", "target": "file_70", "value": 2},
+ {"source": "file_72", "target": "file_71", "value": 2},
+ {"source": "file_72", "target": "file_73", "value": 2},
+ {"source": "file_72", "target": "file_74", "value": 2},
+ {"source": "file_72", "target": "file_75", "value": 2},
+ {"source": "file_72", "target": "file_76", "value": 2},
+ {"source": "file_72", "target": "file_77", "value": 2},
+ {"source": "file_72", "target": "file_78", "value": 2},
+ {"source": "file_72", "target": "file_79", "value": 2},
+ {"source": "file_72", "target": "file_80", "value": 2},
+ {"source": "file_72", "target": "file_81", "value": 2},
+ {"source": "file_72", "target": "file_82", "value": 2},
+ {"source": "file_80", "target": "file_81", "value": 2},
+ {"source": "file_81", "target": "file_82", "value": 2},
+ {"source": "file_82", "target": "file_83", "value": 2},
+ {"source": "file_83", "target": "file_84", "value": 2},
+ {"source": "file_84", "target": "file_85", "value": 2},
+ {"source": "file_85", "target": "file_86", "value": 2},
+ {"source": "file_86", "target": "file_87", "value": 2},
+ {"source": "file_87", "target": "file_88", "value": 2},
+ {"source": "file_88", "target": "file_89", "value": 2},
+ {"source": "file_89", "target": "file_90", "value": 2},
+ {"source": "file_90", "target": "file_91", "value": 3},
+ {"source": "file_91", "target": "file_92", "value": 3},
+ {"source": "file_92", "target": "file_93", "value": 3},
+ {"source": "file_93", "target": "file_94", "value": 3},
+ {"source": "file_94", "target": "file_95", "value": 3},
+ {"source": "file_95", "target": "file_96", "value": 3},
+ {"source": "file_96", "target": "file_97", "value": 3},
+ {"source": "file_97", "target": "file_98", "value": 3},
+ {"source": "file_98", "target": "file_99", "value": 3},
+ {"source": "file_99", "target": "file_100", "value": 3},
+ {"source": "file_82", "target": "file_84", "value": 2},
+ {"source": "file_84", "target": "file_86", "value": 2},
+ {"source": "file_82", "target": "file_86", "value": 1},
+ {"source": "file_85", "target": "file_87", "value": 2},
+ {"source": "file_87", "target": "file_89", "value": 2},
+ {"source": "file_85", "target": "file_89", "value": 1},
+ {"source": "file_90", "target": "file_92", "value": 2},
+ {"source": "file_92", "target": "file_94", "value": 2},
+ {"source": "file_90", "target": "file_94", "value": 1},
+ {"source": "file_93", "target": "file_95", "value": 2},
+ {"source": "file_95", "target": "file_97", "value": 2},
+ {"source": "file_93", "target": "file_97", "value": 1},
+ {"source": "file_96", "target": "file_98", "value": 2},
+ {"source": "file_98", "target": "file_100", "value": 2},
+ {"source": "file_96", "target": "file_100", "value": 1},
+ {"source": "file_88", "target": "file_83", "value": 3},
+ {"source": "file_88", "target": "file_84", "value": 3},
+ {"source": "file_88", "target": "file_85", "value": 3},
+ {"source": "file_88", "target": "file_86", "value": 3},
+ {"source": "file_88", "target": "file_87", "value": 3},
+ {"source": "file_88", "target": "file_89", "value": 3},
+ {"source": "file_88", "target": "file_90", "value": 3},
+ {"source": "file_88", "target": "file_91", "value": 3},
+ {"source": "file_88", "target": "file_92", "value": 3},
+ {"source": "file_88", "target": "file_93", "value": 3},
+ {"source": "file_88", "target": "file_94", "value": 3},
+ {"source": "file_88", "target": "file_95", "value": 3},
+ {"source": "file_88", "target": "file_96", "value": 3},
+ {"source": "file_88", "target": "file_97", "value": 3},
+ {"source": "file_88", "target": "file_98", "value": 3},
+ {"source": "file_88", "target": "file_99", "value": 3},
+ {"source": "file_88", "target": "file_100", "value": 3}
+ ]
+}
diff --git a/client/public/Projects/DummyProject/issue-graph-data.json b/client/public/Projects/DummyProject/issue-graph-data.json
new file mode 100644
index 0000000..9ca6cbe
--- /dev/null
+++ b/client/public/Projects/DummyProject/issue-graph-data.json
@@ -0,0 +1,11 @@
+{
+ "nodes": [
+ { "id": "issue_1", "group": "issue", "value": 4 },
+ { "id": "issue_2", "group": "issue", "value": 2 },
+ { "id": "issue_3", "group": "issue", "value": 2 }
+ ],
+ "links": [
+ { "source": "issue_1", "target": "issue_2", "value": 1 },
+ { "source": "issue_2", "target": "issue_3", "value": 1 }
+ ]
+}
diff --git a/client/public/Projects/DummyProject/mail-graph-data-test-large.json b/client/public/Projects/DummyProject/mail-graph-data-test-large.json
new file mode 100644
index 0000000..8da2d4b
--- /dev/null
+++ b/client/public/Projects/DummyProject/mail-graph-data-test-large.json
@@ -0,0 +1,320 @@
+{
+ "nodes": [
+ { "id": "mail_1", "group": "mail", "value": 2 },
+ { "id": "mail_2", "group": "mail", "value": 2 },
+ { "id": "mail_3", "group": "mail", "value": 2 },
+ { "id": "mail_4", "group": "mail", "value": 2 },
+ { "id": "mail_5", "group": "mail", "value": 2 },
+ { "id": "mail_6", "group": "mail", "value": 2 },
+ { "id": "mail_7", "group": "mail", "value": 2 },
+ { "id": "mail_8", "group": "mail", "value": 2 },
+
+ { "id": "mail_9", "group": "mail", "value": 2 },
+ { "id": "mail_10", "group": "mail", "value": 3 },
+ { "id": "mail_11", "group": "mail", "value": 2 },
+ { "id": "mail_12", "group": "mail", "value": 2 },
+ { "id": "mail_13", "group": "mail", "value": 2 },
+ { "id": "mail_14", "group": "mail", "value": 3 },
+ { "id": "mail_15", "group": "mail", "value": 2 },
+ { "id": "mail_16", "group": "mail", "value": 2 },
+ { "id": "mail_17", "group": "mail", "value": 2 },
+ { "id": "mail_18", "group": "mail", "value": 2 },
+ { "id": "mail_19", "group": "mail", "value": 2 },
+ { "id": "mail_20", "group": "mail", "value": 3 },
+ { "id": "mail_21", "group": "mail", "value": 2 },
+ { "id": "mail_22", "group": "mail", "value": 4 },
+ { "id": "mail_23", "group": "mail", "value": 2 },
+ { "id": "mail_24", "group": "mail", "value": 6 },
+ { "id": "mail_25", "group": "mail", "value": 2 },
+ { "id": "mail_26", "group": "mail", "value": 2 },
+ { "id": "mail_27", "group": "mail", "value": 2 },
+ { "id": "mail_28", "group": "mail", "value": 3 },
+ { "id": "mail_29", "group": "mail", "value": 2 },
+ { "id": "mail_30", "group": "mail", "value": 2 },
+ { "id": "mail_31", "group": "mail", "value": 2 },
+ { "id": "mail_32", "group": "mail", "value": 2 },
+ { "id": "mail_33", "group": "mail", "value": 2 },
+ { "id": "mail_34", "group": "mail", "value": 3 },
+ { "id": "mail_35", "group": "mail", "value": 5 },
+ { "id": "mail_36", "group": "mail", "value": 2 },
+ { "id": "mail_37", "group": "mail", "value": 2 },
+ { "id": "mail_38", "group": "mail", "value": 2 },
+ { "id": "mail_39", "group": "mail", "value": 2 },
+ { "id": "mail_40", "group": "mail", "value": 2 },
+ { "id": "mail_41", "group": "mail", "value": 2 },
+ { "id": "mail_42", "group": "mail", "value": 4 },
+ { "id": "mail_43", "group": "mail", "value": 2 },
+ { "id": "mail_44", "group": "mail", "value": 2 },
+ { "id": "mail_45", "group": "mail", "value": 2 },
+ { "id": "mail_46", "group": "mail", "value": 2 },
+ { "id": "mail_47", "group": "mail", "value": 2 },
+ { "id": "mail_48", "group": "mail", "value": 2 },
+ { "id": "mail_49", "group": "mail", "value": 3 },
+ { "id": "mail_50", "group": "mail", "value": 7 },
+
+ { "id": "mail_51", "group": "mail", "value": 2 },
+ { "id": "mail_52", "group": "mail", "value": 2 },
+ { "id": "mail_53", "group": "mail", "value": 2 },
+ { "id": "mail_54", "group": "mail", "value": 2 },
+ { "id": "mail_55", "group": "mail", "value": 5 },
+ { "id": "mail_56", "group": "mail", "value": 4 },
+ { "id": "mail_57", "group": "mail", "value": 2 },
+ { "id": "mail_58", "group": "mail", "value": 2 },
+ { "id": "mail_59", "group": "mail", "value": 2 },
+ { "id": "mail_60", "group": "mail", "value": 2 },
+ { "id": "mail_61", "group": "mail", "value": 2 },
+ { "id": "mail_62", "group": "mail", "value": 2 },
+ { "id": "mail_63", "group": "mail", "value": 3 },
+ { "id": "mail_64", "group": "mail", "value": 2 },
+ { "id": "mail_65", "group": "mail", "value": 2 },
+ { "id": "mail_66", "group": "mail", "value": 2 },
+ { "id": "mail_67", "group": "mail", "value": 2 },
+ { "id": "mail_68", "group": "mail", "value": 2 },
+ { "id": "mail_69", "group": "mail", "value": 2 },
+ { "id": "mail_70", "group": "mail", "value": 4 },
+ { "id": "mail_71", "group": "mail", "value": 2 },
+ { "id": "mail_72", "group": "mail", "value": 6 },
+ { "id": "mail_73", "group": "mail", "value": 2 },
+ { "id": "mail_74", "group": "mail", "value": 2 },
+ { "id": "mail_75", "group": "mail", "value": 2 },
+ { "id": "mail_76", "group": "mail", "value": 2 },
+ { "id": "mail_77", "group": "mail", "value": 2 },
+ { "id": "mail_78", "group": "mail", "value": 5 },
+ { "id": "mail_79", "group": "mail", "value": 2 },
+ { "id": "mail_80", "group": "mail", "value": 2 },
+ { "id": "mail_81", "group": "mail", "value": 2 },
+ { "id": "mail_82", "group": "mail", "value": 2 },
+ { "id": "mail_83", "group": "mail", "value": 2 },
+ { "id": "mail_84", "group": "mail", "value": 4 },
+ { "id": "mail_85", "group": "mail", "value": 2 },
+ { "id": "mail_86", "group": "mail", "value": 2 },
+ { "id": "mail_87", "group": "mail", "value": 2 },
+ { "id": "mail_88", "group": "mail", "value": 7 },
+ { "id": "mail_89", "group": "mail", "value": 2 },
+ { "id": "mail_90", "group": "mail", "value": 2 },
+ { "id": "mail_91", "group": "mail", "value": 3 },
+ { "id": "mail_92", "group": "mail", "value": 2 },
+ { "id": "mail_93", "group": "mail", "value": 2 },
+ { "id": "mail_94", "group": "mail", "value": 2 },
+ { "id": "mail_95", "group": "mail", "value": 2 },
+ { "id": "mail_96", "group": "mail", "value": 2 },
+ { "id": "mail_97", "group": "mail", "value": 2 },
+ { "id": "mail_98", "group": "mail", "value": 4 },
+ { "id": "mail_99", "group": "mail", "value": 2 },
+ { "id": "mail_100", "group": "mail", "value": 8 }
+ ],
+ "links": [
+ { "source": "mail_2", "target": "mail_1", "value": 1 },
+ { "source": "mail_3", "target": "mail_1", "value": 1 },
+ { "source": "mail_4", "target": "mail_1", "value": 1 },
+ { "source": "mail_4", "target": "mail_1", "value": 1 },
+ { "source": "mail_5", "target": "mail_1", "value": 1 },
+ { "source": "mail_5", "target": "mail_4", "value": 1 },
+ { "source": "mail_5", "target": "mail_1", "value": 1 },
+ { "source": "mail_6", "target": "mail_7", "value": 1 },
+ { "source": "mail_7", "target": "mail_8", "value": 1 },
+
+ { "source": "mail_8", "target": "mail_9", "value": 2 },
+ { "source": "mail_9", "target": "mail_10", "value": 2 },
+ { "source": "mail_10", "target": "mail_11", "value": 2 },
+ { "source": "mail_10", "target": "mail_14", "value": 2 },
+ { "source": "mail_11", "target": "mail_12", "value": 2 },
+ { "source": "mail_12", "target": "mail_13", "value": 2 },
+ { "source": "mail_14", "target": "mail_15", "value": 3 },
+ { "source": "mail_15", "target": "mail_16", "value": 2 },
+ { "source": "mail_16", "target": "mail_17", "value": 2 },
+ { "source": "mail_17", "target": "mail_18", "value": 2 },
+ { "source": "mail_18", "target": "mail_19", "value": 2 },
+ { "source": "mail_19", "target": "mail_20", "value": 2 },
+ { "source": "mail_20", "target": "mail_21", "value": 2 },
+ { "source": "mail_21", "target": "mail_22", "value": 3 },
+ { "source": "mail_22", "target": "mail_23", "value": 3 },
+ { "source": "mail_23", "target": "mail_24", "value": 4 },
+
+ { "source": "mail_24", "target": "mail_25", "value": 2 },
+ { "source": "mail_25", "target": "mail_26", "value": 2 },
+ { "source": "mail_26", "target": "mail_27", "value": 2 },
+ { "source": "mail_27", "target": "mail_28", "value": 2 },
+ { "source": "mail_28", "target": "mail_29", "value": 2 },
+ { "source": "mail_29", "target": "mail_30", "value": 2 },
+ { "source": "mail_30", "target": "mail_31", "value": 2 },
+ { "source": "mail_31", "target": "mail_32", "value": 2 },
+ { "source": "mail_32", "target": "mail_33", "value": 2 },
+ { "source": "mail_33", "target": "mail_34", "value": 2 },
+ { "source": "mail_34", "target": "mail_35", "value": 2 },
+ { "source": "mail_35", "target": "mail_36", "value": 2 },
+ { "source": "mail_36", "target": "mail_37", "value": 2 },
+ { "source": "mail_37", "target": "mail_38", "value": 2 },
+ { "source": "mail_38", "target": "mail_39", "value": 2 },
+ { "source": "mail_39", "target": "mail_40", "value": 2 },
+
+ { "source": "mail_24", "target": "mail_13", "value": 2 },
+ { "source": "mail_24", "target": "mail_14", "value": 2 },
+ { "source": "mail_24", "target": "mail_15", "value": 2 },
+ { "source": "mail_24", "target": "mail_16", "value": 2 },
+ { "source": "mail_24", "target": "mail_17", "value": 2 },
+ { "source": "mail_24", "target": "mail_18", "value": 2 },
+ { "source": "mail_24", "target": "mail_19", "value": 2 },
+ { "source": "mail_24", "target": "mail_20", "value": 2 },
+ { "source": "mail_24", "target": "mail_21", "value": 2 },
+ { "source": "mail_24", "target": "mail_22", "value": 2 },
+
+ { "source": "mail_50", "target": "mail_33", "value": 2 },
+ { "source": "mail_50", "target": "mail_34", "value": 2 },
+ { "source": "mail_50", "target": "mail_35", "value": 2 },
+ { "source": "mail_50", "target": "mail_36", "value": 2 },
+ { "source": "mail_50", "target": "mail_37", "value": 2 },
+ { "source": "mail_50", "target": "mail_38", "value": 2 },
+ { "source": "mail_50", "target": "mail_39", "value": 2 },
+ { "source": "mail_50", "target": "mail_40", "value": 2 },
+ { "source": "mail_50", "target": "mail_41", "value": 2 },
+ { "source": "mail_50", "target": "mail_42", "value": 2 },
+ { "source": "mail_50", "target": "mail_43", "value": 2 },
+ { "source": "mail_50", "target": "mail_44", "value": 2 },
+ { "source": "mail_50", "target": "mail_45", "value": 3 },
+ { "source": "mail_50", "target": "mail_46", "value": 3 },
+ { "source": "mail_50", "target": "mail_47", "value": 3 },
+ { "source": "mail_50", "target": "mail_48", "value": 3 },
+ { "source": "mail_50", "target": "mail_49", "value": 3 },
+ { "source": "mail_50", "target": "mail_51", "value": 3 },
+ { "source": "mail_50", "target": "mail_52", "value": 3 },
+ { "source": "mail_50", "target": "mail_53", "value": 3 },
+ { "source": "mail_50", "target": "mail_54", "value": 3 },
+ { "source": "mail_50", "target": "mail_55", "value": 3 },
+
+ { "source": "mail_40", "target": "mail_42", "value": 2 },
+ { "source": "mail_41", "target": "mail_43", "value": 1 },
+ { "source": "mail_42", "target": "mail_44", "value": 2 },
+ { "source": "mail_43", "target": "mail_45", "value": 1 },
+ { "source": "mail_44", "target": "mail_46", "value": 2 },
+ { "source": "mail_45", "target": "mail_47", "value": 1 },
+ { "source": "mail_46", "target": "mail_48", "value": 2 },
+ { "source": "mail_47", "target": "mail_49", "value": 1 },
+ { "source": "mail_48", "target": "mail_50", "value": 2 },
+ { "source": "mail_49", "target": "mail_51", "value": 1 },
+ { "source": "mail_50", "target": "mail_52", "value": 2 },
+ { "source": "mail_51", "target": "mail_53", "value": 1 },
+ { "source": "mail_52", "target": "mail_54", "value": 2 },
+ { "source": "mail_53", "target": "mail_55", "value": 1 },
+ { "source": "mail_54", "target": "mail_56", "value": 2 },
+ { "source": "mail_55", "target": "mail_57", "value": 1 },
+ { "source": "mail_56", "target": "mail_58", "value": 2 },
+ { "source": "mail_57", "target": "mail_59", "value": 1 },
+ { "source": "mail_58", "target": "mail_60", "value": 2 },
+ { "source": "mail_59", "target": "mail_61", "value": 1 },
+
+ { "source": "mail_60", "target": "mail_61", "value": 1 },
+ { "source": "mail_60", "target": "mail_65", "value": 2 },
+ { "source": "mail_61", "target": "mail_62", "value": 1 },
+ { "source": "mail_61", "target": "mail_66", "value": 2 },
+ { "source": "mail_62", "target": "mail_63", "value": 1 },
+ { "source": "mail_62", "target": "mail_67", "value": 2 },
+ { "source": "mail_63", "target": "mail_64", "value": 1 },
+ { "source": "mail_63", "target": "mail_68", "value": 2 },
+ { "source": "mail_64", "target": "mail_65", "value": 1 },
+ { "source": "mail_64", "target": "mail_69", "value": 2 },
+ { "source": "mail_65", "target": "mail_66", "value": 1 },
+ { "source": "mail_65", "target": "mail_70", "value": 2 },
+ { "source": "mail_66", "target": "mail_67", "value": 1 },
+ { "source": "mail_66", "target": "mail_71", "value": 2 },
+ { "source": "mail_67", "target": "mail_68", "value": 1 },
+ { "source": "mail_67", "target": "mail_72", "value": 2 },
+ { "source": "mail_68", "target": "mail_69", "value": 1 },
+ { "source": "mail_68", "target": "mail_73", "value": 2 },
+ { "source": "mail_69", "target": "mail_70", "value": 1 },
+ { "source": "mail_69", "target": "mail_74", "value": 2 },
+ { "source": "mail_70", "target": "mail_71", "value": 1 },
+ { "source": "mail_70", "target": "mail_75", "value": 2 },
+ { "source": "mail_71", "target": "mail_72", "value": 1 },
+ { "source": "mail_71", "target": "mail_76", "value": 2 },
+ { "source": "mail_72", "target": "mail_73", "value": 1 },
+ { "source": "mail_72", "target": "mail_77", "value": 2 },
+ { "source": "mail_73", "target": "mail_74", "value": 1 },
+ { "source": "mail_73", "target": "mail_78", "value": 2 },
+ { "source": "mail_74", "target": "mail_75", "value": 1 },
+ { "source": "mail_74", "target": "mail_79", "value": 2 },
+ { "source": "mail_75", "target": "mail_76", "value": 1 },
+ { "source": "mail_75", "target": "mail_80", "value": 2 },
+ { "source": "mail_76", "target": "mail_77", "value": 1 },
+ { "source": "mail_77", "target": "mail_78", "value": 1 },
+ { "source": "mail_78", "target": "mail_79", "value": 1 },
+ { "source": "mail_79", "target": "mail_80", "value": 1 },
+
+ { "source": "mail_72", "target": "mail_61", "value": 2 },
+ { "source": "mail_72", "target": "mail_62", "value": 2 },
+ { "source": "mail_72", "target": "mail_63", "value": 2 },
+ { "source": "mail_72", "target": "mail_64", "value": 2 },
+ { "source": "mail_72", "target": "mail_65", "value": 2 },
+ { "source": "mail_72", "target": "mail_66", "value": 2 },
+ { "source": "mail_72", "target": "mail_67", "value": 2 },
+ { "source": "mail_72", "target": "mail_68", "value": 2 },
+ { "source": "mail_72", "target": "mail_69", "value": 2 },
+ { "source": "mail_72", "target": "mail_70", "value": 2 },
+ { "source": "mail_72", "target": "mail_71", "value": 2 },
+ { "source": "mail_72", "target": "mail_73", "value": 2 },
+ { "source": "mail_72", "target": "mail_74", "value": 2 },
+ { "source": "mail_72", "target": "mail_75", "value": 2 },
+ { "source": "mail_72", "target": "mail_76", "value": 2 },
+ { "source": "mail_72", "target": "mail_77", "value": 2 },
+ { "source": "mail_72", "target": "mail_78", "value": 2 },
+ { "source": "mail_72", "target": "mail_79", "value": 2 },
+ { "source": "mail_72", "target": "mail_80", "value": 2 },
+ { "source": "mail_72", "target": "mail_81", "value": 2 },
+ { "source": "mail_72", "target": "mail_82", "value": 2 },
+
+ { "source": "mail_80", "target": "mail_81", "value": 2 },
+ { "source": "mail_81", "target": "mail_82", "value": 2 },
+ { "source": "mail_82", "target": "mail_83", "value": 2 },
+ { "source": "mail_83", "target": "mail_84", "value": 2 },
+ { "source": "mail_84", "target": "mail_85", "value": 2 },
+ { "source": "mail_85", "target": "mail_86", "value": 2 },
+ { "source": "mail_86", "target": "mail_87", "value": 2 },
+ { "source": "mail_87", "target": "mail_88", "value": 2 },
+ { "source": "mail_88", "target": "mail_89", "value": 2 },
+ { "source": "mail_89", "target": "mail_90", "value": 2 },
+ { "source": "mail_90", "target": "mail_91", "value": 3 },
+ { "source": "mail_91", "target": "mail_92", "value": 3 },
+ { "source": "mail_92", "target": "mail_93", "value": 3 },
+ { "source": "mail_93", "target": "mail_94", "value": 3 },
+ { "source": "mail_94", "target": "mail_95", "value": 3 },
+ { "source": "mail_95", "target": "mail_96", "value": 3 },
+ { "source": "mail_96", "target": "mail_97", "value": 3 },
+ { "source": "mail_97", "target": "mail_98", "value": 3 },
+ { "source": "mail_98", "target": "mail_99", "value": 3 },
+ { "source": "mail_99", "target": "mail_100", "value": 3 },
+
+ { "source": "mail_82", "target": "mail_84", "value": 2 },
+ { "source": "mail_84", "target": "mail_86", "value": 2 },
+ { "source": "mail_82", "target": "mail_86", "value": 1 },
+ { "source": "mail_85", "target": "mail_87", "value": 2 },
+ { "source": "mail_87", "target": "mail_89", "value": 2 },
+ { "source": "mail_85", "target": "mail_89", "value": 1 },
+ { "source": "mail_90", "target": "mail_92", "value": 2 },
+ { "source": "mail_92", "target": "mail_94", "value": 2 },
+ { "source": "mail_90", "target": "mail_94", "value": 1 },
+ { "source": "mail_93", "target": "mail_95", "value": 2 },
+ { "source": "mail_95", "target": "mail_97", "value": 2 },
+ { "source": "mail_93", "target": "mail_97", "value": 1 },
+ { "source": "mail_96", "target": "mail_98", "value": 2 },
+ { "source": "mail_98", "target": "mail_100", "value": 2 },
+ { "source": "mail_96", "target": "mail_100", "value": 1 },
+
+ { "source": "mail_88", "target": "mail_83", "value": 3 },
+ { "source": "mail_88", "target": "mail_84", "value": 3 },
+ { "source": "mail_88", "target": "mail_85", "value": 3 },
+ { "source": "mail_88", "target": "mail_86", "value": 3 },
+ { "source": "mail_88", "target": "mail_87", "value": 3 },
+ { "source": "mail_88", "target": "mail_89", "value": 3 },
+ { "source": "mail_88", "target": "mail_90", "value": 3 },
+ { "source": "mail_88", "target": "mail_91", "value": 3 },
+ { "source": "mail_88", "target": "mail_92", "value": 3 },
+ { "source": "mail_88", "target": "mail_93", "value": 3 },
+ { "source": "mail_88", "target": "mail_94", "value": 3 },
+ { "source": "mail_88", "target": "mail_95", "value": 3 },
+ { "source": "mail_88", "target": "mail_96", "value": 3 },
+ { "source": "mail_88", "target": "mail_97", "value": 3 },
+ { "source": "mail_88", "target": "mail_98", "value": 3 },
+ { "source": "mail_88", "target": "mail_99", "value": 3 },
+ { "source": "mail_88", "target": "mail_100", "value": 3 }
+ ]
+}
diff --git a/client/public/Projects/DummyProject/mail-graph-data.json b/client/public/Projects/DummyProject/mail-graph-data.json
new file mode 100644
index 0000000..8da2d4b
--- /dev/null
+++ b/client/public/Projects/DummyProject/mail-graph-data.json
@@ -0,0 +1,320 @@
+{
+ "nodes": [
+ { "id": "mail_1", "group": "mail", "value": 2 },
+ { "id": "mail_2", "group": "mail", "value": 2 },
+ { "id": "mail_3", "group": "mail", "value": 2 },
+ { "id": "mail_4", "group": "mail", "value": 2 },
+ { "id": "mail_5", "group": "mail", "value": 2 },
+ { "id": "mail_6", "group": "mail", "value": 2 },
+ { "id": "mail_7", "group": "mail", "value": 2 },
+ { "id": "mail_8", "group": "mail", "value": 2 },
+
+ { "id": "mail_9", "group": "mail", "value": 2 },
+ { "id": "mail_10", "group": "mail", "value": 3 },
+ { "id": "mail_11", "group": "mail", "value": 2 },
+ { "id": "mail_12", "group": "mail", "value": 2 },
+ { "id": "mail_13", "group": "mail", "value": 2 },
+ { "id": "mail_14", "group": "mail", "value": 3 },
+ { "id": "mail_15", "group": "mail", "value": 2 },
+ { "id": "mail_16", "group": "mail", "value": 2 },
+ { "id": "mail_17", "group": "mail", "value": 2 },
+ { "id": "mail_18", "group": "mail", "value": 2 },
+ { "id": "mail_19", "group": "mail", "value": 2 },
+ { "id": "mail_20", "group": "mail", "value": 3 },
+ { "id": "mail_21", "group": "mail", "value": 2 },
+ { "id": "mail_22", "group": "mail", "value": 4 },
+ { "id": "mail_23", "group": "mail", "value": 2 },
+ { "id": "mail_24", "group": "mail", "value": 6 },
+ { "id": "mail_25", "group": "mail", "value": 2 },
+ { "id": "mail_26", "group": "mail", "value": 2 },
+ { "id": "mail_27", "group": "mail", "value": 2 },
+ { "id": "mail_28", "group": "mail", "value": 3 },
+ { "id": "mail_29", "group": "mail", "value": 2 },
+ { "id": "mail_30", "group": "mail", "value": 2 },
+ { "id": "mail_31", "group": "mail", "value": 2 },
+ { "id": "mail_32", "group": "mail", "value": 2 },
+ { "id": "mail_33", "group": "mail", "value": 2 },
+ { "id": "mail_34", "group": "mail", "value": 3 },
+ { "id": "mail_35", "group": "mail", "value": 5 },
+ { "id": "mail_36", "group": "mail", "value": 2 },
+ { "id": "mail_37", "group": "mail", "value": 2 },
+ { "id": "mail_38", "group": "mail", "value": 2 },
+ { "id": "mail_39", "group": "mail", "value": 2 },
+ { "id": "mail_40", "group": "mail", "value": 2 },
+ { "id": "mail_41", "group": "mail", "value": 2 },
+ { "id": "mail_42", "group": "mail", "value": 4 },
+ { "id": "mail_43", "group": "mail", "value": 2 },
+ { "id": "mail_44", "group": "mail", "value": 2 },
+ { "id": "mail_45", "group": "mail", "value": 2 },
+ { "id": "mail_46", "group": "mail", "value": 2 },
+ { "id": "mail_47", "group": "mail", "value": 2 },
+ { "id": "mail_48", "group": "mail", "value": 2 },
+ { "id": "mail_49", "group": "mail", "value": 3 },
+ { "id": "mail_50", "group": "mail", "value": 7 },
+
+ { "id": "mail_51", "group": "mail", "value": 2 },
+ { "id": "mail_52", "group": "mail", "value": 2 },
+ { "id": "mail_53", "group": "mail", "value": 2 },
+ { "id": "mail_54", "group": "mail", "value": 2 },
+ { "id": "mail_55", "group": "mail", "value": 5 },
+ { "id": "mail_56", "group": "mail", "value": 4 },
+ { "id": "mail_57", "group": "mail", "value": 2 },
+ { "id": "mail_58", "group": "mail", "value": 2 },
+ { "id": "mail_59", "group": "mail", "value": 2 },
+ { "id": "mail_60", "group": "mail", "value": 2 },
+ { "id": "mail_61", "group": "mail", "value": 2 },
+ { "id": "mail_62", "group": "mail", "value": 2 },
+ { "id": "mail_63", "group": "mail", "value": 3 },
+ { "id": "mail_64", "group": "mail", "value": 2 },
+ { "id": "mail_65", "group": "mail", "value": 2 },
+ { "id": "mail_66", "group": "mail", "value": 2 },
+ { "id": "mail_67", "group": "mail", "value": 2 },
+ { "id": "mail_68", "group": "mail", "value": 2 },
+ { "id": "mail_69", "group": "mail", "value": 2 },
+ { "id": "mail_70", "group": "mail", "value": 4 },
+ { "id": "mail_71", "group": "mail", "value": 2 },
+ { "id": "mail_72", "group": "mail", "value": 6 },
+ { "id": "mail_73", "group": "mail", "value": 2 },
+ { "id": "mail_74", "group": "mail", "value": 2 },
+ { "id": "mail_75", "group": "mail", "value": 2 },
+ { "id": "mail_76", "group": "mail", "value": 2 },
+ { "id": "mail_77", "group": "mail", "value": 2 },
+ { "id": "mail_78", "group": "mail", "value": 5 },
+ { "id": "mail_79", "group": "mail", "value": 2 },
+ { "id": "mail_80", "group": "mail", "value": 2 },
+ { "id": "mail_81", "group": "mail", "value": 2 },
+ { "id": "mail_82", "group": "mail", "value": 2 },
+ { "id": "mail_83", "group": "mail", "value": 2 },
+ { "id": "mail_84", "group": "mail", "value": 4 },
+ { "id": "mail_85", "group": "mail", "value": 2 },
+ { "id": "mail_86", "group": "mail", "value": 2 },
+ { "id": "mail_87", "group": "mail", "value": 2 },
+ { "id": "mail_88", "group": "mail", "value": 7 },
+ { "id": "mail_89", "group": "mail", "value": 2 },
+ { "id": "mail_90", "group": "mail", "value": 2 },
+ { "id": "mail_91", "group": "mail", "value": 3 },
+ { "id": "mail_92", "group": "mail", "value": 2 },
+ { "id": "mail_93", "group": "mail", "value": 2 },
+ { "id": "mail_94", "group": "mail", "value": 2 },
+ { "id": "mail_95", "group": "mail", "value": 2 },
+ { "id": "mail_96", "group": "mail", "value": 2 },
+ { "id": "mail_97", "group": "mail", "value": 2 },
+ { "id": "mail_98", "group": "mail", "value": 4 },
+ { "id": "mail_99", "group": "mail", "value": 2 },
+ { "id": "mail_100", "group": "mail", "value": 8 }
+ ],
+ "links": [
+ { "source": "mail_2", "target": "mail_1", "value": 1 },
+ { "source": "mail_3", "target": "mail_1", "value": 1 },
+ { "source": "mail_4", "target": "mail_1", "value": 1 },
+ { "source": "mail_4", "target": "mail_1", "value": 1 },
+ { "source": "mail_5", "target": "mail_1", "value": 1 },
+ { "source": "mail_5", "target": "mail_4", "value": 1 },
+ { "source": "mail_5", "target": "mail_1", "value": 1 },
+ { "source": "mail_6", "target": "mail_7", "value": 1 },
+ { "source": "mail_7", "target": "mail_8", "value": 1 },
+
+ { "source": "mail_8", "target": "mail_9", "value": 2 },
+ { "source": "mail_9", "target": "mail_10", "value": 2 },
+ { "source": "mail_10", "target": "mail_11", "value": 2 },
+ { "source": "mail_10", "target": "mail_14", "value": 2 },
+ { "source": "mail_11", "target": "mail_12", "value": 2 },
+ { "source": "mail_12", "target": "mail_13", "value": 2 },
+ { "source": "mail_14", "target": "mail_15", "value": 3 },
+ { "source": "mail_15", "target": "mail_16", "value": 2 },
+ { "source": "mail_16", "target": "mail_17", "value": 2 },
+ { "source": "mail_17", "target": "mail_18", "value": 2 },
+ { "source": "mail_18", "target": "mail_19", "value": 2 },
+ { "source": "mail_19", "target": "mail_20", "value": 2 },
+ { "source": "mail_20", "target": "mail_21", "value": 2 },
+ { "source": "mail_21", "target": "mail_22", "value": 3 },
+ { "source": "mail_22", "target": "mail_23", "value": 3 },
+ { "source": "mail_23", "target": "mail_24", "value": 4 },
+
+ { "source": "mail_24", "target": "mail_25", "value": 2 },
+ { "source": "mail_25", "target": "mail_26", "value": 2 },
+ { "source": "mail_26", "target": "mail_27", "value": 2 },
+ { "source": "mail_27", "target": "mail_28", "value": 2 },
+ { "source": "mail_28", "target": "mail_29", "value": 2 },
+ { "source": "mail_29", "target": "mail_30", "value": 2 },
+ { "source": "mail_30", "target": "mail_31", "value": 2 },
+ { "source": "mail_31", "target": "mail_32", "value": 2 },
+ { "source": "mail_32", "target": "mail_33", "value": 2 },
+ { "source": "mail_33", "target": "mail_34", "value": 2 },
+ { "source": "mail_34", "target": "mail_35", "value": 2 },
+ { "source": "mail_35", "target": "mail_36", "value": 2 },
+ { "source": "mail_36", "target": "mail_37", "value": 2 },
+ { "source": "mail_37", "target": "mail_38", "value": 2 },
+ { "source": "mail_38", "target": "mail_39", "value": 2 },
+ { "source": "mail_39", "target": "mail_40", "value": 2 },
+
+ { "source": "mail_24", "target": "mail_13", "value": 2 },
+ { "source": "mail_24", "target": "mail_14", "value": 2 },
+ { "source": "mail_24", "target": "mail_15", "value": 2 },
+ { "source": "mail_24", "target": "mail_16", "value": 2 },
+ { "source": "mail_24", "target": "mail_17", "value": 2 },
+ { "source": "mail_24", "target": "mail_18", "value": 2 },
+ { "source": "mail_24", "target": "mail_19", "value": 2 },
+ { "source": "mail_24", "target": "mail_20", "value": 2 },
+ { "source": "mail_24", "target": "mail_21", "value": 2 },
+ { "source": "mail_24", "target": "mail_22", "value": 2 },
+
+ { "source": "mail_50", "target": "mail_33", "value": 2 },
+ { "source": "mail_50", "target": "mail_34", "value": 2 },
+ { "source": "mail_50", "target": "mail_35", "value": 2 },
+ { "source": "mail_50", "target": "mail_36", "value": 2 },
+ { "source": "mail_50", "target": "mail_37", "value": 2 },
+ { "source": "mail_50", "target": "mail_38", "value": 2 },
+ { "source": "mail_50", "target": "mail_39", "value": 2 },
+ { "source": "mail_50", "target": "mail_40", "value": 2 },
+ { "source": "mail_50", "target": "mail_41", "value": 2 },
+ { "source": "mail_50", "target": "mail_42", "value": 2 },
+ { "source": "mail_50", "target": "mail_43", "value": 2 },
+ { "source": "mail_50", "target": "mail_44", "value": 2 },
+ { "source": "mail_50", "target": "mail_45", "value": 3 },
+ { "source": "mail_50", "target": "mail_46", "value": 3 },
+ { "source": "mail_50", "target": "mail_47", "value": 3 },
+ { "source": "mail_50", "target": "mail_48", "value": 3 },
+ { "source": "mail_50", "target": "mail_49", "value": 3 },
+ { "source": "mail_50", "target": "mail_51", "value": 3 },
+ { "source": "mail_50", "target": "mail_52", "value": 3 },
+ { "source": "mail_50", "target": "mail_53", "value": 3 },
+ { "source": "mail_50", "target": "mail_54", "value": 3 },
+ { "source": "mail_50", "target": "mail_55", "value": 3 },
+
+ { "source": "mail_40", "target": "mail_42", "value": 2 },
+ { "source": "mail_41", "target": "mail_43", "value": 1 },
+ { "source": "mail_42", "target": "mail_44", "value": 2 },
+ { "source": "mail_43", "target": "mail_45", "value": 1 },
+ { "source": "mail_44", "target": "mail_46", "value": 2 },
+ { "source": "mail_45", "target": "mail_47", "value": 1 },
+ { "source": "mail_46", "target": "mail_48", "value": 2 },
+ { "source": "mail_47", "target": "mail_49", "value": 1 },
+ { "source": "mail_48", "target": "mail_50", "value": 2 },
+ { "source": "mail_49", "target": "mail_51", "value": 1 },
+ { "source": "mail_50", "target": "mail_52", "value": 2 },
+ { "source": "mail_51", "target": "mail_53", "value": 1 },
+ { "source": "mail_52", "target": "mail_54", "value": 2 },
+ { "source": "mail_53", "target": "mail_55", "value": 1 },
+ { "source": "mail_54", "target": "mail_56", "value": 2 },
+ { "source": "mail_55", "target": "mail_57", "value": 1 },
+ { "source": "mail_56", "target": "mail_58", "value": 2 },
+ { "source": "mail_57", "target": "mail_59", "value": 1 },
+ { "source": "mail_58", "target": "mail_60", "value": 2 },
+ { "source": "mail_59", "target": "mail_61", "value": 1 },
+
+ { "source": "mail_60", "target": "mail_61", "value": 1 },
+ { "source": "mail_60", "target": "mail_65", "value": 2 },
+ { "source": "mail_61", "target": "mail_62", "value": 1 },
+ { "source": "mail_61", "target": "mail_66", "value": 2 },
+ { "source": "mail_62", "target": "mail_63", "value": 1 },
+ { "source": "mail_62", "target": "mail_67", "value": 2 },
+ { "source": "mail_63", "target": "mail_64", "value": 1 },
+ { "source": "mail_63", "target": "mail_68", "value": 2 },
+ { "source": "mail_64", "target": "mail_65", "value": 1 },
+ { "source": "mail_64", "target": "mail_69", "value": 2 },
+ { "source": "mail_65", "target": "mail_66", "value": 1 },
+ { "source": "mail_65", "target": "mail_70", "value": 2 },
+ { "source": "mail_66", "target": "mail_67", "value": 1 },
+ { "source": "mail_66", "target": "mail_71", "value": 2 },
+ { "source": "mail_67", "target": "mail_68", "value": 1 },
+ { "source": "mail_67", "target": "mail_72", "value": 2 },
+ { "source": "mail_68", "target": "mail_69", "value": 1 },
+ { "source": "mail_68", "target": "mail_73", "value": 2 },
+ { "source": "mail_69", "target": "mail_70", "value": 1 },
+ { "source": "mail_69", "target": "mail_74", "value": 2 },
+ { "source": "mail_70", "target": "mail_71", "value": 1 },
+ { "source": "mail_70", "target": "mail_75", "value": 2 },
+ { "source": "mail_71", "target": "mail_72", "value": 1 },
+ { "source": "mail_71", "target": "mail_76", "value": 2 },
+ { "source": "mail_72", "target": "mail_73", "value": 1 },
+ { "source": "mail_72", "target": "mail_77", "value": 2 },
+ { "source": "mail_73", "target": "mail_74", "value": 1 },
+ { "source": "mail_73", "target": "mail_78", "value": 2 },
+ { "source": "mail_74", "target": "mail_75", "value": 1 },
+ { "source": "mail_74", "target": "mail_79", "value": 2 },
+ { "source": "mail_75", "target": "mail_76", "value": 1 },
+ { "source": "mail_75", "target": "mail_80", "value": 2 },
+ { "source": "mail_76", "target": "mail_77", "value": 1 },
+ { "source": "mail_77", "target": "mail_78", "value": 1 },
+ { "source": "mail_78", "target": "mail_79", "value": 1 },
+ { "source": "mail_79", "target": "mail_80", "value": 1 },
+
+ { "source": "mail_72", "target": "mail_61", "value": 2 },
+ { "source": "mail_72", "target": "mail_62", "value": 2 },
+ { "source": "mail_72", "target": "mail_63", "value": 2 },
+ { "source": "mail_72", "target": "mail_64", "value": 2 },
+ { "source": "mail_72", "target": "mail_65", "value": 2 },
+ { "source": "mail_72", "target": "mail_66", "value": 2 },
+ { "source": "mail_72", "target": "mail_67", "value": 2 },
+ { "source": "mail_72", "target": "mail_68", "value": 2 },
+ { "source": "mail_72", "target": "mail_69", "value": 2 },
+ { "source": "mail_72", "target": "mail_70", "value": 2 },
+ { "source": "mail_72", "target": "mail_71", "value": 2 },
+ { "source": "mail_72", "target": "mail_73", "value": 2 },
+ { "source": "mail_72", "target": "mail_74", "value": 2 },
+ { "source": "mail_72", "target": "mail_75", "value": 2 },
+ { "source": "mail_72", "target": "mail_76", "value": 2 },
+ { "source": "mail_72", "target": "mail_77", "value": 2 },
+ { "source": "mail_72", "target": "mail_78", "value": 2 },
+ { "source": "mail_72", "target": "mail_79", "value": 2 },
+ { "source": "mail_72", "target": "mail_80", "value": 2 },
+ { "source": "mail_72", "target": "mail_81", "value": 2 },
+ { "source": "mail_72", "target": "mail_82", "value": 2 },
+
+ { "source": "mail_80", "target": "mail_81", "value": 2 },
+ { "source": "mail_81", "target": "mail_82", "value": 2 },
+ { "source": "mail_82", "target": "mail_83", "value": 2 },
+ { "source": "mail_83", "target": "mail_84", "value": 2 },
+ { "source": "mail_84", "target": "mail_85", "value": 2 },
+ { "source": "mail_85", "target": "mail_86", "value": 2 },
+ { "source": "mail_86", "target": "mail_87", "value": 2 },
+ { "source": "mail_87", "target": "mail_88", "value": 2 },
+ { "source": "mail_88", "target": "mail_89", "value": 2 },
+ { "source": "mail_89", "target": "mail_90", "value": 2 },
+ { "source": "mail_90", "target": "mail_91", "value": 3 },
+ { "source": "mail_91", "target": "mail_92", "value": 3 },
+ { "source": "mail_92", "target": "mail_93", "value": 3 },
+ { "source": "mail_93", "target": "mail_94", "value": 3 },
+ { "source": "mail_94", "target": "mail_95", "value": 3 },
+ { "source": "mail_95", "target": "mail_96", "value": 3 },
+ { "source": "mail_96", "target": "mail_97", "value": 3 },
+ { "source": "mail_97", "target": "mail_98", "value": 3 },
+ { "source": "mail_98", "target": "mail_99", "value": 3 },
+ { "source": "mail_99", "target": "mail_100", "value": 3 },
+
+ { "source": "mail_82", "target": "mail_84", "value": 2 },
+ { "source": "mail_84", "target": "mail_86", "value": 2 },
+ { "source": "mail_82", "target": "mail_86", "value": 1 },
+ { "source": "mail_85", "target": "mail_87", "value": 2 },
+ { "source": "mail_87", "target": "mail_89", "value": 2 },
+ { "source": "mail_85", "target": "mail_89", "value": 1 },
+ { "source": "mail_90", "target": "mail_92", "value": 2 },
+ { "source": "mail_92", "target": "mail_94", "value": 2 },
+ { "source": "mail_90", "target": "mail_94", "value": 1 },
+ { "source": "mail_93", "target": "mail_95", "value": 2 },
+ { "source": "mail_95", "target": "mail_97", "value": 2 },
+ { "source": "mail_93", "target": "mail_97", "value": 1 },
+ { "source": "mail_96", "target": "mail_98", "value": 2 },
+ { "source": "mail_98", "target": "mail_100", "value": 2 },
+ { "source": "mail_96", "target": "mail_100", "value": 1 },
+
+ { "source": "mail_88", "target": "mail_83", "value": 3 },
+ { "source": "mail_88", "target": "mail_84", "value": 3 },
+ { "source": "mail_88", "target": "mail_85", "value": 3 },
+ { "source": "mail_88", "target": "mail_86", "value": 3 },
+ { "source": "mail_88", "target": "mail_87", "value": 3 },
+ { "source": "mail_88", "target": "mail_89", "value": 3 },
+ { "source": "mail_88", "target": "mail_90", "value": 3 },
+ { "source": "mail_88", "target": "mail_91", "value": 3 },
+ { "source": "mail_88", "target": "mail_92", "value": 3 },
+ { "source": "mail_88", "target": "mail_93", "value": 3 },
+ { "source": "mail_88", "target": "mail_94", "value": 3 },
+ { "source": "mail_88", "target": "mail_95", "value": 3 },
+ { "source": "mail_88", "target": "mail_96", "value": 3 },
+ { "source": "mail_88", "target": "mail_97", "value": 3 },
+ { "source": "mail_88", "target": "mail_98", "value": 3 },
+ { "source": "mail_88", "target": "mail_99", "value": 3 },
+ { "source": "mail_88", "target": "mail_100", "value": 3 }
+ ]
+}
diff --git a/client/public/Projects/DummyProject/person-graph-data.json b/client/public/Projects/DummyProject/person-graph-data.json
new file mode 100644
index 0000000..50a24a3
--- /dev/null
+++ b/client/public/Projects/DummyProject/person-graph-data.json
@@ -0,0 +1,18 @@
+{
+ "nodes": [
+ { "id": "person_1", "group": "people", "value": 2 },
+ { "id": "person_2", "group": "people", "value": 2 },
+ { "id": "person_3", "group": "people", "value": 2 },
+ { "id": "person_4", "group": "people", "value": 2 }
+ ],
+ "links": [
+ { "source": "person_1", "target": "mail_4", "value": 1 },
+ { "source": "person_1", "target": "file_2", "value": 1 },
+ { "source": "person_2", "target": "file_5", "value": 1 },
+ { "source": "person_2", "target": "mail_2", "value": 1 },
+ { "source": "person_3", "target": "mail_1", "value": 1 },
+ { "source": "person_3", "target": "issue_1", "value": 1 },
+ { "source": "person_4", "target": "file_7", "value": 1 },
+ { "source": "person_4", "target": "file_23", "value": 1 }
+ ]
+}
diff --git a/client/src/app/index.css b/client/src/app/index.css
new file mode 100644
index 0000000..c06ae84
--- /dev/null
+++ b/client/src/app/index.css
@@ -0,0 +1,10 @@
+@import "tailwindcss";
+
+@layer base {
+ html,
+ body,
+ #root {
+ height: 100%;
+ margin: 0;
+ }
+}
\ No newline at end of file
diff --git a/client/src/app/index.tsx b/client/src/app/index.tsx
new file mode 100644
index 0000000..a02b70c
--- /dev/null
+++ b/client/src/app/index.tsx
@@ -0,0 +1,17 @@
+import { AppProvider} from "./provider.tsx";
+import { AppRouter } from './router.tsx';
+import './index.css';
+
+/**
+ * Root of the app
+ */
+
+export const App = ()=> {
+ return (
+ <>
+
+
+
+ >
+ )
+}
diff --git a/client/src/app/provider.tsx b/client/src/app/provider.tsx
new file mode 100644
index 0000000..6ce176c
--- /dev/null
+++ b/client/src/app/provider.tsx
@@ -0,0 +1,21 @@
+import { Suspense, type ReactNode } from 'react';
+import { ThemeProvider } from "@mui/material";
+import { theme } from "@/styles/mui/theme.ts";
+
+type AppProviderProps = {
+ children: ReactNode;
+};
+
+
+/**
+ * Provider for entire application.
+*/
+export const AppProvider = ({ children }: AppProviderProps) => {
+ return (
+
+
+ {children}
+
+
+ );
+}
\ No newline at end of file
diff --git a/client/src/app/router.tsx b/client/src/app/router.tsx
new file mode 100644
index 0000000..c724046
--- /dev/null
+++ b/client/src/app/router.tsx
@@ -0,0 +1,26 @@
+import { createBrowserRouter, RouterProvider } from "react-router-dom";
+import { paths } from '../config/paths.ts';
+import AppLayout from "../components/layouts/app-layout.tsx";
+
+/**
+ * Holds the routes (url + page) of the app
+ */
+const router = createBrowserRouter([
+ {
+ element: ,
+ children: [
+ {
+ path: paths.home.path,
+ lazy: async () => {
+ const { default: Component } = await import("./routes/landing");
+ return { Component };
+ },
+ },
+ ],
+ },
+]);
+
+export const AppRouter = () => {
+
+ return ;
+};
\ No newline at end of file
diff --git a/client/src/app/routes/landing.tsx b/client/src/app/routes/landing.tsx
new file mode 100644
index 0000000..3ff20a4
--- /dev/null
+++ b/client/src/app/routes/landing.tsx
@@ -0,0 +1,14 @@
+import { NetworkGraph } from "@/features/NetworkGraph";
+
+/**
+ * Landing page component.
+ *
+ * Holds the Network Graph feature currently.
+ */
+const Landing = () => {
+ return (
+
+ )
+}
+
+export default Landing;
\ No newline at end of file
diff --git a/client/src/assets/kaiaulu_logo.png b/client/src/assets/kaiaulu_logo.png
new file mode 100644
index 0000000..d912727
Binary files /dev/null and b/client/src/assets/kaiaulu_logo.png differ
diff --git a/client/src/components/layouts/app-layout.tsx b/client/src/components/layouts/app-layout.tsx
new file mode 100644
index 0000000..324186c
--- /dev/null
+++ b/client/src/components/layouts/app-layout.tsx
@@ -0,0 +1,32 @@
+import { Outlet } from "react-router-dom";
+import Box from "@mui/material/Box";
+
+/**
+ * Provides current layout for the application. Renders the header above any child components passed to it.
+ */
+const AppLayout = () => {
+ return (
+
+
+
+
+
+ )
+}
+
+export default AppLayout;
\ No newline at end of file
diff --git a/client/src/components/ui/floating-overlay/floating-overlay.tsx b/client/src/components/ui/floating-overlay/floating-overlay.tsx
new file mode 100644
index 0000000..d3307ee
--- /dev/null
+++ b/client/src/components/ui/floating-overlay/floating-overlay.tsx
@@ -0,0 +1,89 @@
+import { CSS } from "@dnd-kit/utilities";
+import { useDraggable, useDndMonitor } from '@dnd-kit/core';
+import { useState, type ReactNode, type FC, type CSSProperties } from "react";
+import Box from "@mui/material/Box";
+import { Paper, Typography } from "@mui/material";
+
+type FloatingPanelProps = {
+ /**
+ * Passed to the useDraggable hook from dnd-kit to establish the component as 'draggable' and distinguish it
+ */
+ id: string;
+
+ /**
+ * Optional title text displayed on the panel
+ */
+ title?: ReactNode;
+
+ /**
+ * Optional components to be rendered within the panel
+ */
+ children?: ReactNode;
+};
+
+/**
+ * A draggable panel component.
+ */
+export const FloatingPanel: FC = ({ title, children, id }) => {
+ // Initial position of the panel
+ const [position, setPosition] = useState({ x: 16, y: 16 });
+
+ // Hook that exposes constants necessary for dragging the component
+ const { attributes, listeners, setNodeRef, transform } = useDraggable({ id });
+
+ // Listener for drag and drop events
+ useDndMonitor({
+ onDragEnd(event) {
+ if (event.active.id !== id) return;
+ const { delta } = event;
+
+ setPosition((prev) => ({
+ x: prev.x + delta.x,
+ y: prev.y + delta.y,
+ }));
+ },
+ });
+
+ // Transform applied to the style of the component
+ const dragTransform = transform ?? { x: 0, y: 0 };
+
+ // Style of the draggable component
+ const style: CSSProperties = {
+ transform: CSS.Translate.toString({
+ scaleX: 1, scaleY: 1,
+ x: position.x + dragTransform.x,
+ y: position.y + dragTransform.y
+ }),
+ };
+
+ return (
+
+ {title && (
+
+
+ {title}
+
+
+ )}
+
+
+ {children}
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/client/src/components/ui/header/header.tsx b/client/src/components/ui/header/header.tsx
new file mode 100644
index 0000000..dbc9db7
--- /dev/null
+++ b/client/src/components/ui/header/header.tsx
@@ -0,0 +1,8 @@
+
+export const Header = () => {
+ return (
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/client/src/components/ui/navbar/navbar.tsx b/client/src/components/ui/navbar/navbar.tsx
new file mode 100644
index 0000000..f6a9a2b
--- /dev/null
+++ b/client/src/components/ui/navbar/navbar.tsx
@@ -0,0 +1,44 @@
+import AppBar from '@mui/material/AppBar';
+import Box from '@mui/material/Box';
+import Toolbar from '@mui/material/Toolbar';
+import IconButton from '@mui/material/IconButton';
+import logo from '@/assets/kaiaulu_logo.png';
+import { Typography } from "@mui/material";
+import type { ReactNode } from "react";
+
+export const Navbar = ({ children }: { children: ReactNode }) => {
+
+ return (
+
+
+
+
+
+
+
+ Kaiāulu
+
+
+ { children }
+
+
+ )
+}
\ No newline at end of file
diff --git a/client/src/config/app.ts b/client/src/config/app.ts
new file mode 100644
index 0000000..1fdf28e
--- /dev/null
+++ b/client/src/config/app.ts
@@ -0,0 +1,18 @@
+import { parse } from 'yaml';
+import rawConfig from './user.config.yaml?raw';
+
+/**
+ * THIS FILE CONVERTS THE USER DEFINEd PATHS IN THE KAIAULU CONFIG INTO CONSTANTS USED BY THE APPLICATION
+ */
+
+
+const config = parse(rawConfig) as {
+ networkGraph: {
+ projectsDirectory: string,
+ targetProject: string;
+ };
+};
+
+export const TARGET_PROJECT = config.networkGraph.targetProject;
+
+export const PROJECTS_DIRECTORY = config.networkGraph.projectsDirectory;
\ No newline at end of file
diff --git a/client/src/config/paths.ts b/client/src/config/paths.ts
new file mode 100644
index 0000000..7ef3c7f
--- /dev/null
+++ b/client/src/config/paths.ts
@@ -0,0 +1,13 @@
+export const paths = {
+ home: {
+ path: '/',
+ getHref: () => '/',
+ },
+
+ app: {
+ root: {
+ path: '/app',
+ getHref: () => '/app',
+ },
+ }
+}
\ No newline at end of file
diff --git a/client/src/config/user.config.yaml b/client/src/config/user.config.yaml
new file mode 100644
index 0000000..6b1cb70
--- /dev/null
+++ b/client/src/config/user.config.yaml
@@ -0,0 +1,3 @@
+networkGraph:
+ projectsDirectory: "Projects"
+ targetProject: "DummyProject"
\ No newline at end of file
diff --git a/client/src/features/NetworkGraph/components/network-graph-canvas/network-graph-canvas.tsx b/client/src/features/NetworkGraph/components/network-graph-canvas/network-graph-canvas.tsx
new file mode 100644
index 0000000..ef8a51f
--- /dev/null
+++ b/client/src/features/NetworkGraph/components/network-graph-canvas/network-graph-canvas.tsx
@@ -0,0 +1,72 @@
+import { useCallback, useEffect } from "react";
+
+import Box from "@mui/material/Box";
+
+import { useNetworkGraph } from "../../stores/network-graph-context.tsx";
+import { useInitialPhysicsSimulation } from "@/features/NetworkGraph/hooks/useInitialPhysicsSimulation.ts";
+import { useNetworkGraphInteractions } from "@/features/NetworkGraph/hooks/useNetworkGraphInteractions.ts";
+
+import { drawGraph } from "@/features/NetworkGraph/lib/draw-network-graph.ts";
+
+
+/**
+ * Provides an HTML canvas for the Network Graph feature and exposes a function that draws a network graph to that canvas
+ */
+export const NetworkGraphCanvas = () => {
+ const { nodes, links, canvasRef, overlayOn, transparentNodeMapRef } = useNetworkGraph();
+
+ /**
+ * Function called by network graph hooks whenever they have mutated relevant data (node position changed by user, highlight mode, etc.)
+ * that draws the current state of the network graph to the canvas.
+ */
+ const renderNetworkGraph = useCallback(() => {
+ if (!canvasRef.current) return;
+ const canvas = canvasRef.current;
+
+ const container = canvas.parentElement;
+ if (!container) return;
+
+ //Before every draw, canvas 'draw space' needs to be the same as its parent container, else the drawing will appear distorted
+ const rect = container.getBoundingClientRect();
+ const nextW = Math.max(1, Math.floor(rect.width));
+ const nextH = Math.max(1, Math.floor(rect.height));
+
+ if (canvas.width !== nextW) canvas.width = nextW;
+ if (canvas.height !== nextH) canvas.height = nextH;
+
+ // Helper function from draw-network-graph library, runs the canvas + context logic for drawing
+ drawGraph(canvas, nodes, links, transparentNodeMapRef.current,
+ 11,
+ 'gray',
+ 'gray');
+
+ }, [canvasRef, links, nodes, transparentNodeMapRef]);
+
+ /**
+ * Calculates the initial positions of nodes and links in the Network Graph by running a d3.js simulation.
+ * Renders the Network Graph after simulation has completed.
+ */
+ useInitialPhysicsSimulation(renderNetworkGraph);
+
+ /**
+ * Allows user to interface with the network graph and also applies interaction specific logic
+ * Renders the Network Graph whenever user interaction has changed anything about the graph visually (dragged nodes, highlight mode).
+ */
+ useNetworkGraphInteractions(renderNetworkGraph);
+
+ /**
+ * If a DOM re-render happens and the subgraph overlay state has changed, then draw the network graph to the canvas
+ */
+ useEffect(() => {
+ renderNetworkGraph();
+ }, [renderNetworkGraph, overlayOn]);
+
+ return (
+
+
+
+
+
+ )
+}
+
diff --git a/client/src/features/NetworkGraph/components/network-graph-search-bar/network-graph-search-bar.tsx b/client/src/features/NetworkGraph/components/network-graph-search-bar/network-graph-search-bar.tsx
new file mode 100644
index 0000000..33b9fe2
--- /dev/null
+++ b/client/src/features/NetworkGraph/components/network-graph-search-bar/network-graph-search-bar.tsx
@@ -0,0 +1,62 @@
+import { alpha, InputBase, styled } from "@mui/material";
+import { useNetworkGraph } from "@/features/NetworkGraph/stores/network-graph-context.tsx";
+import { useState, type FormEvent } from "react";
+import {
+ setAllNodesToBeTransparent,
+ setNodeNeighborhoodToBeOpaque
+} from "@/features/NetworkGraph/utils/transparent-node-map.ts";
+
+/**
+ * Custom styled Search form that acts as container for the Input
+ */
+const Search = styled("form")(({ theme }) => ({
+ position: "relative",
+ borderRadius: theme.shape.borderRadius,
+ backgroundColor: theme.palette.secondary.main,
+ "&:hover": {
+ backgroundColor: alpha(theme.palette.common.white, 0.25),
+ },
+ marginLeft: 0,
+ width: "100%",
+ [theme.breakpoints.up("sm")]: {
+ marginLeft: theme.spacing(1),
+ width: "auto",
+ },
+ paddingLeft: 10,
+}));
+
+/**
+ * Search bar that allows the user to target a node by name and highlight a subgraph
+ */
+export const NetworkGraphSearchBar = () => {
+ const { nodeRelationshipMapRef, transparentNodeMapRef, overlayOn, setOverlayOn } = useNetworkGraph();
+
+ const [searchInput, setSearchInput] = useState("");
+
+ const handleSubmit = (e: FormEvent) => {
+ e.preventDefault();
+ const query = searchInput.trim();
+ if (!query) return;
+
+ if (!overlayOn) {
+ setAllNodesToBeTransparent(transparentNodeMapRef.current);
+ setNodeNeighborhoodToBeOpaque(query, transparentNodeMapRef.current, nodeRelationshipMapRef.current);
+ setOverlayOn(true);
+ }
+
+ };
+
+ return (
+
+ setSearchInput(e.target.value)}
+ placeholder="Search…"
+ inputProps={{ "aria-label": "search" }}
+ sx={{
+ color: 'white',
+ }}>
+
+
+ );
+}
\ No newline at end of file
diff --git a/client/src/features/NetworkGraph/components/network-graph-sub-graph-overlay/network-graph-sub-graph-overlay.tsx b/client/src/features/NetworkGraph/components/network-graph-sub-graph-overlay/network-graph-sub-graph-overlay.tsx
new file mode 100644
index 0000000..ba74907
--- /dev/null
+++ b/client/src/features/NetworkGraph/components/network-graph-sub-graph-overlay/network-graph-sub-graph-overlay.tsx
@@ -0,0 +1,37 @@
+import { DndContext } from "@dnd-kit/core";
+import { FloatingPanel } from "@/components/ui/floating-overlay/floating-overlay.tsx";
+
+import { useNetworkGraph } from "@/features/NetworkGraph/stores/network-graph-context.tsx";
+import {Button, Container, Typography} from "@mui/material";
+
+/**
+ * Overlay that appears upon entering "subgraph highlight mode" that displays information about the subgraph
+ *
+ * Note:
+ * - Uses custom FloatingPanel component
+ * - Uses DndContext, necessary for components created with dnd-kit to have drag functionality
+ */
+export const NetworkGraphSubGraphOverlay = () => {
+ const { overlayOn } = useNetworkGraph();
+
+ if (!overlayOn) return null;
+
+ return (
+
+
+
+
+ Total nodes:
+
+
+
+
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/client/src/features/NetworkGraph/config/paths.ts b/client/src/features/NetworkGraph/config/paths.ts
new file mode 100644
index 0000000..23fea10
--- /dev/null
+++ b/client/src/features/NetworkGraph/config/paths.ts
@@ -0,0 +1,7 @@
+/**
+ * This file exposes the base path utilized by a hook to load the relevant Network Graph data for a user-specified project
+ */
+
+import { PROJECTS_DIRECTORY, TARGET_PROJECT } from "@/config/app.ts";
+
+export const BASE_PATH = `/${PROJECTS_DIRECTORY}/${TARGET_PROJECT}`;
\ No newline at end of file
diff --git a/client/src/features/NetworkGraph/hooks/useInitialPhysicsSimulation.ts b/client/src/features/NetworkGraph/hooks/useInitialPhysicsSimulation.ts
new file mode 100644
index 0000000..4d2a220
--- /dev/null
+++ b/client/src/features/NetworkGraph/hooks/useInitialPhysicsSimulation.ts
@@ -0,0 +1,155 @@
+import { useEffect } from "react";
+import { forceSimulation, forceLink, forceX, forceY, forceCollide, forceManyBody } from "d3";
+import type { Simulation } from "d3";
+import type { Node, Link, HubLink, Group } from "@/features/NetworkGraph/types/network-graph.types.ts"
+import {useNetworkGraph} from "@/features/NetworkGraph/stores/network-graph-context.tsx";
+
+type NodeGroupCenters = {
+ people: [number, number];
+ mail: [number, number];
+ file: [number, number];
+ issue: [number, number];
+}
+
+/**
+ * Runs physics simulation to determine initial position of nodes and links in the Network Graph.
+ * Accepts a function as a parameter which it will execute once the simulation finishes.
+ * Mutates node and link objects to have x and y coordinates, sets them according to simulation results.
+ *
+ * Note:
+ * - D3.js force simulation is used to calculate the positions of all nodes and links
+ * - Nodes and link objects are mutated by D3.js force simulation to contain position values x and y
+ *
+ * Usage:
+ * - Call it in a NetworkGraphCanvas component
+ */
+export function useInitialPhysicsSimulation(renderNetworkGraph: () => void) {
+
+ const {
+ nodes,
+ links,
+ canvasRef
+ } = useNetworkGraph();
+
+ useEffect(() => {
+ if (!canvasRef.current) return;
+ if (!nodes.length || !links.length) return;
+
+ const canvas = canvasRef.current;
+ if (!canvas) return;
+
+ // Strength of node gravity
+ const forceStrength = -100;
+
+ // Arbitrary scalar that changes the size of the nodes, 11 seemed to be the nicest
+ const nodeRadiusMultiplier = 11;
+
+ // Padding between nodes (so they don't cling tightly to each other and instead are separated by a small amount of space)
+ const nodePadding = 6;
+
+ // Calculates the positions of the hubs, the hub is the center of a network, each node type has one hub which the other nodes are gravitated to
+ const c = calculateNodeGroupCenters(canvas.width, canvas.height);
+
+ // Decides which node in each type network will be the hub of its network.
+ const hubs = buildHubs(nodes);
+
+ // Create links for the physics simulation between hub nodes and their surrounding nodes
+ const hubLinks: HubLink[] = buildHubLinks(nodes, hubs);
+
+ /**
+ * Creates a D3.js force simulation with the nodes and links provided.
+ *
+ * Look into the documentation for D3.js forceSimulation for more detail.
+ */
+ const sim = forceSimulation(nodes)
+ .force("link", forceLink(links).id(d => d.id).distance(80).strength(0.05))
+ .force("hubLinks", forceLink(hubLinks).distance(40).strength(0.2))
+ .force("x", forceX(d => c[d.group][0]).strength(0.2))
+ .force("y", forceY(d => c[d.group][1]).strength(0.2))
+ .force("collide", forceCollide().radius(d => d.value * nodeRadiusMultiplier + nodePadding))
+ .force("charge", forceManyBody().strength(forceStrength));
+
+ /**
+ * Set the simulation alpha to 1 (this is like the start of the simulation where nothing has happened)
+ */
+ sim.alpha(1);
+
+ /**
+ * Run the simulation for an arbitrary amount of ticks, 300 seemed to be the best.
+ */
+ for (let i = 0; i < 300; i++) sim.tick();
+
+ /**
+ * Zeroes out any remaining forces
+ */
+ clearForces(sim as Simulation);
+
+ /**
+ * Stops the simulation
+ */
+ sim.stop();
+
+ // Finally, draw the Network Graph with its updated state
+ renderNetworkGraph();
+
+ }, [nodes, links, canvasRef, renderNetworkGraph]);
+}
+
+/**
+ * Helper function for calculating node group centers, the values inside are arbitrary, this can be modularized more in the future,
+ * for now there are four node types, and four positions.
+ */
+function calculateNodeGroupCenters(canvasWidth: number, canvasHeight: number): NodeGroupCenters {
+ return {
+ people: [canvasWidth * 0.5, canvasHeight * 0.5],
+ mail: [canvasWidth * 0.8, canvasHeight * 0.4],
+ file: [canvasWidth * 0.25, canvasHeight * 0.5],
+ issue: [canvasWidth * 0.8, canvasHeight * 0.6],
+ }
+}
+
+/**
+ * Helper function for determining the hub node for each node network
+ */
+function buildHubs(nodes: Node[]) {
+ const hubs: Partial> = {};
+
+ for (const n of nodes) {
+ const existing = hubs[n.group];
+ if (!existing || n.value > existing.value) {
+ hubs[n.group] = n;
+ }
+ }
+
+ return hubs;
+}
+
+/**
+ * Helper function for creating the links between each hub node and its surrounding nodes (part of the simulation)
+ */
+function buildHubLinks(nodes: Node[], hubs: Partial>) {
+ return nodes
+ .filter(n => hubs[n.group] && !isHub(n, hubs as Record))
+ .map(n => ({ source: hubs[n.group]!, target: n }));
+}
+
+/**
+ * Helper function for determining if a node is the hub
+ */
+function isHub (d: Node, hubs: Record) {
+ return hubs[d.group] === d;
+}
+
+/**
+ * Clears all forces used in simulation.
+ */
+function clearForces(sim: Simulation) {
+ sim
+ .force('x', null)
+ .force('y', null)
+ .force('collide', null)
+ .force('charge', null)
+ .force('link', null)
+ .force('hubLinks', null)
+ .velocityDecay(1); // stop inertia
+}
\ No newline at end of file
diff --git a/client/src/features/NetworkGraph/hooks/useNetworkGraphData.ts b/client/src/features/NetworkGraph/hooks/useNetworkGraphData.ts
new file mode 100644
index 0000000..df38fff
--- /dev/null
+++ b/client/src/features/NetworkGraph/hooks/useNetworkGraphData.ts
@@ -0,0 +1,58 @@
+import { useEffect, useState } from 'react';
+import { BASE_PATH } from "@/features/NetworkGraph/config/paths.ts";
+
+import type { NetworkGraphData } from "@/features/NetworkGraph/types/network-graph.types.ts";
+
+const GRAPH_FILES = ['file-graph-data.json', 'issue-graph-data.json', 'mail-graph-data.json', 'person-graph-data.json'];
+
+type NetworkGraphJsonData = {[filename: string]: NetworkGraphData};
+
+/**
+ * Loads all network graph data for project specified in user.config.yaml
+ */
+export function useNetworkGraphData(){
+ const [graphData, setGraphData] = useState({ nodes: [], links: [] });
+
+ useEffect(() => {
+ async function load() {
+ const jsonData: NetworkGraphJsonData = await readAllJsonsFromDirectory(BASE_PATH);
+
+ // Initialize an empty NetworkGraphData object
+ const compiledGraphData : NetworkGraphData = { nodes: [], links: [] };
+
+ // For each file, extract the nodes
+ for (const value of Object.values(jsonData)) {
+ compiledGraphData.nodes.push(... value.nodes);
+ compiledGraphData.links.push(... value.links);
+ }
+
+ setGraphData(compiledGraphData);
+ }
+
+ load();
+ }, []);
+
+ return graphData;
+}
+
+/**
+ * Loads all .json files from project specified in user.config.yaml
+ */
+async function readAllJsonsFromDirectory(filePath: string): Promise {
+ const entries = await Promise.all(
+ GRAPH_FILES.map(async (fileName) => {
+ const res = await fetch(filePath + '/' + fileName);
+
+ if (!res.ok) {
+ throw new Error(`Failed to load ${fileName}: ${res.status} ${res.statusText}`);
+ }
+
+ const json = await res.json();
+ return [fileName, json] as const;
+ }),
+ );
+
+ // object keyed by file name:
+ return Object.fromEntries(entries);
+}
+
diff --git a/client/src/features/NetworkGraph/hooks/useNetworkGraphInteractions.ts b/client/src/features/NetworkGraph/hooks/useNetworkGraphInteractions.ts
new file mode 100644
index 0000000..848ef5a
--- /dev/null
+++ b/client/src/features/NetworkGraph/hooks/useNetworkGraphInteractions.ts
@@ -0,0 +1,128 @@
+import { useEffect } from "react";
+import { type Node } from "@/features/NetworkGraph/types/network-graph.types.ts"
+import { drag, type DragBehavior, pointer, select } from "d3";
+import {
+ setAllNodesToBeOpaque,
+ setAllNodesToBeTransparent,
+ setNodeNeighborhoodToBeOpaque
+} from "@/features/NetworkGraph/utils/transparent-node-map.ts";
+import {useNetworkGraph} from "@/features/NetworkGraph/stores/network-graph-context.tsx";
+
+/**
+ * Allows a network graph that is rendered to a canvas to become interactable to the user.
+ * It creates the listeners for user interaction and also runs the logic for each listener.
+ *
+ * Currently supported user interactions
+ * - Double-click detection
+ * - Drag detection
+ */
+export function useNetworkGraphInteractions(renderNetworkGraph: () => void) {
+
+ const {
+ nodes,
+ links,
+ canvasRef,
+ overlayOn,
+ setOverlayOn,
+ nodeRelationshipMapRef,
+ transparentNodeMapRef,
+ } = useNetworkGraph();
+
+ useEffect(() => {
+ if (!canvasRef.current) return;
+
+ const canvas = canvasRef.current;
+ if (!canvas) return;
+
+ // Can be adjusted but is arbitrarily set to 11
+ const nodeRadiusMultiplier = 11;
+
+ // Creates drag behavior
+ const dragBehavior = createDragBehavior(canvas, nodes, nodeRadiusMultiplier, renderNetworkGraph);
+
+ // Attaches drag behavior to the canvas
+ select(canvas).call(dragBehavior as DragBehavior);
+
+ /**
+ * Double-click handler that captures the location of the mouse pointer and triggers the highlight interaction.
+ *
+ * Flow:
+ * 1. Whenever the canvas is double-clicked, check the position of the mouse pointer.
+ * 2. If the mouse pointer is over a node, then target that node and its related nodes according to the relationship map
+ * 3. Update transparency values depending on current highlight state (is the overlay enabled? or is it disabled)
+ */
+ const handleDblClick = (event: MouseEvent) => {
+ const [x, y] = pointer(event, canvas);
+ const hit = findNodeAt(nodes, nodeRadiusMultiplier, x, y,);
+
+ if (hit) {
+ if (!overlayOn) {
+ setAllNodesToBeTransparent(transparentNodeMapRef.current);
+ setNodeNeighborhoodToBeOpaque(hit.id, transparentNodeMapRef.current, nodeRelationshipMapRef.current);
+ setOverlayOn(true);
+ } else {
+ setAllNodesToBeOpaque(transparentNodeMapRef.current)
+ setOverlayOn(false);
+ }
+ }
+ };
+
+ // Creates double-click listener that triggers double-click handler and attaches it to the canvas
+ select(canvas).on("dblclick", handleDblClick);
+
+ // Clean-up function that disconnects listener when the hook is no longer in use.
+ return () => {
+ select(canvas).on(".drag", null).on("dblclick", null);
+ };
+ }, [nodes, links, canvasRef, setOverlayOn, transparentNodeMapRef, nodeRelationshipMapRef, overlayOn, renderNetworkGraph ]);
+}
+
+/**
+ * Helper function that creates a D3.js drag behavior
+ * - Updates node position to position of pointer while the node is being dragged
+ * - Renders the graph with each tick of a drag
+ */
+function createDragBehavior(
+ canvas: HTMLCanvasElement,
+ nodes: Node[],
+ nodeRadiusMultiplier: number,
+ renderNetworkGraph: () => void) {
+
+ return drag()
+ .subject((event) => {
+ const [x, y] = pointer(event, canvas);
+
+ // find nearest node within radius
+ const n = findNodeAt(nodes, nodeRadiusMultiplier, x, y);
+
+ if (n) {
+ n.fx = n.x ?? x;
+ n.fy = n.y ?? y;
+ }
+
+ return n;
+ })
+ .on('drag', (event) => {
+ const n = event.subject;
+ n.x = event.x;
+ n.y = event.y;
+ renderNetworkGraph();
+ });
+}
+
+
+/**
+ * Helper function that finds the topmost node under (x,y)
+ */
+function findNodeAt(nodes: Node[], nodeRadiusMultiplier: number, x: number, y: number) {
+ for (let i = nodes.length - 1; i >= 0; i--) {
+ const n = nodes[i];
+
+ const r = n.value * nodeRadiusMultiplier;
+ const dx = x - n.x!;
+ const dy = y - n.y!;
+
+ if (dx*dx + dy*dy <= r*r) return n;
+ }
+ return undefined;
+}
diff --git a/client/src/features/NetworkGraph/index.tsx b/client/src/features/NetworkGraph/index.tsx
new file mode 100644
index 0000000..bff5c8c
--- /dev/null
+++ b/client/src/features/NetworkGraph/index.tsx
@@ -0,0 +1,31 @@
+import Box from "@mui/material/Box";
+import { Navbar } from "@/components/ui/navbar/navbar.tsx";
+
+import { NetworkGraphProvider } from "@/features/NetworkGraph/stores/network-graph-context.tsx";
+import { NetworkGraphSearchBar } from "@/features/NetworkGraph/components/network-graph-search-bar/network-graph-search-bar.tsx";
+import { NetworkGraphCanvas } from "@/features/NetworkGraph/components/network-graph-canvas/network-graph-canvas.tsx";
+import { NetworkGraphSubGraphOverlay } from "@/features/NetworkGraph/components/network-graph-sub-graph-overlay/network-graph-sub-graph-overlay.tsx";
+
+/**
+ * Layout of the Network Graph
+ *
+ * Usage:
+ * - This is to be rendered in a route (a page of the application)
+ */
+export const NetworkGraph = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/client/src/features/NetworkGraph/lib/draw-network-graph.ts b/client/src/features/NetworkGraph/lib/draw-network-graph.ts
new file mode 100644
index 0000000..337ab7a
--- /dev/null
+++ b/client/src/features/NetworkGraph/lib/draw-network-graph.ts
@@ -0,0 +1,225 @@
+import type { Link, Node } from "@/features/NetworkGraph/types/network-graph.types.ts";
+import { isNullOrUndefined } from "@/utils/type-guards.ts";
+import type {Dispatch, SetStateAction} from "react";
+
+export function drawGraph(
+ canvas: HTMLCanvasElement,
+ nodes: Node[],
+ links: Link[],
+ transparentNodeMap: Map,
+ nodeRadiusMultiplier: number,
+ linkColor: string,
+ nodeOutlineColor: string,)
+{
+ const context = canvas.getContext("2d");
+ if (!context) return;
+
+ context.clearRect(0, 0, canvas.width, canvas.height);
+ context.strokeStyle = linkColor;
+ context.fillStyle = linkColor;
+
+ links.forEach((link) => {
+ const s = link.source;
+ const t = link.target;
+
+ if (isNullOrUndefined(s.x) && isNullOrUndefined(s.y)) return;
+
+ const dx = t.x - s.x;
+ const dy = t.y - s.y;
+ const len = Math.hypot(dx, dy);
+ if (len === 0) return;
+
+ const ux = dx / len;
+ const uy = dy / len;
+
+ const rSource = s.value * nodeRadiusMultiplier;
+ const rTarget = t.value * nodeRadiusMultiplier;
+ const headLength = 10;
+
+ const fromX = s.x + ux * rSource;
+ const fromY = s.y + uy * rSource;
+ const toX = t.x - ux * (rTarget + headLength * 0.5);
+ const toY = t.y - uy * (rTarget + headLength * 0.5);
+
+ drawArrow(context, fromX, fromY, toX, toY, headLength);
+ });
+
+ nodes.forEach((node) => {
+ drawNodeByGroup(node, context, transparentNodeMap, nodeRadiusMultiplier, nodeOutlineColor);
+ })
+
+}
+
+/**
+ * Helper function for drawing nodes
+ */
+function drawNodeByGroup(
+ node: Node,
+ context: CanvasRenderingContext2D,
+ transparentNodeMap: Map,
+ nodeRadiusMultiplier: number,
+ nodeOutlineColor: string) {
+
+ switch (node.group) {
+ case "people":
+ context.fillStyle = 'black';
+ break;
+ case "mail":
+ context.fillStyle = '#add8e6';
+ break;
+ case 'file':
+ context.fillStyle = '#fafad2';
+ break;
+ case 'issue':
+ context.fillStyle = '#0052cc';
+ }
+
+
+ const label = node.id;
+ if (!label) return;
+
+ // Draws the node
+ context.save();
+ if (transparentNodeMap.get(node.id) == 1) {
+ context.globalAlpha = 0.2;
+ }
+
+ context.beginPath();
+ context.arc(node.x, node.y, node.value * nodeRadiusMultiplier, 0, 2 * Math.PI);
+ context.fill();
+
+ // Outline
+ context.lineWidth = 1;
+ context.strokeStyle = nodeOutlineColor;
+ context.stroke();
+
+ // Set text attributes
+ const px = Math.round(Math.max(10, Math.min(24, node.value * nodeRadiusMultiplier * 0.6)));
+ context.font = `${px}px Roboto, sans-serif`;
+ context.textAlign = "center";
+ context.textBaseline = "middle";
+ context.fillStyle = 'black';
+
+ // If the node is of group people, then set text color to white (to contrast the black node)
+ if (node.group === 'people') {
+ context.fillStyle = 'white';
+ }
+
+ // Draws the text
+ context.fillText(label, node.x, node.y);
+ context.restore();
+}
+
+function drawArrow(
+ ctx: CanvasRenderingContext2D,
+ fromX: number,
+ fromY: number,
+ toX: number,
+ toY: number,
+ headLength = 10
+) {
+ const dx = toX - fromX;
+ const dy = toY - fromY;
+ const angle = Math.atan2(dy, dx);
+
+ ctx.beginPath();
+ ctx.moveTo(fromX, fromY);
+ ctx.lineTo(toX, toY);
+ ctx.stroke();
+
+ // Arrowhead
+ ctx.beginPath();
+ ctx.moveTo(toX, toY);
+ ctx.lineTo(
+ toX - headLength * Math.cos(angle - Math.PI / 6),
+ toY - headLength * Math.sin(angle - Math.PI / 6)
+ );
+ ctx.lineTo(
+ toX - headLength * Math.cos(angle + Math.PI / 6),
+ toY - headLength * Math.sin(angle + Math.PI / 6)
+ );
+ ctx.closePath();
+ ctx.fill();
+}
+
+/**
+ * Helper function for highlighting subgraph
+ */
+export function highlightSubgraph(
+ hitNodeId: string,
+ transparentNodeMap: Map,
+ nodeRelationshipMap: Map>,
+ setOverlayOn: Dispatch>,
+){
+
+ const current = transparentNodeMap.get(hitNodeId) ?? 0;
+
+ // Are we currently in "normal" mode? (everything opaque)
+ const allOpaque = Array.from(transparentNodeMap.values()).every(v => v === 0);
+
+ const highlightNeighborhood = () => {
+ // fade everything
+ for (const key of transparentNodeMap.keys()) {
+ transparentNodeMap.set(key, 1);
+ }
+
+ // make hit node + its related nodes opaque
+ const relatedNodeSet = nodeRelationshipMap.get(hitNodeId);
+ transparentNodeMap.set(hitNodeId, 0);
+ relatedNodeSet?.forEach(nodeId => {
+ transparentNodeMap.set(nodeId, 0);
+ });
+
+ setOverlayOn(true);
+ };
+
+ const clearAll = () => {
+ for (const key of transparentNodeMap.keys()) {
+ transparentNodeMap.set(key, 0);
+ }
+ };
+
+ if (allOpaque) {
+ // First time: go into "highlight" mode
+ highlightNeighborhood();
+ return;
+ }
+
+ // We're already in highlight mode (some nodes have value 1)
+
+ if (current === 0) {
+ // Clicked *inside* the highlighted group → reset to fully opaque
+ clearAll();
+ setOverlayOn(false);
+ } else {
+ // Clicked on a faded node → switch highlight to this node's group instead
+ highlightNeighborhood();
+ }
+}
+
+
+export function buildInitialTransparencyMap(nodes: Node[]) {
+ const map = new Map();
+ nodes.forEach(n => map.set(n.id, 0));
+ return map;
+}
+
+export function buildRelationshipMap(nodes: Node[], links: Link[]) {
+ const map = new Map>();
+
+ nodes.forEach((node) => {
+ const set = new Set();
+
+ links.forEach((link) => {
+ const sourceId = link.source.id;
+ const targetId = link.target.id;
+
+ if (sourceId === node.id) set.add(targetId);
+ else if (targetId === node.id) set.add(sourceId);
+ });
+
+ map.set(node.id, set);
+ });
+
+ return map;
+}
\ No newline at end of file
diff --git a/client/src/features/NetworkGraph/stores/network-graph-context.tsx b/client/src/features/NetworkGraph/stores/network-graph-context.tsx
new file mode 100644
index 0000000..a951fe2
--- /dev/null
+++ b/client/src/features/NetworkGraph/stores/network-graph-context.tsx
@@ -0,0 +1,86 @@
+import { type ReactNode, createContext, useContext, useState, type Dispatch, type SetStateAction, useRef,
+ type RefObject, useEffect
+} from 'react';
+
+import type { Node, Link } from "@/features/NetworkGraph/types/network-graph.types.ts"
+import { useNetworkGraphData } from "@/features/NetworkGraph/hooks/useNetworkGraphData.ts";
+import { buildInitialTransparencyMap, buildRelationshipMap } from "@/features/NetworkGraph/lib/draw-network-graph.ts";
+
+const NetworkGraphContext = createContext(null);
+
+
+/**
+ * This data is exposed to the children of the NetworkGraphProvider. It acts as a central source of truth for the Network Graph components.
+ */
+interface NetworkGraphContextValue {
+ // Array of d3.js node objects that have been extended with additional properties
+ nodes: Node[];
+
+ // Array of d3.js link objects that have been extended with additional properties
+ links: Link[];
+
+ // Reference object to HTML Canvas upon which the Network Graph will be drawn, survives React DOM re-renders
+ canvasRef: RefObject
+
+ // Current highlight state, is determined by whether or whether not the subgraph overlay is active
+ overlayOn: boolean;
+
+ // Function to set the current highlight state
+ setOverlayOn: Dispatch>;
+
+ // Reference object to a map with each node's id as a key, and a set of their related nodes as values, survives React DOM re-renders
+ nodeRelationshipMapRef: RefObject