diff --git a/.gitignore b/.gitignore index ea15021..e92ccd0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,6 @@ __pycache__ .wheels .vendor .python3-deb -SRV/storage/devices/devices.json -SRV/storage/wifi/wifi.json \ No newline at end of file +SRV/storage/subnets/* +SRV/storage/wifi/wifi.json +build/ diff --git a/.woodpecker/.woodpecker.yml b/.woodpecker/.woodpecker.yml new file mode 100644 index 0000000..6220c93 --- /dev/null +++ b/.woodpecker/.woodpecker.yml @@ -0,0 +1,137 @@ +when: + event: manual + +steps: + checkout: + image: debian:latest + commands: + # ПОДГОТОВКА ГИТА И КЛОНИРОВАНИЕ GONETS + - apt update + - apt install -y git git-lfs + - git lfs install + + # УСТАНОВКА НЕОБХОДИМЫХ ЗАВИСИМОСТЕЙ НА СИСТЕМЕ + - apt update + - apt install -y python3 curl findutils grep sed openssh-server tree libnss3 libnss3-dev libnspr4 libnspr4-dev libasound2 libasound2-dev python3.11-venv python3-pip python3-poetry nodejs npm debhelper devscripts build-essential fakeroot dh-make dpkg-dev cmake libgirepository1.0-dev gobject-introspection libcairo2-dev pkg-config python3-dev libdbus-1-dev + - python3 --version + - node -v + - npm -v + raspberry + + # ПОДГОТОВКА СПИСКА PYTHON ЗАВИСИМОСТЕЙ GONETS + - rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + - rm -rf /root/.local/share/pypoetry + - rm -rf /root/.poetry + - rm -rf /usr/bin/poetry + - pip install pipx + - pipx ensurepath + - pipx install poetry + - echo 'export PATH="$HOME/.local/bin:$PATH"' >> /root/.bashrc + - . /root/.bashrc + - poetry --version + - cd SRV + - poetry env activate + - poetry add poetry-plugin-export + - poetry install + - poetry self update + - rm -f requirements.txt + - poetry run poetry export -f requirements.txt --output requirements.txt --without-hashes + + # ПОДГОТОВКА И СБОРКА FRONTEND ЧАСТИ GONETS + - pwd + - cd .. + - pwd + - cd FRONT/DEV + - pwd + - npm install + - npm run package + - cd dist/gonets-linux-x64/resources/app + - pwd + - npm run build + - sed -i 's#href="/assets/#href="./assets/#g' dist/index.html + - sed -i 's#src="/assets/#src="./assets/#g' dist/index.html + - cd ../../../../.. + - pwd + - rm -rf BUILD/* + - cp -r DEV/dist/gonets-linux-x64/* BUILD/ + - rm -rf DEV + + # ИНИЦИАЛИЗАЦИЯ DEBIAN КОНФИГУРАЦИЙ ДЛЯ СБОРКИ + - cd .. + - pwd + - cd .. + - pwd + - mv gonets gonets-0.1 + - cd gonets-0.1 + - pwd + - ls + - DEBEMAIL="devteam@gossys.dev" DEBFULLNAME="GOSSYS LLC" dh_make --single -y --createorig + - cd debian/ + - rm -f *.ex + - rm -f README.* + + # КЛОНИРОВАНИЕ НЕОБХОДИМЫХ ШАБЛОНОВ КОНФИГОВ ДЕБИАНА ДЛЯ СБОРКИ + - mkdir -p /woodpecker/src/dev.gossys.dev/HybrydMain/templates + - git clone https://s.galanskiy:${GONETS}@dev.gossys.dev/s.galanskiy/gonets-debian-template.git /woodpecker/src/dev.gossys.dev/HybrydMain/templates + - mv /woodpecker/src/dev.gossys.dev/HybrydMain/templates/changelog /woodpecker/src/dev.gossys.dev/HybrydMain/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/HybrydMain/templates/control /woodpecker/src/dev.gossys.dev/HybrydMain/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/HybrydMain/templates/copyright /woodpecker/src/dev.gossys.dev/HybrydMain/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/HybrydMain/templates/install /woodpecker/src/dev.gossys.dev/HybrydMain/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/HybrydMain/templates/postinst /woodpecker/src/dev.gossys.dev/HybrydMain/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/HybrydMain/templates/postrm /woodpecker/src/dev.gossys.dev/HybrydMain/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/HybrydMain/templates/rules /woodpecker/src/dev.gossys.dev/HybrydMain/gonets-0.1/debian/ + + # СБОРКА ДЕБИАН ПАКЕТА + - cd .. + - pwd + - dpkg-buildpackage -us -uc -b + + # ИЗВЛЕЧЕНИЕ ВЕРСИИ ПАКЕТА ДЛЯ КОММИТА + - VERSION=$(dpkg-parsechangelog -l./debian/changelog --show-field Version) + - echo "VERSION=$VERSION" > version.env + + # КОММИТ И ТЕГ НА ВЕТКУ DEVELOP + - . ./version.env + - git config user.name "s.galanskiy" + - git config user.email "s.galanskiy@gossys.dev" + - git fetch --all --prune + - git branch -r + - git checkout -b "release/$VERSION" + - git commit -am "Релиз $VERSION" + - git tag -f "v$VERSION" + - git push "https://s.galanskiy:b4785198d18200dfed812dc4299575f736255bd7@dev.gossys.dev/HybrydMain/gonets.git" "release/$VERSION" + - git push -f https://s.galanskiy:b4785198d18200dfed812dc4299575f736255bd7@dev.gossys.dev/HybrydMain/gonets.git "v$VERSION" + + # СОЗДАНИЕ И ЗАГРУЗКА РЕЛИЗА ЧЕРЕЗ API + - | + VERSION=$(dpkg-parsechangelog -l./debian/changelog --show-field Version) + echo "VERSION=$VERSION" > version.env + + # Задать переменные + . ./version.env + TAG="v$VERSION" + + DEB_PATH=$(find .. -maxdepth 1 -type f -name "gonets_*_amd64.deb" | head -n 1) + + if [ ! -f "$DEB_PATH" ]; then + echo ".deb файл не найден по пути: $DEB_PATH" + exit 1 + fi + + RELEASE_JSON=$(curl -s -X POST "https://dev.gossys.dev/api/v1/repos/HybrydMain/gonets/releases" \ + -H "Authorization: token b4785198d18200dfed812dc4299575f736255bd7" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\": \"$TAG\", \"name\": \"Релиз $TAG\", \"body\": \"Сборка .deb пакета для версии $TAG\", \"draft\": false, \"prerelease\": true}") + + RELEASE_ID=$(echo "$RELEASE_JSON" | grep '"id":' | head -n1 | sed 's/[^0-9]*\([0-9]*\).*/\1/') + + if [ -z "$RELEASE_ID" ]; then + echo "Не удалось получить ID релиза из ответа:" + echo "$RELEASE_JSON" + exit 1 + fi + + curl -s -X POST \ + -H "Authorization: token b4785198d18200dfed812dc4299575f736255bd7" \ + -F "attachment=@$DEB_PATH" \ + "https://dev.gossys.dev/api/v1/repos/HybrydMain/gonets/releases/$RELEASE_ID/assets" || echo "Ошибка загрузки файла" \ No newline at end of file diff --git a/FRONT/BUILD/index.html b/FRONT/BUILD/index.html new file mode 100644 index 0000000..8f4d4d1 --- /dev/null +++ b/FRONT/BUILD/index.html @@ -0,0 +1,13 @@ + + + + + GoNets + + + + + +
+ + \ No newline at end of file diff --git a/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx b/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx index 0345346..cfed6c4 100644 --- a/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx +++ b/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx @@ -100,7 +100,7 @@ const DeviceCard: React.FC = ({ device, status }) => { - {device.hostname || device.ip} + {device.hostname || 'Неизвестно'} diff --git a/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx b/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx index 320f625..e1b8c6f 100644 --- a/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx +++ b/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx @@ -87,7 +87,7 @@ const TableScanner = ({devices}:TableScannerProps) => { {devices.map((item, i) => ( - {item.hostname || item.ip} + {item.hostname || 'Неизвестен'} {item.vendor} {item.ip} {item.open_ports.join(', ') || '-'} diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx index 5c0099e..1075a09 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx @@ -31,7 +31,7 @@ const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps return ( <> - {devices.length > 0 ? 'Обновить список' : 'Сканировать узлы подсети'} + {devices.length > 0 ? 'Обновить список' : 'Сканировать сеть'} {devices.length > 0 ? ( diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx index cd2e9c4..ebe71a9 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx @@ -30,7 +30,7 @@ const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps return ( <> - {devices.length > 0 ? 'Обновить список' : 'Сканировать узлы подсети'} + {devices.length > 0 ? 'Обновить список' : 'Сканировать сеть'} {devices.length > 0 ? ( diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx index dd3f035..cb816ca 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx @@ -163,7 +163,7 @@ export default function UserScanner() { return ( - {(!scanInitiated || loading) && (Сканирование узлов в подсети)} + {(!scanInitiated || loading) && (Сканирование пользователей в сети)} @@ -177,7 +177,7 @@ export default function UserScanner() { {loading ? ( - Сканирование узлов в подсети + Сканирование сети ) : selectedView.value == 1 ? ( diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx index 9cabdd7..b24e367 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx @@ -161,7 +161,7 @@ export function WifiScanner() { return ( - Сканирование точек доступа Wi-Fi + Сканирование Wi-Fi сети @@ -186,11 +186,11 @@ export function WifiScanner() { {loading ? ( - Сканирование точек доступа + Сканирование сети ) : ( 0 }> - {wifiNetworks.length > 0 ? 'Обновить список' : 'Сканировать точки доступа'} + {wifiNetworks.length > 0 ? 'Обновить список' : 'Сканировать сеть'} )} diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx index 1996ddd..d0325ef 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx @@ -76,7 +76,7 @@ export const NetworkInterfaces = ({ startConnection, ws }: Props) => { setHasInited(false) initializationAttempt.current = 0; - const newSocket = new WebSocket(`wss://${ws}:8001/api/v1`); + const newSocket = new WebSocket(`ws://${ws}:8001/api/v1`); let connectionTimeout; setSocket(newSocket); diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx index 8b919f4..dd5ca2b 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx @@ -115,7 +115,7 @@ export const DevicesBar = () => { const checkWebSocketAvailability = async (ip: string): Promise => { return new Promise((resolve) => { - const testSocket = new WebSocket(`wss://${ip}:8001/api/v1`); + const testSocket = new WebSocket(`ws://${ip}:8001/api/v1`); const timeout = setTimeout(() => { testSocket.close(); resolve(false); diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/.gitignore b/FRONT/DEV/.gitignore similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/.gitignore rename to FRONT/DEV/.gitignore diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/assets/icon.png b/FRONT/DEV/assets/icon.png similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/assets/icon.png rename to FRONT/DEV/assets/icon.png diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/eslint.config.js b/FRONT/DEV/eslint.config.js similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/eslint.config.js rename to FRONT/DEV/eslint.config.js diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/index.html b/FRONT/DEV/index.html similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/index.html rename to FRONT/DEV/index.html diff --git a/FRONT/DEV/index.tsx b/FRONT/DEV/index.tsx new file mode 100644 index 0000000..eb6f456 --- /dev/null +++ b/FRONT/DEV/index.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import { HashRouter } from 'react-router-dom'; +import { useIpStore } from './src/store'; +import { useEffect } from 'react'; +import { useCheckAdmin } from './src/utils/checkAdmin'; + +import { + ModalProvider, + useModalContext, + ThemeProvider +} from './src/store'; + +import WindowComponent from './src/components/modalwindows/modalWindow'; +import Router from './src/router'; +import { I18nProvider } from "./src/utils/i18n/provider"; +import { useLanguage } from "./src/hooks/useSettings"; + +const AppWithProviders = () => { + const currentLanguage = useLanguage(); + + return ( + + + + + + + + + + ); +}; + +const MainComponent = () => { + const checkAdmin = useCheckAdmin(); + const { ipAddress } = useIpStore(); + + useEffect(() => { + const checkAdminStatus = async () => { + await checkAdmin(); + }; + checkAdminStatus(); + }, [ipAddress]); + + const { isOpen, modalType, modalData } = useModalContext(); + return ( + <> + + + + ); +}; + +const container = document.getElementById('root'); +if (!container) { + throw new Error('Root element with id "root" not found'); +} + +const root = createRoot(container); +root.render(); \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/main.js b/FRONT/DEV/main.js similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/main.js rename to FRONT/DEV/main.js diff --git a/FRONT/DEV/package-lock.json b/FRONT/DEV/package-lock.json new file mode 100644 index 0000000..f219eda --- /dev/null +++ b/FRONT/DEV/package-lock.json @@ -0,0 +1,4966 @@ +{ + "name": "gonets", + "version": "0.0.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gonets", + "version": "0.0.2", + "dependencies": { + "@iconify/icons-ic": "^1.2.13", + "@iconify/icons-ph": "^1.2.5", + "@iconify/react": "^5.2.0", + "@reduxjs/toolkit": "^2.6.0", + "@xyflow/react": "^12.3.5", + "axios": "^1.7.9", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-flow-renderer": "^10.3.17", + "react-redux": "^9.2.0", + "react-router-dom": "^7.0.2", + "styled-components": "^6.1.13", + "zustand": "^5.0.3" + }, + "devDependencies": { + "@iconify-json/ic": "^1.2.2", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@vitejs/plugin-basic-ssl": "^2.0.0", + "@vitejs/plugin-react": "^4.4.1", + "electron": "^39.2.3", + "electron-packager": "^17.1.2", + "esbuild-wasm": "^0.17.12", + "typescript": "^4.9.5", + "vite": "^6.3.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.18", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz", + "integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.2.tgz", + "integrity": "sha512-KqVlm9WMWq19lBpCXQoThC/Koaiji2zotUDYwZDaZlZZym+FXY9mQW8wN6sUQ93nkVc42f3TQ1S/XN9S1kjM5Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", + "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", + "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", + "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", + "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", + "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", + "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", + "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", + "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", + "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", + "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", + "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", + "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", + "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", + "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", + "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", + "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", + "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", + "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", + "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", + "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", + "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", + "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", + "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", + "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", + "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@iconify-json/ic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@iconify-json/ic/-/ic-1.2.2.tgz", + "integrity": "sha512-QmjwS3lYiOmVWgTCEOTFyGODaR/+689+ajep/VsrCcsUN0Gdle5PmIcibDsdmRyrOsW/E77G41UUijdbjQUofw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/icons-ic": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@iconify/icons-ic/-/icons-ic-1.2.13.tgz", + "integrity": "sha512-TphrhwOvgd7CTmUhz6jgXF+SPnMtvTm03bZsAYbny2kwq4zlkhr9e16YEyPGMvKhjtTqNooA3iZ9Wa+pZ8moXQ==", + "license": "Apache-2.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/icons-ph": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@iconify/icons-ph/-/icons-ph-1.2.5.tgz", + "integrity": "sha512-ewrnpL0u3MAP0wLDnXb/39W9W71ObyY8DNig6rYj7NEwcndWWlrGHt1RxEGYE3eqILl/IUcNIQQF1CXZAhwr/w==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@iconify/react/-/react-5.2.0.tgz", + "integrity": "sha512-7Sdjrqq3fkkQNks9SY3adGC37NQTHsBJL2PRKlQd455PoDi9s+Es9AUTY+vGLFOYs5yO9w9yCE42pmxCwG26WA==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.6.0.tgz", + "integrity": "sha512-mWJCYpewLRyTuuzRSEC/IwIBBkYg2dKtQas8mty5MaV2iXzcmicS3gW554FDeOvLnY3x13NIk8MB1e8wHO7rqQ==", + "license": "MIT", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", + "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", + "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", + "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", + "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", + "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", + "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", + "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", + "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", + "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", + "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", + "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", + "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", + "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", + "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", + "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", + "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", + "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", + "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", + "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", + "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", + "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz", + "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==", + "license": "MIT" + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.0.0.tgz", + "integrity": "sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", + "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xyflow/react": { + "version": "12.3.5", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.3.5.tgz", + "integrity": "sha512-wAYqpicdrVo1rxCu0X3M9s3YIF45Agqfabw0IBryTGqjWvr2NyfciI8gIP4MB+NKpWWN5kxZ9tiZ9u8lwC7iAg==", + "license": "MIT", + "dependencies": { + "@xyflow/system": "0.0.46", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/react/node_modules/zustand": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.6.tgz", + "integrity": "sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.46.tgz", + "integrity": "sha512-bmFXvboVdiydIFZmDCjrbBCYgB0d5pYdkcZPWbAxGmhMRUZ+kW3CksYgYxWabrw51rwpWitLEadvLrivG0mVfA==", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001716", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", + "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn-windows-exe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", + "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@malept/cross-spawn-promise": "^1.1.0", + "is-wsl": "^2.2.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron": { + "version": "39.2.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-39.2.3.tgz", + "integrity": "sha512-j7k7/bj3cNA29ty54FzEMRUoqirE+RBQPhPFP+XDuM93a1l2WcDPiYumxKWz+iKcXxBJLFdMIAlvtLTB/RfCkg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-packager": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", + "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==", + "deprecated": "Please use @electron/packager moving forward. There is no API change, just a package name change", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^2.0.0", + "@electron/notarize": "^1.2.3", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^1.3.2", + "cross-spawn-windows-exe": "^1.2.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^3.0.1", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 14.17.5" + }, + "funding": { + "url": "https://github.com/electron/electron-packager?sponsor=1" + } + }, + "node_modules/electron-packager/node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/electron-packager/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-packager/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-packager/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.145", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.145.tgz", + "integrity": "sha512-pZ5EcTWRq/055MvSBgoFEyKf2i4apwfoqJbK/ak2jnFq8oHjZ+vzc3AhRcz37Xn+ZJfL58R666FLJx0YOK9yTw==", + "dev": true, + "license": "ISC" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", + "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.3", + "@esbuild/android-arm": "0.25.3", + "@esbuild/android-arm64": "0.25.3", + "@esbuild/android-x64": "0.25.3", + "@esbuild/darwin-arm64": "0.25.3", + "@esbuild/darwin-x64": "0.25.3", + "@esbuild/freebsd-arm64": "0.25.3", + "@esbuild/freebsd-x64": "0.25.3", + "@esbuild/linux-arm": "0.25.3", + "@esbuild/linux-arm64": "0.25.3", + "@esbuild/linux-ia32": "0.25.3", + "@esbuild/linux-loong64": "0.25.3", + "@esbuild/linux-mips64el": "0.25.3", + "@esbuild/linux-ppc64": "0.25.3", + "@esbuild/linux-riscv64": "0.25.3", + "@esbuild/linux-s390x": "0.25.3", + "@esbuild/linux-x64": "0.25.3", + "@esbuild/netbsd-arm64": "0.25.3", + "@esbuild/netbsd-x64": "0.25.3", + "@esbuild/openbsd-arm64": "0.25.3", + "@esbuild/openbsd-x64": "0.25.3", + "@esbuild/sunos-x64": "0.25.3", + "@esbuild/win32-arm64": "0.25.3", + "@esbuild/win32-ia32": "0.25.3", + "@esbuild/win32-x64": "0.25.3" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", + "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", + "dev": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flora-colossus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", + "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/flora-colossus/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/flora-colossus/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/flora-colossus/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/galactus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", + "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/galactus/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/galactus/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/galactus/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-package-info/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/get-package-info/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rcedit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn-windows-exe": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-flow-renderer": { + "version": "10.3.17", + "resolved": "https://registry.npmjs.org/react-flow-renderer/-/react-flow-renderer-10.3.17.tgz", + "integrity": "sha512-bywiqVErlh5kCDqw3x0an5Ur3mT9j9CwJsDwmhmz4i1IgYM1a0SPqqEhClvjX+s5pU4nHjmVaGXWK96pwsiGcQ==", + "deprecated": "react-flow-renderer has been renamed to reactflow, please use this package from now on https://reactflow.dev/docs/guides/migrate-to-v11/", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@types/d3": "^7.4.0", + "@types/resize-observer-browser": "^0.1.7", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^3.7.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "16 || 17 || 18", + "react-dom": "16 || 17 || 18" + } + }, + "node_modules/react-flow-renderer/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "license": "MIT", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.2.tgz", + "integrity": "sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.2.tgz", + "integrity": "sha512-yk1XW8Fj7gK7flpYBXF3yzd2NbX6P7Kxjvs2b5nu1M04rb5pg/Zc4fGdBNTeT4eDYL2bvzWNyKaIMJX/RKHTTg==", + "license": "MIT", + "dependencies": { + "react-router": "7.5.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", + "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.1", + "@rollup/rollup-android-arm64": "4.40.1", + "@rollup/rollup-darwin-arm64": "4.40.1", + "@rollup/rollup-darwin-x64": "4.40.1", + "@rollup/rollup-freebsd-arm64": "4.40.1", + "@rollup/rollup-freebsd-x64": "4.40.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", + "@rollup/rollup-linux-arm-musleabihf": "4.40.1", + "@rollup/rollup-linux-arm64-gnu": "4.40.1", + "@rollup/rollup-linux-arm64-musl": "4.40.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-musl": "4.40.1", + "@rollup/rollup-linux-s390x-gnu": "4.40.1", + "@rollup/rollup-linux-x64-gnu": "4.40.1", + "@rollup/rollup-linux-x64-musl": "4.40.1", + "@rollup/rollup-win32-arm64-msvc": "4.40.1", + "@rollup/rollup-win32-ia32-msvc": "4.40.1", + "@rollup/rollup-win32-x64-msvc": "4.40.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/styled-components": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", + "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.38", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "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 + } + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/package.json b/FRONT/DEV/package.json similarity index 97% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/package.json rename to FRONT/DEV/package.json index 304540a..4ddb719 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/package.json +++ b/FRONT/DEV/package.json @@ -30,7 +30,7 @@ "@types/react-dom": "^18.0.11", "@vitejs/plugin-basic-ssl": "^2.0.0", "@vitejs/plugin-react": "^4.4.1", - "electron": "^34.0.2", + "electron": "^39.2.3", "electron-packager": "^17.1.2", "esbuild-wasm": "^0.17.12", "typescript": "^4.9.5", diff --git a/FRONT/DEV/preload.js b/FRONT/DEV/preload.js new file mode 100644 index 0000000..1ceb420 --- /dev/null +++ b/FRONT/DEV/preload.js @@ -0,0 +1,11 @@ +const { contextBridge, ipcRenderer } = require('electron'); + +contextBridge.exposeInMainWorld('electronAPI', { + send: (channel, data) => ipcRenderer.send(channel, data), + on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args)), + quitApp: () => ipcRenderer.send('quit-app'), + + showSaveDialog: (options) => ipcRenderer.invoke('show-save-dialog', options), + writeFile: (path, data) => ipcRenderer.invoke('write-file', { path, data }), + onThemeChange: (callback) => ipcRenderer.on('theme-update', (event, theme) => callback(theme)) +}); \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/back1.svg b/FRONT/DEV/public/assets/images/back1.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/back1.svg rename to FRONT/DEV/public/assets/images/back1.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/bigLogo.svg b/FRONT/DEV/public/assets/images/bigLogo.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/bigLogo.svg rename to FRONT/DEV/public/assets/images/bigLogo.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/bukvi.svg b/FRONT/DEV/public/assets/images/bukvi.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/bukvi.svg rename to FRONT/DEV/public/assets/images/bukvi.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/cancel.svg b/FRONT/DEV/public/assets/images/cancel.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/cancel.svg rename to FRONT/DEV/public/assets/images/cancel.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/check.svg b/FRONT/DEV/public/assets/images/check.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/check.svg rename to FRONT/DEV/public/assets/images/check.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/edit.svg b/FRONT/DEV/public/assets/images/edit.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/edit.svg rename to FRONT/DEV/public/assets/images/edit.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/ethernet.svg b/FRONT/DEV/public/assets/images/ethernet.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/ethernet.svg rename to FRONT/DEV/public/assets/images/ethernet.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/gossys.png b/FRONT/DEV/public/assets/images/gossys.png similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/gossys.png rename to FRONT/DEV/public/assets/images/gossys.png diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/logo.svg b/FRONT/DEV/public/assets/images/logo.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/logo.svg rename to FRONT/DEV/public/assets/images/logo.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/signal.svg b/FRONT/DEV/public/assets/images/signal.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/signal.svg rename to FRONT/DEV/public/assets/images/signal.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/vite.svg b/FRONT/DEV/public/assets/images/vite.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/vite.svg rename to FRONT/DEV/public/assets/images/vite.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/vpn.svg b/FRONT/DEV/public/assets/images/vpn.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/vpn.svg rename to FRONT/DEV/public/assets/images/vpn.svg diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/wifi.svg b/FRONT/DEV/public/assets/images/wifi.svg similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/public/assets/images/wifi.svg rename to FRONT/DEV/public/assets/images/wifi.svg diff --git a/FRONT/DEV/public/locales/en/common.json b/FRONT/DEV/public/locales/en/common.json new file mode 100644 index 0000000..966fec1 --- /dev/null +++ b/FRONT/DEV/public/locales/en/common.json @@ -0,0 +1,186 @@ +{ + "userScanner-title": "Subnet Node Scanning", + "userScanner-visible": "Display Method", + "userScanner-loading": "Scanning nodes", + "userScanner-refresh": "Refresh List", + "userScanner-scan": "Scan Nodes", + "userScanner-notFound": "Nodes not found", + "tableScanner-online": "Online", + "tableScanner-name": "Name", + "tableScanner-vendor": "Vendor", + "tableScanner-ip": "IP Address", + "tableScanner-ports": "Open Ports", + "tableScanner-activity": "Last Activity", + "tableScanner-note": "Note", + "tableScanner-action": "Action", + "tableScanner-unknown": "Unknown", + "tableScanner-noData": "No data to display", + "listUsers-activeNodes": "Active Nodes", + "listUsers-inactiveNodes": "Inactive Nodes", + "ipInput-placeholder": "Enter IP", + "ipInput-error": "Enter a valid IP address", + "userScanner-visible_table": "Table", + "userScanner-visible_list": "List", + + "wifiScanner-title": "Wi-Fi Access Point Scanning", + "wifiScanner-scanning": "Scanning access points", + "wifiScanner-scanError": "Network scanning error", + "wifiScanner-refresh": "Refresh List", + "wifiScanner-scan": "Scan Access Points", + "wifiModal-bssid": "BSSID", + "wifiModal-vendor": "Vendor", + "wifiModal-signal": "Signal", + "wifiModal-channel": "Channel", + "wifiModal-encryption": "Encryption", + "wifiModal-frequency": "Frequency", + "wifiModal-hidden": "Hidden Network", + "wifiModal-note": "Note", + "wifiModal-connect": "Connect", + "wifiModal-disconnect": "Disconnect", + "wifiModal-unknown": "Unknown", + "wifiModal-none": "None", + "common-yes": "Yes", + "common-no": "No", + + "addNode": "Add Node", + "enterNodeAddress": "Enter node address...", + "connectionLost": "Connection Lost", + "serverDisconnected": "Server connection interrupted", + "checkAddressAndRetry": "Please check the address availability and try again", + "cancel": "Cancel", + "close": "Close", + "save": "Save", + "retry": "Retry", + "connect": "Connect", + "submit": "Submit", + "common-back": "Back", + "error": "Error", + "networkConnection": "Network Connection", + "enterPassword": "Enter password...", + "connectingAttempt": "Attempting to connect to the network", + "connectionError": "Network connection error", + "connectionErrorLog": "Connection error: ", + "customizeTable-title": "Subnet Node Table Customization", + + "wifiDisconnect-title": "Wi-Fi Network Disconnection", + "wifiDisconnect-confirm": "Confirm Disconnection", + "wifiDisconnect-message1": "You are about to disconnect from the network - ", + "wifiDisconnect-message2": " All active connections will be interrupted.", + "wifiDisconnect-disconnect": "Disconnect", + "wifiDisconnect-progress": "Disconnecting from the network", + + "ipChange-title": "IP Address Change", + "ipChange-checkingIp": "Checking IP address validity", + "ipChange-generalInfo": "General Information", + "ipChange-interface": "Interface", + "ipChange-ipInfo": "IP Information", + "ipChange-currentIp": "Current IP", + "ipChange-currentGateway": "Current Gateway", + "ipChange-currentDns": "Current DNS", + "ipChange-newIp": "New IP", + "ipChange-newGateway": "New Gateway", + "ipChange-newDns": "New DNS", + "ipChange-checkError": "An error occurred while checking validity", + "ipChange-adminRequired": "To change network settings, you must log in as an administrator", + + "note-edit": "Edit Note", + "note-add": "Add Note", + "note-enter": "Enter note...", + + "auth-successLogin": "Successful Login", + "auth-successLogout": "Successful Logout", + "auth-getAccess": "Obtaining Access Rights", + "auth-enableAdmin": "Enable Administrative Access", + "auth-enterAdminPass": "Enter administrator password...", + "auth-wrongPass": "Incorrect operator password", + "auth-switchToLimited": "Switch to Limited Access", + "auth-limitedModeDesc": "In this mode, administrator privileges are restricted.", + "auth-restrictAccess": "Restrict Access", + "auth-closeHint": "This window can be closed, or it will disappear on its own", + + "operatorConfig-title": "Node Operator Configuration", + "operatorConfig-instruction": "Before starting, you need to create an application operator password", + "operatorConfig-passwordPlaceholder": "Enter password...", + "operatorConfig-repeatPasswordPlaceholder": "Repeat password...", + "operatorConfig-passwordMismatch": "Passwords do not match!", + "operatorConfig-submit": "Submit", + + "about-logoAlt": "Gossys Logo", + "about-title": "About the Application", + "about-description": "GoNets is a minimally viable cross-platform product (MVP) for demonstrating our approach to managing PC settings in a corporate environment.", + "about-featuresTitle": "Features", + "about-feature1": "Visualization of active network resources", + "about-feature2": "Configuration of local and remote network resource parameters", + "about-feature3": "Management of resource interaction with the GoNets Client", + "about-disclaimer": "The software is for demonstration and home use only.", + "about-goToPro": "Go to GoNets-PRO", + "about-homepage": "Homepage", + "about-documentation": "Documentation", + "about-license": "License", + "about-copyright": "Developed and maintained by Hybrid Office Systems LLC, 2024-2025. All rights reserved.", + + "main-logoAlt": "Application Logo", + "main-networkSettings": "Network Settings", + "main-about": "About the Program", + + "nodes-availableNodes": "Available Nodes", + "nodes-rootAddress": "Root Address", + "nodes-name": "Name", + "nodes-loading": "Loading", + "nodes-additionalNodes": "Additional Nodes", + "nodes-node": "Node", + "nodes-address": "Address", + "nodes-connectionError": "Failed to connect to the server at the address ", + + "settings-nodesSection": "Subnet Nodes", + "settings-intervalScanning": "Interval Scanning", + "settings-scanInterval": "Node Scan Interval (min)", + "settings-displayNames": "Display Names When Missing", + "settings-ipAddress": "IP Address", + "settings-unknown": "Unknown", + "settings-rowsPerPage": "Rows Per Table", + "settings-displaySettings": "Nodes Display", + "settings-configure": "Configure", + "settings-clearSessionData": "Clear Session Data", + "settings-clear": "Clear", + "settings-clearFailed": "Data was not deleted: ", + "settings-exportData": "Export Nodes Data", + "settings-export": "Export", + "settings-saveNodesTitle": "Save Nodes Data", + "settings-exportSuccess": "Data exported successfully!", + "settings-exportError": "Export error: ", + "settings-status": "Online", + "settings-name": "Name", + "settings-vendor": "Manufacturer", + "settings-openPorts": "Open Ports", + "settings-lastActivity": "Last Activity", + "settings-note": "Note", + "settings-action": "Action", + + "settings-title": "Settings", + "settings-resetSettings": "Reset Settings", + "settings-resetConfirm": "Are you sure you want to reset all settings to default values?", + "settings-cancel": "Cancel", + "settings-save": "Save", + "settings-fixErrors": "Fix errors before saving", + "settings-fillRequired": "Fill in all required fields", + "settings-dataNotDeleted": "Data was not deleted: ", + "settings-saveNetworksTitle": "Save Networks Data", + "settings-fieldRequired": "Field cannot be empty", + "settings-enterNumber": "Please enter a number", + "settings-valueTooSmall": "Value cannot be less than ", + "settings-valueTooLarge": "Value cannot be greater than ", + + "settings-sections-subnetNodes": "Subnet Nodes", + "settings-sections-accessPoints": "Access Points", + "settings-sections-appearance": "Appearance", + + "settings-exportNetworkData": "Export Access Points Data", + "settings-colorTheme": "Color Theme", + "settings-light": "Light", + "settings-dark": "Dark", + "settings-system": "As in System", + "settings-interfaceLanguage": "Interface Language", + "settings-russian": "Russian", + "settings-english": "English" +} diff --git a/FRONT/DEV/public/locales/ru/common.json b/FRONT/DEV/public/locales/ru/common.json new file mode 100644 index 0000000..144e1d4 --- /dev/null +++ b/FRONT/DEV/public/locales/ru/common.json @@ -0,0 +1,192 @@ + { + "userScanner-title": "Сканирование узлов подсети", + "userScanner-visible": "Способ отображения", + "userScanner-loading": "Cканирование узлов", + "userScanner-refresh": "Обновить список", + "userScanner-scan": "Сканировать узлы", + "userScanner-notFound": "Узлы не найдены", + "tableScanner-online": "Онлайн", + "tableScanner-name": "Имя", + "tableScanner-vendor": "Производитель", + "tableScanner-ip": "IP адрес", + "tableScanner-ports": "Открытые порты", + "tableScanner-activity": "Последняя активность", + "tableScanner-note": "Заметка", + "tableScanner-action": "Действие", + "tableScanner-unknown": "Неизвестно", + "tableScanner-noData": "Нет данных для отображения", + "listUsers-activeNodes": "Активные узлы", + "listUsers-inactiveNodes": "Неактивные узлы", + "ipInput-placeholder": "Введите IP", + "ipInput-error": "Введите корректный IP-адрес", + "userScanner-visible_table": "Таблица", + "userScanner-visible_list": "Список", + + "wifiScanner-title": "Сканирование точек доступа Wi-Fi", + "wifiScanner-scanning": "Сканирование точек доступа", + "wifiScanner-scanError": "Ошибка сканирования сети", + "wifiScanner-refresh": "Обновить список", + "wifiScanner-scan": "Сканировать точки доступа", + "wifiModal-bssid": "BSSID", + "wifiModal-vendor": "Производитель", + "wifiModal-signal": "Сигнал", + "wifiModal-channel": "Канал", + "wifiModal-encryption": "Шифрование", + "wifiModal-frequency": "Частота", + "wifiModal-hidden": "Скрытая сеть", + "wifiModal-note": "Заметка", + "wifiModal-connect": "Подключиться", + "wifiModal-disconnect": "Отключиться", + "wifiModal-unknown": "Неизвестно", + "wifiModal-none": "Отсутствует", + "common-yes": "Да", + "common-no": "Нет", + + "addNode": "Добавление узла", + "enterNodeAddress": "Введите адрес узла...", + "connectionLost": "Соединение прервано", + "serverDisconnected": "Произошёл разрыв с сервером", + "checkAddressAndRetry": "Пожалуйста, проверьте доступ к адресу и попробуйте снова", + "cancel": "Отменить", + "close": "Закрыть", + "save": "Сохранить", + "retry": "Повторить", + "connect": "Подключиться", + "common-back": "Назад", + "submit": "Подтвердить", + "error": "Ошибка", + "networkConnection": "Подключение к сети", + "enterPassword": "Введите пароль...", + "connectingAttempt": "Попытка подключения к сети", + "connectionError": "Ошибка подключения к сети", + "connectionErrorLog": "Ошибка подключения: ", + "customizeTable-title": "Кастомизация таблицы узлов подсети", + + "wifiDisconnect-title": "Отключение от Wi-Fi сети", + "wifiDisconnect-confirm": "Подтверждение отключения", + "wifiDisconnect-message1": "Вы собираетесь отключиться от сети - ", + "wifiDisconnect-message2": " Все активные подключения будут прерваны.", + "wifiDisconnect-disconnect": "Отключиться", + "wifiDisconnect-progress": "Отключение от сети", + + "ipChange-title": "Изменение IP-Адреса", + "ipChange-checkingIp": "Идет проверка корректности IP адреса", + "ipChange-generalInfo": "Общие сведения", + "ipChange-interface": "Интерфейс", + "ipChange-ipInfo": "Сведения об IP", + "ipChange-currentIp": "Текущий ip", + "ipChange-currentGateway": "Текущий шлюз", + "ipChange-currentDns": "Текущий DNS", + "ipChange-newIp": "Новый ip", + "ipChange-newGateway": "Новый шлюз", + "ipChange-newDns": "Новый DNS", + "ipChange-checkError": "Произошла ошибка проверки корректности", + "ipChange-adminRequired": "Для изменения сетевых настроек необходимо авторизироваться под администратором", + + "note-edit": "Редактирование заметки", + "note-add": "Добавление заметки", + "note-enter": "Введите заметку...", + + "auth-successLogin": "Успешный вход", + "auth-successLogout": "Успешный выход", + "auth-getAccess": "Получение прав доступа", + "auth-enableAdmin": "Включить административный доступ", + "auth-enterAdminPass": "Введите пароль администратора...", + "auth-wrongPass": "Неверный пароль оператора", + "auth-switchToLimited": "Переключиться на ограниченный доступ", + "auth-limitedModeDesc": "В данном режиме доступа ограничиваются полномочия администратора.", + "auth-restrictAccess": "Ограничить доступ", + "auth-closeHint": "Это окно можно закрыть, либо оно пропадёт само", + + "operatorConfig-title": "Настройка оператора узла", + "operatorConfig-instruction": "Перед началом работы необходимо создать пароль оператора приложения", + "operatorConfig-passwordPlaceholder": "Введите пароль...", + "operatorConfig-repeatPasswordPlaceholder": "Повторите пароль...", + "operatorConfig-passwordMismatch": "Пароли не совпадают!", + "operatorConfig-submit": "Отправить", + + "about-logoAlt": "Логотип Gossys", + "about-title": "О приложении", + "about-description": "ГоNets - минимально работоспособный кроссплатформенный продукт (MVP) для демонстрации нашего подхода к управлению настройками ПК в корпоративной среде.", + "about-featuresTitle": "Возможности", + "about-feature1": "Визуализация активных сетевых ресурсов", + "about-feature2": "Настройка параметров локальных и удалённых сетевых ресурсов", + "about-feature3": "Управление взаимодействием ресурсов с Клиентом ГoNets", + "about-disclaimer": "Программное обеспечение исключительно для ознакомления и домашнего использования.", + "about-goToPro": "Перейти на ГоNets-PRO", + "about-homepage": "Домашняя страница", + "about-documentation": "Документация", + "about-license": "Лицензия", + "about-copyright": "Разработано и поддерживается ООО «Гибридные Офисные Системы» 2024-2025 г. Все права защищены.", + + "main-logoAlt": "Логотип приложения", + "main-networkSettings": "Настройки сети", + "main-about": "О программе", + + "nodes-availableNodes": "Доступные узлы", + "nodes-rootAddress": "Корневой адрес", + "nodes-name": "Имя", + "nodes-loading": "Загрузка", + "nodes-additionalNodes": "Дополнительные узлы", + "nodes-node": "Узел", + "nodes-address": "Адрес", + "nodes-connectionError": "Не удалось подключиться к серверу по адресу ", + + "settings-nodesSection": "Узлы подсети", + "settings-intervalScanning": "Интервальное сканирование", + "settings-scanInterval": "Интервал сканирования узлов (мин)", + "settings-displayNames": "Отображаемые имена при отсутствии", + "settings-ipAddress": "IP адрес", + "settings-unknown": "Неизвестно", + "settings-rowsPerPage": "Количество строк в таблице", + "settings-displaySettings": "Отображение узлов", + "settings-configure": "Настроить", + "settings-clearSessionData": "Очистить данные сессии", + "settings-clear": "Очистить", + "settings-clearFailed": "Данные не были удалены: ", + "settings-exportData": "Экспорт данных узлов", + "settings-export": "Экспортировать", + "settings-saveNodesTitle": "Сохранить данные узлов", + "settings-exportSuccess": "Данные успешно экспортированы!", + "settings-exportError": "Ошибка экспорта: ", + "settings-status": "Онлайн", + "settings-name": "Имя", + "settings-vendor": "Производитель", + "settings-openPorts": "Открытые порты", + "settings-lastActivity": "Последняя активность", + "settings-note": "Заметка", + "settings-action": "Действие", + + "settings-title": "Настройки", + "settings-resetSettings": "Сбросить настройки", + "settings-resetConfirm": "Вы уверены, что хотите сбросить все настройки к значениям по умолчанию?", + "settings-cancel": "Отменить", + "settings-save": "Сохранить", + "settings-fixErrors": "Исправьте ошибки перед сохранением", + "settings-fillRequired": "Заполните все обязательные поля", + "settings-dataNotDeleted": "Данные не были удалены: ", + "settings-saveNetworksTitle": "Сохранить данные сетей", + "settings-fieldRequired": "Поле не может быть пустым", + "settings-enterNumber": "Пожалуйста, введите число", + "settings-valueTooSmall": "Значение не может быть меньше ", + "settings-valueTooLarge": "Значение не может быть больше ", + + "settings-sections-subnetNodes": "Узлы подсети", + "settings-sections-accessPoints": "Точки доступа", + "settings-sections-appearance": "Внешний вид", + + "settings-exportNetworkData": "Экспорт данных точек доступа", + "settings-colorTheme": "Цветовая тема", + "settings-light": "Светлая", + "settings-dark": "Тёмная", + "settings-system": "Как в системе", + "settings-interfaceLanguage": "Язык интерфейса", + "settings-russian": "Русский", + "settings-english": "Английский" + + + + } + + + diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/api/request.ts b/FRONT/DEV/src/api/request.ts similarity index 77% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/api/request.ts rename to FRONT/DEV/src/api/request.ts index 27dafd1..822930d 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/api/request.ts +++ b/FRONT/DEV/src/api/request.ts @@ -1,13 +1,13 @@ import axios, { AxiosResponse } from "axios"; const axiosWithoutCredentials = axios.create({ - baseURL: `https://localhost:8001`, + baseURL: `http://localhost:8001`, }) export class NetworkService { static createAxiosInstance(ipAddress: string) { return axios.create({ - baseURL: `https://${ipAddress}:8001`, + baseURL: `http://${ipAddress}:8001`, }); } @@ -83,10 +83,12 @@ export class NetworkService { } } - static async scanUser(ipAddress: string): Promise { + static async scanUser(ipAddress: string, ipScanning: string): Promise { try { const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.get('/subnet/devices'); + return await axiosInstance.post('/subnet/devices',{ + subnet: ipScanning, + }); } catch (error: any) { return error.response; } @@ -157,4 +159,38 @@ export class NetworkService { return error.response; } } + + // Settings + static async clearSubnet(ipAddress: string): Promise { + try { + const axiosInstance = this.createAxiosInstance(ipAddress); + return await axiosInstance.post(`/settings/clear_subnet`); + } catch (error: any) { + return error.response; + } + } + static async clearNetwork(ipAddress: string): Promise { + try { + const axiosInstance = this.createAxiosInstance(ipAddress); + return await axiosInstance.post(`/settings/clear_wifi`); + } catch (error: any) { + return error.response; + } + } + static async exportDevices(ipAddress: string): Promise { + try { + const axiosInstance = this.createAxiosInstance(ipAddress); + return await axiosInstance.post(`/settings/export_devices`); + } catch (error: any) { + return error.response; + } + } + static async exportNetwork(ipAddress: string): Promise { + try { + const axiosInstance = this.createAxiosInstance(ipAddress); + return await axiosInstance.post(`/settings/export_wifi`); + } catch (error: any) { + return error.response; + } + } } \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/assets/css/flow.css b/FRONT/DEV/src/assets/css/flow.css similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/assets/css/flow.css rename to FRONT/DEV/src/assets/css/flow.css diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/assets/css/index.css b/FRONT/DEV/src/assets/css/index.css similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/assets/css/index.css rename to FRONT/DEV/src/assets/css/index.css diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx b/FRONT/DEV/src/components/UI/Dropdown/DeviceCard.tsx similarity index 91% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx rename to FRONT/DEV/src/components/UI/Dropdown/DeviceCard.tsx index 0345346..17e53c7 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx +++ b/FRONT/DEV/src/components/UI/Dropdown/DeviceCard.tsx @@ -5,6 +5,7 @@ import {buttonNames} from "../../../const/buttons/names"; import {ModalMap} from "../../modalwindows/windowsType"; import {IconComponent} from "../../../const/buttons/icons"; import {useModalContext} from "../../../store"; +import {useNameSetting} from "../../../hooks/useSettings"; interface DeviceCardProps { device: DeviceUser; @@ -74,8 +75,8 @@ const Value = styled.span` const DeviceCard: React.FC = ({ device, status }) => { const [isExpanded, setIsExpanded] = useState(false); - const toggleExpanded = () => setIsExpanded(!isExpanded); const { openModal } = useModalContext(); + const nameSetting = useNameSetting(); const openModalNote = (e: React.MouseEvent) => { e.stopPropagation(); @@ -87,7 +88,7 @@ const DeviceCard: React.FC = ({ device, status }) => { return ( - + setIsExpanded(!isExpanded)}>

MAC: {device.mac} @@ -100,7 +101,7 @@ const DeviceCard: React.FC = ({ device, status }) => { - {device.hostname || device.ip} + {device.hostname || (nameSetting === 'ip' ? device.ip : 'Неизвестно')} diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DropdownType.tsx b/FRONT/DEV/src/components/UI/Dropdown/DropdownType.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DropdownType.tsx rename to FRONT/DEV/src/components/UI/Dropdown/DropdownType.tsx diff --git a/FRONT/DEV/src/components/UI/Pagination.tsx b/FRONT/DEV/src/components/UI/Pagination.tsx new file mode 100644 index 0000000..08ed767 --- /dev/null +++ b/FRONT/DEV/src/components/UI/Pagination.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import styled from "styled-components"; +import {buttonNames} from "../../const/buttons/names"; +import {IconComponent} from "../../const/buttons/icons"; + +const PaginateWrapper = styled.div` + width: 100%; + margin-top: 24px; + display: flex; + justify-content: center; + align-items: center; + gap: 10px; +` +const Page = styled.button<{ active?: boolean }>` + width: 36px; + height: 36px; + background: ${(props) => props.active ? props.theme.borderColor : props.theme.primary}; + color: ${(props) => props.active ? props.theme.primary : props.theme.textColor}; + border: 1px solid ${(props => props.theme.borderColor)}; + font-size: 16px; + cursor: pointer; + border-radius: 4px; + + transition: .4s ease; + &:hover { + background: ${(props) => props.active ? props.theme.textColor : props.theme.background};; + } +` + +interface PaginationProps { + currentPage: number; + totalPages: number; + onPrevPage: () => void; + onNextPage: () => void; + onPageChange: (page: number) => void; +} + +const Pagination = ({currentPage, totalPages, onPrevPage, onNextPage, onPageChange}: PaginationProps) => { + + const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1); + + return ( + + + + + {pageNumbers.map((page, i) => ( + onPageChange(page)} + active={currentPage === page} + > + {page} + + ))} + + + + + ); +}; + +export default Pagination; \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/animDot.tsx b/FRONT/DEV/src/components/UI/animDot.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/animDot.tsx rename to FRONT/DEV/src/components/UI/animDot.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/buttons/mainButton.tsx b/FRONT/DEV/src/components/UI/buttons/mainButton.tsx similarity index 95% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/buttons/mainButton.tsx rename to FRONT/DEV/src/components/UI/buttons/mainButton.tsx index 55ca7e3..a1bbfca 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/buttons/mainButton.tsx +++ b/FRONT/DEV/src/components/UI/buttons/mainButton.tsx @@ -17,10 +17,10 @@ const Button = styled.button.withConfig({ color: white; font-size: ${(props) => props.size === "small" - ? "14px" + ? "16px" : props.size === "big" - ? "16px" - : "14px"}; // По умолчанию + ? "18px" + : "16px"}; // По умолчанию cursor: pointer; display: flex; justify-content: center; diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/buttons/quitButton.tsx b/FRONT/DEV/src/components/UI/buttons/quitButton.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/buttons/quitButton.tsx rename to FRONT/DEV/src/components/UI/buttons/quitButton.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/buttons/toggletheme.tsx b/FRONT/DEV/src/components/UI/buttons/toggletheme.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/buttons/toggletheme.tsx rename to FRONT/DEV/src/components/UI/buttons/toggletheme.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/inputs/input.tsx b/FRONT/DEV/src/components/UI/inputs/input.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/inputs/input.tsx rename to FRONT/DEV/src/components/UI/inputs/input.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/loader.tsx b/FRONT/DEV/src/components/UI/loader.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/loader.tsx rename to FRONT/DEV/src/components/UI/loader.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/routerLoader.tsx b/FRONT/DEV/src/components/UI/routerLoader.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/routerLoader.tsx rename to FRONT/DEV/src/components/UI/routerLoader.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/signalSvg.tsx b/FRONT/DEV/src/components/UI/signalSvg.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/UI/signalSvg.tsx rename to FRONT/DEV/src/components/UI/signalSvg.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/circle/circleNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/circleNode.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/circle/circleNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/circleNode.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/circle/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/circle/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/default/defaultNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/defaultNode.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/default/defaultNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/defaultNode.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/default/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/default/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/diamond/diamondNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/diamondNode.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/diamond/diamondNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/diamondNode.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/diamond/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/diamond/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/index.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/index.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/index.ts rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/index.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/paralelogram/paralelogramNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/paralelogramNode.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/paralelogram/paralelogramNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/paralelogramNode.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/paralelogram/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/paralelogram/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/pill/pillNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/pillNode.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/pill/pillNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/pillNode.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/pill/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/baseForm/pill/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/index.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/index.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/index.ts rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/index.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipGroup/ipGroup.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/ipGroup.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipGroup/ipGroup.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/ipGroup.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipGroup/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipGroup/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx similarity index 89% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx index d04af92..8dd7174 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx +++ b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx @@ -3,12 +3,13 @@ import { Handle, Position } from '@xyflow/react'; import { Ip } from './style'; import { Row, IpTitle, IpContent } from './style'; import Input from '../../../../UI/inputs/input'; -import { useModalContext, usePannableStore } from '../../../../../store'; +import {useIpStore, useModalContext, usePannableStore} from '../../../../../store'; import { ModalMap } from '../../../../modalwindows/windowsType'; import { validateIPAddress, validateSameSubnet } from '../../../../../utils/nodeController/validator'; import {changeIp} from '../../../../../const/types/types' import { IconComponent } from "../../../../../const/buttons/icons"; import { buttonNames } from "../../../../../const/buttons/names"; +import {NetworkService} from "../../../../../api/request"; interface IIp { ipType: string @@ -45,6 +46,7 @@ export const IpNode = ({ data }: CustomNodeProps) => { const { toggleEditingMode } = usePannableStore(); const [isInput, setIsInput] = useState(false) const { openModal } = useModalContext(); + const {ipAddress} = useIpStore(); const [ipData, setIpData] = useState( { @@ -146,7 +148,20 @@ export const IpNode = ({ data }: CustomNodeProps) => { setIsInput(false) }; - + const switchMethod = async ()=>{ + const methodDCHP ={ + "connection_id": ipData.connection, + "ipv4_updates": { + "ipv4.method": "auto", + } + } + try { + await NetworkService.saveIp(ipAddress, methodDCHP); + window.location.reload(); + }catch (err){ + console.error(err) + } + } return ( <> @@ -170,7 +185,10 @@ export const IpNode = ({ data }: CustomNodeProps) => { ) : ( - + + {typeMap[data.ipData.ipType] ==='Static' && } + + )} diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipNode/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/ipNode/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkGroup/nodeGroup.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/nodeGroup.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkGroup/nodeGroup.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/nodeGroup.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkGroup/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkGroup/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkNode/networkNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/networkNode.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkNode/networkNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/networkNode.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkNode/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/networkNode/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/portNode/portNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/portNode.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/portNode/portNode.tsx rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/portNode.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/portNode/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/style.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/nodes/networkInterface/portNode/style.ts rename to FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/style.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/types/colors.ts b/FRONT/DEV/src/components/customeNodes/types/colors.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/types/colors.ts rename to FRONT/DEV/src/components/customeNodes/types/colors.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/types/types.ts b/FRONT/DEV/src/components/customeNodes/types/types.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/customeNodes/types/types.ts rename to FRONT/DEV/src/components/customeNodes/types/types.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modal.tsx b/FRONT/DEV/src/components/modalwindows/modal.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modal.tsx rename to FRONT/DEV/src/components/modalwindows/modal.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/ConnectNetwork.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/ConnectNetwork.tsx similarity index 64% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/ConnectNetwork.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/ConnectNetwork.tsx index ff3532f..484e995 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/ConnectNetwork.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/ConnectNetwork.tsx @@ -8,6 +8,7 @@ import useNetworkStore from "../../../store/useDeviceStore"; import RouterLoader from "../../UI/routerLoader"; import {useTheme} from "styled-components"; import {useIpStore} from "../../../store"; +import {useTranslation} from "../../../utils/i18n/hooks"; interface Props { address: string; @@ -19,53 +20,55 @@ interface Props { export const ConnectNetwork = ({address, onClose}: Props) => { const [password, setPassword] = useState(''); const theme = useTheme(); - const { ipAddress } = useIpStore(); + const {ipAddress} = useIpStore(); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); + const {t} = useTranslation('common'); const handleSave = async () => { try { setIsLoading(true); - setError('') + setError(''); const res = await NetworkService.connectNetwork(ipAddress, password, address); - if(res.status === 200) { - onClose() - }else{ - setError(res.data.detail) + if (res.status === 200) { + onClose(); + } else { + setError(res.data.detail); } } catch (error) { - console.error('Error connection:', error); - setError('Ошибка подключения к сети') - }finally { + console.error(t('connectionErrorLog'), error); + setError(t('connectionError')); + } finally { setIsLoading(false); } }; - return ( - + -

Подключение к сети

+

{t('networkConnection')}

- + setPassword(value)} /> -

- {error} -

+ {error && ( +

+ {error} +

+ )}
{ size="small" color={theme.successColor} hoverColor={theme.successColor} - title='Подключиться' + title={t('connect')} onClick={handleSave} /> - {isLoading && } + {isLoading && } ); }; \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/NoteDevice.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/NoteDevice.tsx similarity index 88% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/NoteDevice.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/NoteDevice.tsx index 6d0b666..c3c1356 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/NoteDevice.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/NoteDevice.tsx @@ -1,4 +1,3 @@ -// components/modalContainers/NoteDevice.tsx import { ModalContainer, ModalTitle, ModalContent, ButtonContainer } from "../style"; import { MainButton } from "../../UI/buttons/mainButton"; import Input from "../../UI/inputs/input"; @@ -6,6 +5,7 @@ import { useState } from "react"; import {useIpStore} from "../../../store"; import {NetworkService} from "../../../api/request"; import useNetworkStore from "../../../store/useDeviceStore"; +import {useTranslation} from "../../../utils/i18n/hooks"; interface Props { address: string; @@ -20,6 +20,7 @@ export const NoteDevice = ({ address, onClose, currentNote, type}: Props) => { const [note, setNote] = useState(currentNote || ''); const { ipAddress } = useIpStore(); const { devices, setDevices } = useNetworkStore(); + const {t} = useTranslation('common'); const handleSave = async () => { try { @@ -50,13 +51,13 @@ export const NoteDevice = ({ address, onClose, currentNote, type}: Props) => { return ( -

{currentNote ? 'Редактирование заметки' : 'Добавление заметки'}

+

{currentNote ? t('note-edit') : t('note-add')}

setNote(value)} @@ -67,13 +68,13 @@ export const NoteDevice = ({ address, onClose, currentNote, type}: Props) => { diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/NoteWifi.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/NoteWifi.tsx similarity index 89% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/NoteWifi.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/NoteWifi.tsx index c03a48a..4abaef6 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/NoteWifi.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/NoteWifi.tsx @@ -6,6 +6,7 @@ import { useState } from "react"; import {NetworkService} from "../../../api/request"; import useNetworkStore from "../../../store/useDeviceStore"; import {useIpStore} from "../../../store"; +import {useTranslation} from "../../../utils/i18n/hooks"; interface Props { address: string; @@ -20,6 +21,7 @@ export const NoteWifi = ({ address, onClose, currentNote, type}: Props) => { const [note, setNote] = useState(currentNote || ''); const { ipAddress } = useIpStore(); const { wifiNetworks, setWifiNetworks } = useNetworkStore(); + const {t} = useTranslation('common'); const handleSave = async () => { try { @@ -50,13 +52,13 @@ export const NoteWifi = ({ address, onClose, currentNote, type}: Props) => { return ( -

{currentNote ? 'Редактирование заметки' : 'Добавление заметки'}

+

{currentNote ? t('note-edit') : t('note-add')}

setNote(value)} @@ -67,13 +69,13 @@ export const NoteWifi = ({ address, onClose, currentNote, type}: Props) => { diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/addDevice.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/addDevice.tsx similarity index 71% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/addDevice.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/addDevice.tsx index 5611792..910d1a2 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/addDevice.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/addDevice.tsx @@ -3,6 +3,7 @@ import { MainButton } from "../../UI/buttons/mainButton"; import { useState } from "react"; import { ModalContainer, ModalTitle, ModalContent, ModalText, ButtonContainer } from "../style" import { validateIPAddress } from "../../../utils/nodeController/validator"; +import {useTranslation} from "../../../utils/i18n/hooks"; interface Props { onSave?: (data: string) => void; @@ -12,6 +13,7 @@ interface Props { export const AddDevice = ({ onSave, onClose }: Props) => { const [ipAddress, setIpAddress] = useState('') const [error, setError] = useState(false) + const {t} = useTranslation('common'); const handleSubmit = () => { if (!validateIPAddress(ipAddress)) { @@ -28,31 +30,39 @@ export const AddDevice = ({ onSave, onClose }: Props) => { return ( - {/*
*/} -

Добавление узла

+

{t('addNode')}

setIpAddress(value)} /> {error && (

- Некорректный адрес узла + {t('invalidAddress')}

)}
- - + + - {/*
*/}
) } \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/connectionError.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/connectionError.tsx similarity index 57% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/connectionError.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/connectionError.tsx index 224ba6e..fa69a59 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/connectionError.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/connectionError.tsx @@ -2,6 +2,7 @@ import { ModalContainer, ModalTitle, ModalContent, ModalText, ButtonContainer } import { useModalContext } from "../../../store" import { useIpStore } from "../../../store" import { MainButton } from "../../UI/buttons/mainButton" +import {useTranslation} from "../../../utils/i18n/hooks"; type Props={ message: string @@ -10,28 +11,37 @@ type Props={ export const ConnectionError = ({message}: Props)=>{ const {closeModal} = useModalContext() const { setIpAddress } = useIpStore(); + const {t} = useTranslation('common'); const close = ()=>{ setIpAddress('localhost') closeModal() } - return( + return ( -

Соединение прервано

+

{t('connectionLost')}

- + -

Произошёл разрыв с сервером

-

Пожалуйста, проверьте доступ к адресу и попробуйте снова.

+

{t('serverDisconnected')}

+

{t('checkAddressAndRetry')}

- - + +
) diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/customizeNodes.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/customizeNodes.tsx new file mode 100644 index 0000000..b8ab434 --- /dev/null +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/customizeNodes.tsx @@ -0,0 +1,143 @@ +import React, {useEffect, useState} from 'react'; +import {ButtonContainer, ModalContainer, ModalContent, ModalTitle} from "../style"; +import {MainButton} from "../../UI/buttons/mainButton"; +import {ModalMap} from "../windowsType"; +import {useModalContext} from "../../../store"; +import styled from "styled-components"; +import { useSettingsStore } from '../../../store/settings/settingsStore'; +import {useTranslation} from "../../../utils/i18n/hooks"; + +const StyledTableList = styled.ul` + display: flex; + justify-content: center; + align-items: center; + width: 100%; + box-sizing: border-box; + padding: 0 40px; + list-style-type: none; +` +const StyledTableItem = styled.li` + width: 160px; + height: 60px; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + background-color: ${props => props.theme.accent}; + color: ${props => props.theme.primary}; + border: 1px solid ${props => props.theme.primary}; + + &:first-child { + border-radius: 16px 0 0 16px; + } + &:last-child { + border-radius: 0 16px 16px 0; + } + &.off{ + background-color: ${props => props.theme.offlineColor}; + } +` +const CustomizeNodes = () => { + const { openModal } = useModalContext(); + const pendingChanges = useSettingsStore(state => state.pendingChanges); + const updateSetting = useSettingsStore(state => state.updateSetting); + const getSetting = useSettingsStore(state => state.getSetting); + const initializeSettings = useSettingsStore(state => state.initializeSettings); + const {t} = useTranslation('common'); + const [dragIndex, setDragIndex] = useState(null); + + // Получаем текущие значения из хранилища + const initialColumns = getSetting('table-columns-order').currentValue as string[]; + const disabledColumns = getSetting('table-columns-disabled').currentValue as number[]; + const items = pendingChanges['table-columns-order'] ?? initialColumns; + const disabledItems = pendingChanges['table-columns-disabled'] ?? disabledColumns; + + // Drag & Drop + const handleDragStart = (index: number) => { + setDragIndex(index); + }; + const handleDragOver = (index: number) => { + if (dragIndex === null || index === dragIndex) return; + + const newItems = [...items]; + const [movedItem] = newItems.splice(dragIndex, 1); + newItems.splice(index, 0, movedItem); + + updateSetting('table-columns-order', newItems); + setDragIndex(index); + }; + const handleDrop = () => { + setDragIndex(null); + }; + + // Переключение состояния + const handleSwitch = (index: number) => { + const newDisabledItems = disabledItems.includes(index) + ? disabledItems.filter((i: number) => i !== index) + : [...disabledItems, index]; + + updateSetting('table-columns-disabled', newDisabledItems); + }; + + // Закрытие с сохранением + const handleSave = () => { + openModal(ModalMap['10']); + }; + + + useEffect(() => { + initializeSettings(); + }, [initializeSettings]); + + const getItemText = (item: string) => { + if (item === 'Онлайн') return t('settings-status'); + if (item === 'Имя') return t('settings-name'); + if (item === 'Производитель') return t('settings-vendor'); + if (item === 'IP адрес') return t('settings-ipAddress'); + if (item === 'Открытые порты') return t('settings-openPorts'); + if (item === 'Последняя активность') return t('settings-lastActivity'); + if (item === 'Заметка') return t('settings-note'); + if (item === 'Действие') return t('settings-action'); + return item; + }; + + return ( + + +

{t('customizeTable-title')}

+
+ + + + {items.map((item:string, index:number) => ( + handleDragStart(index)} + onDragOver={(e) => { + e.preventDefault(); + handleDragOver(index); + }} + onDragEnd={handleDrop} + onClick={() => handleSwitch(index)} + > + {getItemText(item)} + + ))} + + + + + + +
+ ); +}; + +export default CustomizeNodes; \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/disconnectConfirm.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/disconnectConfirm.tsx similarity index 64% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/disconnectConfirm.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/disconnectConfirm.tsx index 148d657..e9d67bf 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/disconnectConfirm.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/disconnectConfirm.tsx @@ -6,6 +6,7 @@ import {useState} from "react"; import {NetworkService} from "../../../api/request"; import RouterLoader from "../../UI/routerLoader"; import {useTheme} from "styled-components"; +import {useTranslation} from "../../../utils/i18n/hooks"; type Props={ address: string, @@ -16,6 +17,7 @@ export const DisconnectConfirm = ({address, onClose}: Props)=>{ const { ipAddress } = useIpStore(); const theme = useTheme() const [isLoading, setIsLoading] = useState(false); + const {t} = useTranslation('common'); const handleDisconnect = async () => { try { @@ -34,21 +36,32 @@ export const DisconnectConfirm = ({address, onClose}: Props)=>{ return( -

Отключение от Wi-Fi сети

+

{t('wifiDisconnect-title')}

- + -

Подтверждение отключения

+

{t('wifiDisconnect-confirm')}

+

{t('wifiDisconnect-message1')} + {address}. {t('wifiDisconnect-message2')}

Вы собираетесь отключиться от сети "{address}". Все активные подключения будут прерваны.

- - + + - {isLoading && } + {isLoading && }
) } \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/index.ts b/FRONT/DEV/src/components/modalwindows/modalContainers/index.ts similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/index.ts rename to FRONT/DEV/src/components/modalwindows/modalContainers/index.ts diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/ipConfirm.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/ipConfirm.tsx similarity index 75% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/ipConfirm.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/ipConfirm.tsx index 2e2b998..e6bcbf5 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/ipConfirm.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/ipConfirm.tsx @@ -8,6 +8,7 @@ import { useIpStore } from "../../../store"; import { MainButton } from "../../UI/buttons/mainButton"; import { useAdminStore } from "../../../store/adminStore"; import { useDevicesStore } from "../../../store"; +import {useTranslation} from "../../../utils/i18n/hooks"; type Props = { ipData: changeIp @@ -52,6 +53,7 @@ export const IpConfirm = ({ ipData, onClose, smoothClose }: Props) => { const { ipAddress, setIpAddress } = useIpStore(); const {isAdmin} = useAdminStore() const { devices, addDevice, deleteDevice } = useDevicesStore(); + const {t} = useTranslation('common'); useEffect(() => { if (ipData && isAdmin) { @@ -120,7 +122,7 @@ export const IpConfirm = ({ ipData, onClose, smoothClose }: Props) => { ); useDevicesStore.setState({ devices: updatedDevices }); } - + onClose() } } catch (err) { @@ -146,40 +148,48 @@ export const IpConfirm = ({ ipData, onClose, smoothClose }: Props) => { return ( <> {loader && isAdmin ? ( - + ) : ( -

Изменение IP-Адреса

+

{t('ipChange-title')}

{checkStatus ? ( -

Общие сведения

+

{t('ipChange-generalInfo')}

-

Интерфейс: {ipData.device}

+

{t('ipChange-interface')}: {ipData.device}

--{'>'}

{ipData.connection}

-

Сведения об IP

+

{t('ipChange-ipInfo')}

-

Текущий ip: {ipData.currentIp}

-

Текущий шлюз: {ipData.currentGate}

-

Текущий DNS: {ipData.currentDns}

+

{t('ipChange-currentIp')}: {ipData.currentIp}

+

{t('ipChange-currentGateway')}: {ipData.currentGate}

+

{t('ipChange-currentDns')}: {ipData.currentDns}

-

Новый ip: {ipData.newIp}

-

Новый шлюз: {ipData.newGate}

-

Новый DNS: {ipData.newDns}

+

{t('ipChange-newIp')}: {ipData.newIp}

+

{t('ipChange-newGateway')}: {ipData.newGate}

+

{t('ipChange-newDns')}: {ipData.newDns}

- cancelIp(currentIp)}/> - saveIp(newIP)}/> + cancelIp(currentIp)} + /> + saveIp(newIP)} + />
) : ( @@ -188,19 +198,21 @@ export const IpConfirm = ({ ipData, onClose, smoothClose }: Props) => { {isAdmin ? ( <> -

Произошла ошибка проверки корректности

- {message} +

{t('ipChange-checkError')}

+ {message} - ):( -

Для изменения сетевых настроек необходимо авторизироваться под администратором

+

{t('ipChange-adminRequired')}

)} -
- + )} diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/rightsConfirm.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/rightsConfirm.tsx similarity index 66% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/rightsConfirm.tsx rename to FRONT/DEV/src/components/modalwindows/modalContainers/rightsConfirm.tsx index 24351dd..4cceef9 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalContainers/rightsConfirm.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalContainers/rightsConfirm.tsx @@ -9,6 +9,7 @@ import { useCheckAdmin } from "../../../utils/checkAdmin" import { buttonNames } from "../../../const/buttons/names" import { IconComponent } from "../../../const/buttons/icons" +import {useTranslation} from "../../../utils/i18n/hooks"; interface Props { onClose: () => void; @@ -17,9 +18,10 @@ interface Props { export const RightsConfirm = ({ onClose }: Props) => { const { ipAddress } = useIpStore(); - const { isAdmin, setAdmin } = useAdminStore() + const { isAdmin } = useAdminStore() const checkAdmin = useCheckAdmin(); const [error, setError] = useState(false) + const {t} = useTranslation('common'); const [success, setSuccess] = useState({ message: '', status: false @@ -45,7 +47,7 @@ export const RightsConfirm = ({ onClose }: Props) => { setError(false) setSuccess(prevData => ({ ...prevData, - message: 'Успешный вход', + message: t('auth-successLogin'), status: true })); await new Promise(resolve => setTimeout(resolve, 3000)); @@ -54,20 +56,20 @@ export const RightsConfirm = ({ onClose }: Props) => { setError(true) } } catch (err) { - console.error('Error:', err); + console.error(t('auth-error'), err); } } const logout = async () => { - await NetworkService.logout(ipAddress); - await checkAdmin(); - setSuccess(prevData => ({ - ...prevData, - message: 'Успешный выход', - status: true - })); - await new Promise(resolve => setTimeout(resolve, 3000)); - onClose(); + await NetworkService.logout(ipAddress); + await checkAdmin(); + setSuccess(prevData => ({ + ...prevData, + message: t('auth-successLogout'), + status: true + })); + await new Promise(resolve => setTimeout(resolve, 3000)); + onClose(); } return ( @@ -76,60 +78,55 @@ export const RightsConfirm = ({ onClose }: Props) => { !isAdmin ? ( <> -

Получение прав доступа

+

{t('auth-getAccess')}

- + - -

Включить административный доступ

+

{t('auth-enableAdmin')}

handleChange('password', value)} /> - + {error && (

- Неверный пароль оператора + {t('auth-wrongPass')}

)} -
- + - - login(user)} /> + + login(user)} /> ) : ( <> -

Переключиться на ограниченный доступ

+

{t('auth-switchToLimited')}

- + -

В данном режиме доступа ограничиваются полномочия администратора.

+

{t('auth-limitedModeDesc')}

- + - - + + - ) ):(

{success.message}

-

Это окно можно закрыть, либо оно пропадёт само

- +

{t('auth-closeHint')}

+
)} - -
) } \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalWindow.tsx b/FRONT/DEV/src/components/modalwindows/modalWindow.tsx similarity index 87% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalWindow.tsx rename to FRONT/DEV/src/components/modalwindows/modalWindow.tsx index 7edf179..f745b4f 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/modalWindow.tsx +++ b/FRONT/DEV/src/components/modalwindows/modalWindow.tsx @@ -7,6 +7,8 @@ import {NoteDevice} from "./modalContainers/NoteDevice"; import { NoteWifi } from "./modalContainers/NoteWifi"; import {ConnectNetwork} from "./modalContainers/ConnectNetwork"; import {DisconnectConfirm} from "./modalContainers/disconnectConfirm"; +import {Settings} from "../settings/Settings"; +import CustomizeNodes from "./modalContainers/customizeNodes"; type Props = { isOpen: boolean, @@ -74,6 +76,14 @@ export default function WindowComponent({ isOpen, type, data }: Props) { {type === ModalMap['5'] && ( )} + {type === ModalMap['10'] && ( + + )} + {type === ModalMap['11'] && ( + + )} } diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/style.ts b/FRONT/DEV/src/components/modalwindows/style.ts similarity index 89% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/style.ts rename to FRONT/DEV/src/components/modalwindows/style.ts index 2b75bd3..f0a2639 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/style.ts +++ b/FRONT/DEV/src/components/modalwindows/style.ts @@ -13,7 +13,7 @@ export const ModalWindow = styled.div` height: 100%; ` -export const ModalContainer = styled.div<{height?: string}>` +export const ModalContainer = styled.div<{height?: string, width?:string}>` border-radius: 12px; background: ${(props)=>props.theme.secondary}; color: ${(props=>props.theme.textColor)}; @@ -25,13 +25,14 @@ export const ModalContainer = styled.div<{height?: string}>` justify-content: space-between; gap: 15px; height: ${(props) => props.height ? props.height : '230px'}; - width: 520px; + width: ${(props) => props.width ? props.width : '520px'}; ` export const ModalTitle = styled.div` padding: 20px; border-bottom: 1px solid #9D9D9D; display: flex; + align-items: center; justify-content: space-between; h3{ diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/windowsType.ts b/FRONT/DEV/src/components/modalwindows/windowsType.ts similarity index 86% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/windowsType.ts rename to FRONT/DEV/src/components/modalwindows/windowsType.ts index ae6d760..9193a6f 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/modalwindows/windowsType.ts +++ b/FRONT/DEV/src/components/modalwindows/windowsType.ts @@ -10,4 +10,6 @@ export const ModalMap: ModalType = { '7': 'noteWifi', '8': 'connectNetwork', '9': 'disconnectConfirm', + "10": 'settings', + '11': 'customNodes', } diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/register.tsx b/FRONT/DEV/src/components/register.tsx similarity index 51% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/register.tsx rename to FRONT/DEV/src/components/register.tsx index a043285..11b0b59 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/register.tsx +++ b/FRONT/DEV/src/components/register.tsx @@ -9,6 +9,7 @@ import { IconComponent } from "../const/buttons/icons" import { buttonNames } from "../const/buttons/names" import ThemeButton from "./UI/buttons/toggletheme" import About from "./workSpace/modules/appModules/about" +import {useTranslation} from "../utils/i18n/hooks"; const Wrapper = styled.div` display: flex; @@ -73,6 +74,7 @@ export const CreateUser = () => { const [repeatPassword, setRepeatPassword] = useState(''); const [passwordsMatch, setPasswordsMatch] = useState(true); const [about, setAbout] = useState(false) + const {t} = useTranslation('common') const [user, setUser] = useState({ username: 'operator', @@ -118,77 +120,81 @@ export const CreateUser = () => { setAbout(true) } return ( - <> {!about ? ( + + + <IconComponent name={buttonNames[3]} width="52" height="52" /> + <h3>{t('operatorConfig-title')}</h3> + {ipAddress != 'localhost' && + <p>{ipAddress}</p> + } + - - - <IconComponent name={buttonNames[3]} width="52" height="52"></IconComponent> - <h3>Настройка оператора узла</h3> + <Content> + <div> + <p>{t('operatorConfig-instruction')}</p> + </div> + + <div> + <Input + type="password" + placeholderText={t('operatorConfig-passwordPlaceholder')} + id="password" + value={user.password} + onChange={(value) => handleChange('password', value)} + /> + + <Input + type="password" + placeholderText={t('operatorConfig-repeatPasswordPlaceholder')} + id="repeatPassword" + value={repeatPassword} + onChange={(value) => handleChange('repeatPassword', value)} + style={{ marginTop: '10px' }} + /> + {!passwordsMatch && ( + <p style={{ color: 'red', marginTop: '5px' }}> + {t('operatorConfig-passwordMismatch')} + </p> + )} + </div> + </Content> + + <ButtonContainer> + <MainButton + style={{ width: '100%' }} + title={t('operatorConfig-submit')} + type="submit" + /> + </ButtonContainer> + </Container> + + <Menu> {ipAddress != 'localhost' && - <p>{ipAddress}</p> + <MainButton + title={t('common-back')} + onClick={back} + style={{marginRight: '10px'}} + /> } - - - - - -
-

Перед началом работы необходимо создать пароль оператора приложения

-
- -
- handleChange('password', value)} - /> - - handleChange('repeatPassword', value)} - style={{ marginTop: '10px' }} - /> - {!passwordsMatch && ( -

- Пароли не совпадают! -

- )} -
- -
- - - - - - -
- - - - {ipAddress != 'localhost' && - - } - - + + -
- ): ( +
+ ) : ( setAbout(false)} /> )} - - ) + ); } \ No newline at end of file diff --git a/FRONT/DEV/src/components/settings/SettingItem.tsx b/FRONT/DEV/src/components/settings/SettingItem.tsx new file mode 100644 index 0000000..69ed138 --- /dev/null +++ b/FRONT/DEV/src/components/settings/SettingItem.tsx @@ -0,0 +1,226 @@ +import {Setting} from "../../store/settings/settingsStore"; +import {useState} from "react"; +import styled, {useTheme} from "styled-components"; +import {IconComponent} from "../../const/buttons/icons"; +import {buttonNames} from "../../const/buttons/names"; +import SettingSelect from "./SettingSelect"; +import {MainButton} from "../UI/buttons/mainButton"; +import React from 'react'; +import {useModalContext} from "../../store"; +import {ModalMap} from "../modalwindows/windowsType"; +import {useTranslation} from "../../utils/i18n/hooks"; + +const SettingBlock = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + gap: 24px; + margin-bottom: 18px; + font-size: 18px; + width: 90%; + input{ + font-size: 16px; + outline: none; + background-color: ${props => props.theme.primary}; + color: ${props => props.theme.textColor}; + border: 1px solid ${props => props.theme.borderColor}; + padding: 6px 8px; + border-radius: 4px; + } + input[type="number"]{ + width: 80px; + } + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } +` +const StyledCheckbox = styled.input.attrs({ type: 'checkbox' })` + width: 22px !important; + height: 22px !important; + appearance: none; + -webkit-appearance: none; + position: relative; + cursor: pointer; + overflow: hidden; + + &::after { + content: ""; + position: absolute; + width: 100%; + height: 100%; + background: ${props => props.theme.primary}; + top: 0; + left: 0; + } + &:checked::after { + background: ${props => props.theme.accent}; + } + +`; +const LabelCheckbox = styled.label` + position: relative; + cursor: pointer; + padding: 0; + svg{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } +` +const InputWrapper = styled.div` + display: flex; + flex-direction: column; + align-items: end; + gap: 6px; +` +const ErrorText = styled.div` + color: ${props => props.theme.errorColor}; + font-size: 12px; +`; + +interface SettingItemProps { + setting: Setting; + value: any; + onChange: (value: any) => void; + onValidationError?: (error: string | null) => void; +} + +const SettingItem = React.memo(({ setting, value, onChange, onValidationError }: SettingItemProps) => { + const theme = useTheme(); + const { t } = useTranslation('common'); + const [error, setError] = useState(null); + const { openModal } = useModalContext(); + + const handleButtonAction = () => { + if (setting.id === 'customize-nodes') { + openModal(ModalMap['11']); + } else if (setting.action) { + // Создаем обертку для действия с переводами + const actionWithTranslations = async () => { + try { + // Временно заменяем alert на версию с переводами + const originalAlert = window.alert; + window.alert = (message: string) => { + // Применяем переводы к сообщениям + let translatedMessage = message; + if (message.startsWith('settings-dataNotDeleted')) { + translatedMessage = t('settings-dataNotDeleted') + message.replace('settings-dataNotDeleted', ''); + } else if (message === 'settings-exportSuccess') { + translatedMessage = t('settings-exportSuccess'); + } else if (message.startsWith('settings-exportError')) { + translatedMessage = t('settings-exportError') + message.replace('settings-exportError', ''); + } + originalAlert(translatedMessage); + }; + + if (setting.action) { + await setting.action(); + } + + // Восстанавливаем оригинальный alert + window.alert = originalAlert; + } catch (error) { + console.error('Action error:', error); + } + }; + actionWithTranslations(); + } + }; + + // Изменение числа + const handleNumberChange = (e: React.ChangeEvent) => { + const inputValue = e.target.value; + let newError: string | null = null; + + if (inputValue.trim() === '') { + newError = t('settings-fieldRequired'); + onChange(null); + } + else if (isNaN(Number(inputValue))) { + newError = t('settings-enterNumber'); + } + else { + const numValue = Number(inputValue); + if (setting.min !== undefined && numValue < setting.min) { + newError = t('settings-valueTooSmall') + setting.min; + } + else if (setting.max !== undefined && numValue > setting.max) { + newError = t('settings-valueTooLarge') + setting.max; + } + + if (!newError) { + onChange(numValue); + } + } + + setError(newError); + onValidationError?.(newError); + }; + + return ( + + + + {setting.type === 'boolean' && ( + + onChange(e.target.checked)} + /> + + + )} + + {setting.type === 'select' && setting.options && ( + onChange(value)} + /> + )} + + {setting.type === 'text' && ( + onChange(e.target.value)} + /> + )} + + {setting.type === 'number' && ( + + { + if (!/[0-9]/.test(e.key) && + !['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight'].includes(e.key)) { + e.preventDefault(); + } + }} + className={error ? 'error' : ''} + /> + {error && {error}} + + )} + + {setting.type === 'button' && ( + + )} + {setting.type === 'hidden' && null} + + ); +}); + +export { SettingItem }; \ No newline at end of file diff --git a/FRONT/DEV/src/components/settings/SettingSelect.tsx b/FRONT/DEV/src/components/settings/SettingSelect.tsx new file mode 100644 index 0000000..d6ff465 --- /dev/null +++ b/FRONT/DEV/src/components/settings/SettingSelect.tsx @@ -0,0 +1,118 @@ +import React, { useState, useRef, useEffect } from 'react'; +import styled from 'styled-components'; +import { IconComponent } from '../../const/buttons/icons'; +import {buttonNames} from "../../const/buttons/names"; + +interface SettingSelectProps { + value: any; + options: { value: any; label: string }[]; + onChange: (value: any) => void; + disabled?: boolean; +} + +const SelectWrapper = styled.div` + position: relative; + width: 100%; + max-width: 180px; +`; + +const SelectHeader = styled.div<{ $isOpen: boolean; $disabled?: boolean }>` + padding: 6px 8px; + border: 1px solid ${props => props.theme.borderColor}; + border-radius: 4px; + background-color: ${props => props.theme.primary}; + cursor: ${props => props.$disabled ? 'not-allowed' : 'pointer'}; + display: flex; + justify-content: space-between; + align-items: center; + opacity: ${props => props.$disabled ? 0.6 : 1}; + font-size: 16px; +`; + +const SelectOptions = styled.div<{ $isOpen: boolean }>` + position: absolute; + top: 100%; + left: 0; + right: 0; + margin-top: 4px; + max-height: 200px; + overflow-y: auto; + background: ${props => props.theme.primary}; + border: 1px solid ${props => props.theme.borderColor || '#ccc'}; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + z-index: 10; + display: ${props => props.$isOpen ? 'block' : 'none'}; +`; + +const OptionItem = styled.div<{ $isSelected: boolean }>` + padding: 6px 8px; + cursor: pointer; + background-color: ${props => props.$isSelected ? (props.theme.accent) : 'transparent'}; + color: ${props => props.$isSelected ? (props.theme.primary) : 'inherit'}; +`; + +const ArrowIcon = styled.span<{ $isOpen: boolean }>` + transition: transform 0.2s; + transform: rotate(${props => props.$isOpen ? '90deg' : '0deg'}); + display: flex; + align-items: center; +`; + +const SettingSelect: React.FC = ({value, options, onChange, disabled = false + }) => { + const [isOpen, setIsOpen] = useState(false); + const selectRef = useRef(null); + + const selectedOption = options.find(opt => opt.value === value); + + const toggleDropdown = () => { + if (!disabled) { + setIsOpen(!isOpen); + } + }; + + const handleSelect = (optionValue: any) => { + onChange(optionValue); + setIsOpen(false); + }; + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (selectRef.current && !selectRef.current.contains(event.target as Node)) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, []); + + return ( + + + {selectedOption?.label || 'Select...'} + + + + + + {options.map((option) => ( + handleSelect(option.value)} + > + {option.label} + + ))} + + + ); +}; + +export default SettingSelect; \ No newline at end of file diff --git a/FRONT/DEV/src/components/settings/Settings.tsx b/FRONT/DEV/src/components/settings/Settings.tsx new file mode 100644 index 0000000..57edc9d --- /dev/null +++ b/FRONT/DEV/src/components/settings/Settings.tsx @@ -0,0 +1,264 @@ +import { ModalContainer, ModalTitle, ModalContent, ButtonContainer } from "../modalwindows/style"; +import { MainButton } from "../UI/buttons/mainButton"; +import {useCallback, useEffect, useMemo, useState} from "react"; +import styled, {useTheme} from "styled-components"; +import {Setting, useSettingsStore} from "../../store/settings/settingsStore"; +import {SettingItem} from "./SettingItem"; +import {IconComponent} from "../../const/buttons/icons"; +import {buttonNames} from "../../const/buttons/names"; +import {useTranslation} from "../../utils/i18n/hooks"; + + +interface Props { + onClose: () => void; +} + +const SectionsSidebar = styled.ul` + display: flex; + justify-content: start; + align-items: start; + flex-direction: column; + gap: 4px; + width: 20%; + min-width: 180px; + list-style-type: none; + padding: 0; + margin: 0; +` +const SectionsBTN = styled.li` + font-size: 18px; + border: none; + cursor: pointer; + width: 100%; + padding:10px 16px; + box-sizing: border-box; + border-radius: 0 12px 12px 0; + &.active{ + background-color: ${(props) => props.theme.accent}; + color: ${props => props.theme.primary}; + } +` +const SectionActive = styled.div` + width: 80%; +` +const SectionLine = styled.span` + height: 100%; + width: 1px; + background-color: #9D9D9D; +` +const CloseBtn = styled.span` + cursor: pointer; +` +const SettingsButtons = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + span{ + display: flex; + gap: 12px; + } +` +export const Settings = ({ onClose }: Props) => { + const settingsConfig = useSettingsStore(state => state.settingsConfig); + const settingsValues = useSettingsStore(state => state.settingsValues); + const activeSection = useSettingsStore(state => state.activeSection); + const pendingChanges = useSettingsStore(state => state.pendingChanges); + const setActiveSection = useSettingsStore(state => state.setActiveSection); + const updateSetting = useSettingsStore(state => state.updateSetting); + const applyChanges = useSettingsStore(state => state.applyChanges); + const discardChanges = useSettingsStore(state => state.discardChanges); + const getSetting = useSettingsStore(state => state.getSetting); + const resetToDefaults = useSettingsStore(state => state.resetToDefaults); + const initializeSettings = useSettingsStore(state => state.initializeSettings); + const updateSettingsConfig = useSettingsStore(state => state.updateSettingsConfig); + + const theme = useTheme() + const { t, language } = useTranslation('common'); + const [fieldErrors, setFieldErrors] = useState>({}); + const [currentLanguage, setCurrentLanguage] = useState(language); + + // Проверка действий + const handleValidationError = useCallback((fieldId: string, error: string | null) => { + setFieldErrors(prev => { + const newErrors = { ...prev }; + if (error) { + newErrors[fieldId] = error; + } else { + delete newErrors[fieldId]; + } + return newErrors; + }); + }, []); + + const settingsBySection = useMemo(() => { + return settingsConfig.reduce((acc, setting) => { + // Применяем переводы к настройкам + const translatedSetting = { + ...setting, + sectionId: t(setting.sectionId), + label: t(setting.label), + defaultValue: typeof setting.defaultValue === 'string' && setting.defaultValue.startsWith('settings-') ? t(setting.defaultValue) : setting.defaultValue, + options: setting.options ? setting.options.map((option: any) => ({ + ...option, + label: option.label.startsWith('settings-') ? t(option.label) : option.label + })) : setting.options, + value: settingsValues[setting.id] ?? setting.defaultValue + }; + + if (!acc[translatedSetting.sectionId]) { + acc[translatedSetting.sectionId] = []; + } + acc[translatedSetting.sectionId].push(translatedSetting); + return acc; + }, {} as Record); + }, [settingsConfig, settingsValues, t]); + + const sections = useMemo(() => Object.keys(settingsBySection), [settingsBySection]); + + useEffect(() => { + updateSettingsConfig(); + initializeSettings(); + }, [updateSettingsConfig, initializeSettings]); + + useEffect(() => { + if (sections.length > 0 && !activeSection) { + setActiveSection(sections[0]); + } + }, [sections, activeSection, setActiveSection]); + + // Обновляем текущий язык при изменении + useEffect(() => { + setCurrentLanguage(language); + }, [language]); + + const handleSave = useCallback(() => { + const hasErrors = Object.values(fieldErrors).some(error => error?.trim()); + if (hasErrors) { + alert(t('settings-fixErrors')); + return; + } + + const requiredFields = settingsConfig.filter(s => s.required); + const emptyRequiredFields = requiredFields.filter(f => { + const value = pendingChanges[f.id] ?? settingsValues[f.id] ?? f.defaultValue; + return value == null || value === ''; + }); + + if (emptyRequiredFields.length > 0) { + alert(t('settings-fillRequired')); + return; + } + + // Проверяем, изменился ли язык + const newLanguage = pendingChanges['language'] ?? settingsValues['language']; + const languageChanged = newLanguage && newLanguage !== currentLanguage; + + applyChanges(); + onClose(); + + // Если язык изменился, перезагружаем приложение + if (languageChanged) { + setTimeout(() => { + window.location.reload(); + }, 100); + } + }, [fieldErrors, settingsConfig, pendingChanges, settingsValues, applyChanges, onClose, t, currentLanguage]); + + const handleCancel = useCallback(() => { + discardChanges(); + setFieldErrors({}); + onClose(); + }, [discardChanges, onClose]); + + const handleReset = () => { + if (window.confirm(t('settings-resetConfirm'))) { + resetToDefaults(); + } + }; + + // Обработка нажатий клавиш + useEffect(() => { + const handleKeyPress = (e: KeyboardEvent) => { + if (e.key === 'Enter') + handleSave(); + if (e.key === 'Escape') + handleCancel() + }; + document.addEventListener('keydown', handleKeyPress); + return () => { + document.removeEventListener('keydown', handleKeyPress); + }; + }, [handleSave, handleCancel]); + + + return ( + + +

{t('settings-title')}

+ + + +
+ + + + {sections.map((sectionId) => ( + setActiveSection(sectionId)} + > + {sectionId} + + ))} + + + + {activeSection && settingsBySection[activeSection] && ( + <> + {settingsBySection[activeSection].map((setting) => ( + handleValidationError(setting.id, error)} + onChange={(value) => updateSetting(setting.id, value)} + /> + ))} + + )} + + + + + + + + + + + + +
+ ); +}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/about.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/about.tsx new file mode 100644 index 0000000..8309157 --- /dev/null +++ b/FRONT/DEV/src/components/workSpace/modules/appModules/about.tsx @@ -0,0 +1,252 @@ + +import { MainButton } from "../../../UI/buttons/mainButton" +import { workSpaceNames } from "../../../../const/workspace/names" +import { useWorkSpaceStore } from "../../../../store" +import styled, {useTheme} from "styled-components" +import ThemeButton from "../../../UI/buttons/toggletheme" +import {buttonNames} from "../../../../const/buttons/names"; +import {IconComponent} from "../../../../const/buttons/icons"; +import {useTranslation} from "../../../../utils/i18n/hooks"; + +type Props = { + from: 'reg' | 'helloWindow' | 'workSpace' + onBack?: () => void +} + +const Wrapper = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + background: ${(props => props.theme.background)}; + padding: 50px; + box-sizing: border-box; +` + +const Content = styled.div` + max-width: 1200px; + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; + box-sizing: border-box; + padding: 40px 50px; + background: ${(props => props.theme.primary)}; + border-radius: 18px; + position: relative; +` + +const Listing = styled.div` + display: flex; + flex-direction: column; + background-color: ${(props => props.theme.secondary)}; + border-radius: 10px; + padding: 24px 20px; + p{ + font-weight: bold; + font-size: 24px; + } +` + +const List = styled.ul` + display: flex; + flex-direction: column; + margin: 10px 0; + padding: 0; + list-style-type: none; + font-size: 18px; + gap: 4px; + & li:before { + color: ${(props => props.theme.accent)}; + content: "•"; + font-size: 28px; + width: .8em; + display: inline-block; + position: relative; + top: 2px; + } +` + +const Title = styled.div` + font-size: 20px; +` + +const SubTitle = styled.div` + display: flex; + flex-direction: column; + gap: 24px; + background-color:rgba(255, 248, 225, 0.6); + border-left: #ff9800 solid 4px; + border-radius: 0 8px 8px 0; + padding: 20px 12px; + + a{ + text-decoration: none; + color: ${(props => props.theme.errorColor)}; + font-weight: 500; + font-size: 18px; + width: max-content; + } + p{ + font-size: 18px; + color: ${(props=>props.theme.textColor)}; + } + .icon{ + width: 32px; + height: 32px; + fill: #ff9800; + } +` + +const Links = styled.div` + display: flex; + justify-content: start; + gap: 20px; +` + +const LinkBlock = styled.a` + text-decoration: none; + color: ${(props => props.theme.accent)};; +` + +const Copyright = styled.div` + width: 100%; + text-align: center; + color: ${(props => props.theme.offlineColor)}; +` + +const ButtonContainer = styled.div` + position: absolute; + top: 12px; + right: 14px; +` +const AboutLine = styled.hr` + border: ${(props => props.theme.hoverBtn)} 1px solid; + width: 100%; +` + +const MainTitle = styled.div` + width: 100%; + display: flex; + gap: 15px; + align-items: center; + justify-content: space-between; + padding-top: 10px; + box-sizing: border-box; + + img{ + width: 50px; + height: 50px; + } + .version{ + text-wrap: nowrap; + background-color: ${(props => props.theme.hoverBtn)}; + color: ${(props => props.theme.borderColor)}; + border-radius: 20px; + font-size: 18px; + padding: 10px 18px; + line-height: 1; + } + .title{ + display: flex; + justify-content: center; + align-items: center; + gap: 24px; + } +` + +export default function About({ from, onBack }: Props) { + const { setWorkModule } = useWorkSpaceStore() + const {t} = useTranslation('common') + const getBackHandler = () => { + switch (from) { + case 'reg': + return onBack + case 'helloWindow': + return () => setWorkModule(workSpaceNames[1]) + case 'workSpace': + return () => setWorkModule(workSpaceNames[3]) + default: + return undefined + } + } + + const backHandler = getBackHandler() + const showBackButton = from !== 'reg' || (from === 'reg' && onBack) + + return ( + + + +
+ {t('about-logoAlt')} +
+

{t('about-title')}

+
+
+

v 0.0.3

+
+ + + + + <p>{t('about-description')}</p> + + + +

{t('about-featuresTitle')}:

+ +
  • {t('about-feature1')}
  • +
  • {t('about-feature2')}
  • +
  • {t('about-feature3')}
  • +
    +
    + + + + + +

    {t('about-disclaimer')}

    + + {t('about-goToPro')} + +
    + + + + {t('about-homepage')} + + + + {t('about-documentation')} + + + + {t('about-license')} + + + + + {t('about-copyright')} + + + + {showBackButton && backHandler && ( + + )} + + {from == 'reg' && + + } + +
    +
    + ) +} \ No newline at end of file diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/header.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/header.tsx similarity index 100% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/header.tsx rename to FRONT/DEV/src/components/workSpace/modules/appModules/header.tsx diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/helloWindow.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/helloWindow.tsx similarity index 80% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/helloWindow.tsx rename to FRONT/DEV/src/components/workSpace/modules/appModules/helloWindow.tsx index 0a09826..1761515 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/helloWindow.tsx +++ b/FRONT/DEV/src/components/workSpace/modules/appModules/helloWindow.tsx @@ -3,6 +3,7 @@ import { useWorkSpaceStore } from "../../../../store" import { workSpaceNames } from "../../../../const/workspace/names" import { buttonNames } from "../../../../const/buttons/names" + import {useTranslation} from "../../../../utils/i18n/hooks"; const Wrapper = styled.div` width: 100%; @@ -49,30 +50,33 @@ ` export const HelloWindow = () => { - + const {t} = useTranslation('common') const { setWorkModule } = useWorkSpaceStore() return ( - <img src="./assets/images/logo.svg" alt="" style={{width: '152px'}}/> + <img + src="./assets/images/logo.svg" + alt={t('main-logoAlt')} + style={{width: '152px'}} + /> - setWorkModule(workSpaceNames[3])} /> setWorkModule(workSpaceNames[4])} + onClick={() => setWorkModule(workSpaceNames[4])} /> diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/IpScanning.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/IpScanning.tsx new file mode 100644 index 0000000..1dc7b4f --- /dev/null +++ b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/IpScanning.tsx @@ -0,0 +1,85 @@ +import React, {useState} from 'react'; +import styled, {keyframes} from 'styled-components'; +import {useTranslation} from "../../../../../../utils/i18n/hooks"; + +interface Props { + value: string; + setIpScanning: (value: string) => void; + loading: boolean; + isValid: boolean; + setIsValid: (value: boolean) => void; +} +const Input = styled.input` + height: 40px; + width: 210px; + font-size: 20px; + text-align: center; + background-color: transparent; + border: none; + outline: none; + border-bottom: 2px solid ${props => props.theme.offlineColor}; + color: ${props => props.theme.textColor}; + transition: all 0.3s ease; + &:focus { + border-bottom: 2px solid ${props => props.theme.accent}; + width: 270px; + } + &::placeholder { + color: ${props => props.theme.offlineColor}; + transition: all 0.3s ease; + } + + &:focus::placeholder { + opacity: 0; + } + &:disabled { + opacity: 0; + } +` +const errorVisible = keyframes` + 0%{opacity: 0} + 100%{opacity: 1} +`; +const ErrorMessage = styled.span` + margin-top: 6px; + color: ${props=>props.theme.errorColor}; + animation: ${errorVisible} .4s linear; +` + + +const IpScanning = ({value, setIpScanning, loading, isValid, setIsValid}: Props) => { + const {t} = useTranslation('common') + const validateInput = (e: React.KeyboardEvent) => { + const allowedKeys = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '.', '/', + 'Backspace', 'Delete', + 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown' + ]; + + if (!allowedKeys.includes(e.key)) { + e.preventDefault(); + } + }; + + const handleChange = (e: React.ChangeEvent) => { + setIpScanning(e.target.value); + } + + return ( + <> + + {!isValid && !loading && ( + {t('ipInput-error')} + )} + + ); +}; + +export default IpScanning; \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx new file mode 100644 index 0000000..513691c --- /dev/null +++ b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx @@ -0,0 +1,115 @@ +import React, {useEffect, useState} from 'react'; +import styled from 'styled-components'; +import DeviceCard from "../../../../../UI/Dropdown/DeviceCard"; +import {DeviceUser} from "../../../../../../store/useDeviceStore"; +import {usePaginateSetting} from "../../../../../../hooks/useSettings"; +import Pagination from "../../../../../UI/Pagination"; +import {useTranslation} from "../../../../../../utils/i18n/hooks"; + +const ScanBtn = styled.button` + position: relative; + padding: 14px 22px; + background-color: #4CAF50; + color: white; + border: none; + border-radius: 12px; + font-size: 18px; + transition: .4s ease; + &:hover{ + transform: scale(1.03); + } +` + +interface ListUsersProps { + loading: boolean; + handleScan: ()=>void; + devices: DeviceUser[]; + scanInitiated: boolean; +} + +const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps) => { + const {t} = useTranslation('common') + const activeDevices = devices.filter(device => device.status === 'online'); + const inactiveDevices = devices.filter(device => device.status !== 'online'); + + // Пагинация + const paginateSetting = usePaginateSetting(); + const [currentPage, setCurrentPage] = useState(1); + const [devicesPerPage, setDevicesPerPage] = useState(paginateSetting); + + useEffect(() => { + setDevicesPerPage(paginateSetting); + }, [paginateSetting]); + + const indexOfLastDevice = currentPage * devicesPerPage; + const indexOfFirstDevice = indexOfLastDevice - devicesPerPage; + const currentActiveDevices = activeDevices.slice(indexOfFirstDevice, indexOfLastDevice); + const currentInactiveDevices = inactiveDevices.slice(indexOfFirstDevice, indexOfLastDevice); + const totalPages = Math.ceil(devices.length / devicesPerPage); + + const handlePrevPage = () => { + if(currentPage > 1) setCurrentPage(currentPage - 1); + } + const handleNextPage = () => { + if(currentPage < totalPages) setCurrentPage(currentPage + 1); + } + const onPageChange = (page: number) => { + setCurrentPage(page); + } + + return ( + <> + + {loading ? t('userScanner-loading') : devices.length > 0 ? t('userScanner-refresh') : t('userScanner-scan')} + + + {devices.length > 0 ? ( +
    + {/* Колонка активных устройств */} +
    +

    + {t('listUsers-activeNodes')} ({activeDevices.length}) +

    + {currentActiveDevices.map((device, index) => ( + + ))} +
    + {/* Колонка неактивных устройств */} +
    +

    + {t('listUsers-inactiveNodes')} ({inactiveDevices.length}) +

    + {currentInactiveDevices.map((device, index) => ( + + ))} +
    +
    + ) : scanInitiated && !loading ? ( +

    {t('userScanner-notFound')}

    + ) : null} + {totalPages > 1 && ( + + )} + + ); +}; + +export default ListUsers; \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableScanner.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableScanner.tsx new file mode 100644 index 0000000..ccd405d --- /dev/null +++ b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableScanner.tsx @@ -0,0 +1,268 @@ +import React, {useEffect, useMemo, useState} from 'react'; +import { DeviceUser } from '../../../../../../store/useDeviceStore'; +import styled from 'styled-components'; +import {IconComponent} from "../../../../../../const/buttons/icons"; +import {buttonNames} from "../../../../../../const/buttons/names"; +import {ModalMap} from "../../../../../modalwindows/windowsType"; +import {useModalContext} from "../../../../../../store"; +import {useTranslation} from "../../../../../../utils/i18n/hooks"; +import Pagination from "../../../../../UI/Pagination"; +import { + useDisabledColumns, + useNameSetting, + useOrdersColumns, + usePaginateSetting +} from "../../../../../../hooks/useSettings"; + +interface TableScannerProps { + devices: DeviceUser[]; +} + +const TableContainer = styled.div` + width: 100%; + margin: 24px 0; +`; + +const StyledTable = styled.table` + width: 100%; + border-collapse: separate; + border-spacing: 0; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08); + background: ${({ theme }) => theme.primary}; +`; + +const TableHeaderCell = styled.th<{ sortable?: boolean }>` + padding: 16px 24px; + text-align: left; + font-weight: 600; + font-size: 14px; + color: ${({ theme }) => theme.textColor}; + background: ${({ theme }) => theme.primary}; + border-bottom: 1px solid ${({ theme }) => theme.borderColor}; + transition: all 0.2s ease; +`; + +const TableRow = styled.tr<{ clickable?: boolean }>` + transition: all 0.2s ease; + &:hover { + background-color: ${({ theme }) => theme.background}; + } +`; + +const TableCell = styled.td` + padding: 16px 24px; + font-size: 14px; + color: ${({ theme }) => theme.text}; + border-bottom: 1px solid ${({ theme }) => theme.borderColor}; + transition: all 0.2s ease; + button{ + background-color: transparent; + border: none; + cursor: pointer; + } +`; + +const StatusBadge = styled.span<{ status:string }>` + width: 10px; + height: 30px; + background-color: ${({theme, status}) => (status==='online' ? theme.successColor : theme.offlineColor)}; + display: inline-block; + border-radius:4px; +` + +export const TableScanner = ({ devices }: TableScannerProps) => { + const { openModal } = useModalContext(); + const nameSetting = useNameSetting(); + const ordersColumns = useOrdersColumns(); + const disabledColumns = useDisabledColumns(); + const paginateSetting = usePaginateSetting(); + const {t} = useTranslation('common'); + + + const [currentPage, setCurrentPage] = useState(1); + const [devicesPerPage, setDevicesPerPage] = useState(paginateSetting); + + console.log(ordersColumns); + + useEffect(() => { + setDevicesPerPage(paginateSetting); + }, [paginateSetting]); + + const openModalNote = (e: React.MouseEvent, device: DeviceUser) => { + e.stopPropagation(); + openModal(ModalMap['6'], { + address: device.mac, + currentNote: device.note || '' + }); + }; + + const defaultOrder = useMemo(() => ([ + t('settings-status'), + t('settings-name'), + t('settings-vendor'), + t('settings-ipAddress'), + t('settings-openPorts'), + t('settings-lastActivity'), + t('settings-note'), + t('settings-action'), + ]), [t]); + + const normalizedOrders = useMemo( + () => (Array.isArray(ordersColumns) && ordersColumns.length ? ordersColumns : defaultOrder), + [ordersColumns, defaultOrder] + ); + const normalizedDisabled = useMemo( + () => (Array.isArray(disabledColumns) ? disabledColumns : []), + [disabledColumns] + ); + + const visibleColumns = useMemo(() => { + const normalizeColumnName = (column: string) => column?.toLowerCase(); + + const columnToKey = (column: string) => { + const col = normalizeColumnName(column); + switch (col) { + case 'settings-status': + case normalizeColumnName(t('settings-status')): + case 'онлайн': + case 'status': + return 'status'; + case 'settings-name': + case normalizeColumnName(t('settings-name')): + case 'имя': + case 'name': + return 'name'; + case 'settings-vendor': + case normalizeColumnName(t('settings-vendor')): + case 'производитель': + case 'vendor': + return 'vendor'; + case 'settings-ipaddress': + case normalizeColumnName(t('settings-ipAddress')): + case 'ip адрес': + case 'ip address': + case 'ip': + return 'ip'; + case 'settings-openports': + case normalizeColumnName(t('settings-openPorts')): + case 'открытые порты': + case 'open ports': + case 'ports': + return 'ports'; + case 'settings-lastactivity': + case normalizeColumnName(t('settings-lastActivity')): + case 'последняя активность': + case 'last activity': + case 'activity': + return 'activity'; + case 'settings-note': + case normalizeColumnName(t('settings-note')): + case 'заметка': + case 'note': + return 'note'; + case 'settings-action': + case normalizeColumnName(t('settings-action')): + case 'действие': + case 'action': + return 'action'; + default: + return ''; + } + }; + + return normalizedOrders + .map((column, index) => ({ column, index })) + .filter(({ index }) => !normalizedDisabled.includes(index)) + .map(({ column }) => columnToKey(column)) + .filter(Boolean); + }, [normalizedOrders, normalizedDisabled, t]); + + // Пагинация + const indexOfLastDevice = currentPage * devicesPerPage; + const indexOfFirstDevice = indexOfLastDevice - devicesPerPage; + const currentDevices = devices.slice(indexOfFirstDevice, indexOfLastDevice); + const totalPages = Math.ceil(devices.length / devicesPerPage); + + const handlePrevPage = () => { + if (currentPage > 1) setCurrentPage(currentPage - 1); + }; + + const handleNextPage = () => { + if (currentPage < totalPages) setCurrentPage(currentPage + 1); + }; + + const onPageChange = (page: number) => { + setCurrentPage(page); + }; + + // Рендер ячейки таблицы + const renderTableCell = (column: string, item: DeviceUser) => { + switch (column) { + case 'status': + return ; + case 'name': + return {item.hostname || (nameSetting === 'ip' ? item.ip : 'Неизвестно')}; + case 'vendor': + return {item.vendor}; + case 'ip': + return {item.ip}; + case 'ports': + return {item.open_ports.join(', ') || '-'}; + case 'activity': + return {item.last_seen}; + case 'note': + return {item.note || '-'}; + case 'action': + return ( + + + + ); + default: + return null; + } + }; + + return ( + + + + + {visibleColumns.map(column => { + switch (column) { + case 'status': return ; + case 'name': return {t('settings-name')}; + case 'vendor': return {t('settings-vendor')}; + case 'ip': return {t('settings-ipAddress')}; + case 'ports': return {t('settings-openPorts')}; + case 'activity': return {t('settings-lastActivity')}; + case 'note': return {t('settings-note')}; + case 'action': return ; + default: return null; + } + })} + + + + {currentDevices.map((item, index) => ( + + {visibleColumns.map(column => renderTableCell(column, item))} + + ))} + + + + {totalPages > 1 && ( + + )} + + ); +}; diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx similarity index 58% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx rename to FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx index cd2e9c4..b548618 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx +++ b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx @@ -1,8 +1,8 @@ import React from 'react'; import styled from 'styled-components'; -import DeviceCard from "../../../../../UI/Dropdown/DeviceCard"; import {DeviceUser} from "../../../../../../store/useDeviceStore"; -import TableScanner from "../../../../../UI/tables/TableScanner"; +import {TableScanner} from "./TableScanner"; +import {useTranslation} from "../../../../../../utils/i18n/hooks"; const ScanBtn = styled.button` position: relative; @@ -20,23 +20,24 @@ const ScanBtn = styled.button` interface ListUsersProps { loading: boolean; - handleScan: ()=>void; + handleScan: (replay?: boolean) => void; devices: DeviceUser[]; scanInitiated: boolean; } const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps) => { + const {t} = useTranslation('common') return ( <> - - {devices.length > 0 ? 'Обновить список' : 'Сканировать узлы подсети'} + handleScan()} disabled={loading}> + {loading ? t('userScanner-loading') : devices.length > 0 ? t('userScanner-refresh') : t('userScanner-scan')} {devices.length > 0 ? ( - ) : scanInitiated ? ( -

    Устройства не найдены

    + ) : scanInitiated && !loading ? ( +

    {t('userScanner-notFound')}

    ) : null} ); diff --git a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx similarity index 64% rename from debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx rename to FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx index dd3f035..3ca659d 100644 --- a/debian/gonets/usr/share/gonets/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx +++ b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx @@ -1,11 +1,15 @@ import { useIpStore } from "../../../../../store"; import styled, { keyframes } from "styled-components"; -import { useState } from "react"; +import {useEffect, useState, useTransition} from "react"; import { NetworkService } from "../../../../../api/request"; import ListUsers from "./modules/ListUsers"; import TableUsers from "./modules/TableUsers"; import DropdownType from "../../../../UI/Dropdown/DropdownType"; import useNetworkStore from "../../../../../store/useDeviceStore"; +import {useIntervalBoolean, useIntervalTime} from "../../../../../hooks/useSettings"; +import IpScanning from "./modules/IpScanning"; +import {useTranslation} from "../../../../../utils/i18n/hooks"; + type Option ={ value: number, @@ -51,7 +55,7 @@ const Wrapper = styled.div<{ scanInitiated: boolean, loading: boolean}>` height: 100%; width: 100%; background: ${(props) => props.theme.background}; - padding: 50px; + padding: 80px 50px 40px; box-sizing: border-box; gap: 24px; transition: justify-content .4s ease; @@ -59,13 +63,20 @@ const Wrapper = styled.div<{ scanInitiated: boolean, loading: boolean}>` overflow-x: hidden; position: relative; `; -const TitleWrapper = styled.h2` +const TopWrapper = styled.div` position: absolute; top: 20px; left: 50%; transform: translateX(-50%); + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +` +const TopTitle = styled.h2` font-size: 32px; width: max-content; + text-align: center; ` const UserLocate = styled.div<{ loading: boolean, scanInitiated: boolean }>` width: 60px; @@ -77,7 +88,7 @@ const UserLocate = styled.div<{ loading: boolean, scanInitiated: boolean }>` span { position: absolute; display: inline-block; - background: ${(props) => props.theme.accent}; + background: ${(props) => props.theme.scannerColor}; top: 50%; left: 50%; transform: translate(-50%, -50%); @@ -130,31 +141,65 @@ const ScanningText = styled.span` export default function UserScanner() { + const {t} = useTranslation('common') const { ipAddress } = useIpStore(); + const [ipScanning, setIpScanning] = useState(''); const [loading, setLoading] = useState(false); + const [isValid, setIsValid] = useState(true); const { devices, setDevices } = useNetworkStore(); const [scanInitiated, setScanInitiated] = useState(devices.length > 0); + const validateIp = (ip: string) => { + const regex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\/([0-9]|[1-2][0-9]|3[0-2]))?$/; + return regex.test(ip); + }; + // Сканирование - const handleScan = async () => { + const handleScan = async (replay: boolean) => { try { - setLoading(true); + if (ipScanning && !validateIp(ipScanning)) { + setIsValid(false); + return; + } + + setIsValid(true); + + if (!replay) { + setLoading(true); + } setScanInitiated(true); - const res = await NetworkService.scanUser(ipAddress); - console.log(res); + const res = await NetworkService.scanUser(ipAddress, ipScanning); + console.log(res) setDevices(res.data.devices || []); } catch (err) { console.error("Ошибка сканирования сети:", err); - setDevices([]) + setDevices([]); } finally { setLoading(false); } }; + // Интервально сканирование + const intervalToggle = useIntervalBoolean(); + const intervalTime = useIntervalTime(); + useEffect(() => { + let intervalId: NodeJS.Timeout | null = null; + + if (intervalToggle) { + intervalId = setInterval(()=>handleScan(true), intervalTime * 60 * 1000); + } + + return () => { + if (intervalId) { + clearInterval(intervalId); + } + }; + }, [intervalToggle, intervalTime, handleScan]); + // Способ отображения const viewOptions: Option[] = [ - { value: 1, label: 'Таблица' }, - { value: 2, label: 'Список' }, + { value: 1, label: t('userScanner-visible_table') }, + { value: 2, label: t('userScanner-visible_list') }, ]; const [selectedView, setSelectedView] = useState