From c955401fb4e1468f3e4c0dfb1593c5a1a1bf5a80 Mon Sep 17 00:00:00 2001 From: chun_qiu Date: Tue, 1 Sep 2026 13:30:52 +0800 Subject: [PATCH] Initial Super N2N desktop application --- .gitattributes | 8 + .gitea/workflows/build-windows.yml | 30 + .gitignore | 37 + .gitmodules | 4 + README.md | 67 + index.html | 13 + package-lock.json | 2036 ++++++++ package.json | 27 + scripts/PORTABLE-README.txt | 11 + scripts/build-n2n.sh | 17 + scripts/build.ps1 | 150 + scripts/package-portable.ps1 | 102 + src-tauri/.taurignore | 7 + src-tauri/Cargo.lock | 4513 +++++++++++++++++ src-tauri/Cargo.toml | 21 + src-tauri/app-icon.svg | 8 + src-tauri/build.rs | 3 + src-tauri/capabilities/default.json | 7 + src-tauri/icons/128x128.png | Bin 0 -> 2424 bytes src-tauri/icons/128x128@2x.png | Bin 0 -> 4555 bytes src-tauri/icons/32x32.png | Bin 0 -> 633 bytes src-tauri/icons/64x64.png | Bin 0 -> 1247 bytes src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2116 bytes src-tauri/icons/Square142x142Logo.png | Bin 0 -> 2547 bytes src-tauri/icons/Square150x150Logo.png | Bin 0 -> 2638 bytes src-tauri/icons/Square284x284Logo.png | Bin 0 -> 5250 bytes src-tauri/icons/Square30x30Logo.png | Bin 0 -> 529 bytes src-tauri/icons/Square310x310Logo.png | Bin 0 -> 5681 bytes src-tauri/icons/Square44x44Logo.png | Bin 0 -> 817 bytes src-tauri/icons/Square71x71Logo.png | Bin 0 -> 1501 bytes src-tauri/icons/Square89x89Logo.png | Bin 0 -> 1855 bytes src-tauri/icons/StoreLogo.png | Bin 0 -> 957 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1803 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2872 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 1659 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1521 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2049 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 1464 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3286 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 3771 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 3126 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4844 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 5897 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 4186 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6535 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 7628 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 5625 bytes .../android/values/ic_launcher_background.xml | 4 + src-tauri/icons/icon.icns | Bin 0 -> 55374 bytes src-tauri/icons/icon.ico | Bin 0 -> 9699 bytes src-tauri/icons/icon.png | Bin 0 -> 9155 bytes src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 373 bytes src-tauri/icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 762 bytes src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 762 bytes src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 1118 bytes src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 644 bytes src-tauri/icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 1033 bytes src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 1033 bytes src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 1804 bytes src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 762 bytes src-tauri/icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 1527 bytes src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 1527 bytes src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 2220 bytes src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 21387 bytes src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 2220 bytes src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 3272 bytes src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 1403 bytes src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 2548 bytes src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 3297 bytes src-tauri/src/lib.rs | 505 ++ src-tauri/src/main.rs | 5 + src-tauri/tauri.conf.json | 34 + src/lib/tauri.js | 39 + src/main.jsx | 341 ++ src/styles.css | 261 + third_party/n2n | 1 + vite.config.js | 10 + 78 files changed, 8266 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitea/workflows/build-windows.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scripts/PORTABLE-README.txt create mode 100644 scripts/build-n2n.sh create mode 100644 scripts/build.ps1 create mode 100644 scripts/package-portable.ps1 create mode 100644 src-tauri/.taurignore create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/app-icon.svg create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/capabilities/default.json create mode 100644 src-tauri/icons/128x128.png create mode 100644 src-tauri/icons/128x128@2x.png create mode 100644 src-tauri/icons/32x32.png create mode 100644 src-tauri/icons/64x64.png create mode 100644 src-tauri/icons/Square107x107Logo.png create mode 100644 src-tauri/icons/Square142x142Logo.png create mode 100644 src-tauri/icons/Square150x150Logo.png create mode 100644 src-tauri/icons/Square284x284Logo.png create mode 100644 src-tauri/icons/Square30x30Logo.png create mode 100644 src-tauri/icons/Square310x310Logo.png create mode 100644 src-tauri/icons/Square44x44Logo.png create mode 100644 src-tauri/icons/Square71x71Logo.png create mode 100644 src-tauri/icons/Square89x89Logo.png create mode 100644 src-tauri/icons/StoreLogo.png create mode 100644 src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 src-tauri/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 src-tauri/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 src-tauri/icons/android/values/ic_launcher_background.xml create mode 100644 src-tauri/icons/icon.icns create mode 100644 src-tauri/icons/icon.ico create mode 100644 src-tauri/icons/icon.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 src-tauri/src/lib.rs create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 src/lib/tauri.js create mode 100644 src/main.jsx create mode 100644 src/styles.css create mode 160000 third_party/n2n create mode 100644 vite.config.js diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fd624d0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +* text=auto + +*.sh text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.ps1 text eol=crlf +*.cmd text eol=crlf +*.bat text eol=crlf diff --git a/.gitea/workflows/build-windows.yml b/.gitea/workflows/build-windows.yml new file mode 100644 index 0000000..6107571 --- /dev/null +++ b/.gitea/workflows/build-windows.yml @@ -0,0 +1,30 @@ +name: Build Windows Portable Package + +on: + push: + workflow_dispatch: + +jobs: + portable: + # Configure the Gitea runner with the `windows:host` label. + runs-on: windows + defaults: + run: + shell: powershell + steps: + - name: Checkout source and pinned n2n dependency + uses: actions/checkout@v4 + with: + submodules: true + + - name: Build and test + run: .\scripts\build.ps1 -Clean + + - name: Upload portable package + uses: actions/upload-artifact@v4 + with: + name: super-n2n-${{ github.sha }} + path: | + release/super-n2n-portable.zip + release/super-n2n-portable.zip.sha256 + if-no-files-found: error diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae27039 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# JavaScript dependencies and build artifacts +/node_modules/ +/dist/ +*.tsbuildinfo + +# Rust and Tauri generated output +/src-tauri/target/ +/src-tauri/gen/ +/src-tauri/.tauri/ + +# Locally assembled distributable packages +/release/ + +# Local environment files (keep examples in source control) +.env +.env.* +!.env.example + +# Logs and package-manager diagnostics +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor and operating-system metadata +.DS_Store +Thumbs.db +Desktop.ini +$RECYCLE.BIN/ +.idea/ +.vs/ +.vscode/ +*.suo +*.user +*.userossc +*.sln.docstates diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..13e3270 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "n2n"] + path = third_party/n2n + url = https://github.com/ntop/n2n.git + ignore = untracked diff --git a/README.md b/README.md new file mode 100644 index 0000000..6f69ba8 --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +# Super N2N + +Super N2N is a Tauri 2 desktop control plane. Its pinned n2n dependency is +stored as the `third_party/n2n` Git submodule. + +## Reproducible Windows build + +Clone the project together with its fixed n2n source revision: + + git clone --recurse-submodules https://git.code.cq.cn/chun_qiu/supern2n.git + cd supern2n + +The only supported portable-package build entry point is: + + npm run build:portable + +Or call the same script directly when a clean output is required: + + powershell -NoProfile -ExecutionPolicy Bypass -File scripts/build.ps1 -Clean + +The script initializes submodules, compiles n2n, installs frontend dependencies +with `npm ci`, runs Rust tests, creates the Tauri portable package, and writes a +SHA-256 checksum beside it. Outputs are placed in `release/`. + +The Windows build host needs Node.js, Rust with the MSVC toolchain, Git for +Windows (Bash), and MinGW-w64 tools providing `gcc`, `windres`, and +`mingw32-make`. + +## Frontend development + +Install dependencies: + + npm install + +Start the Vite preview: + + npm run dev + +The current preview URL is http://127.0.0.1:1420/. + +## Native desktop development + +Install dependencies, then start the Tauri development window: + + npm install + npm run tauri dev + +The portable build creates `release/super-n2n-portable.zip`. It contains +`n2n/edge.exe` and `n2n/supernode.exe`; on Windows Super N2N starts them with +the relative paths `./n2n/edge.exe` and `./n2n/supernode.exe`. + +## Gitea Actions + +`.gitea/workflows/build-windows.yml` runs on every push and uploads the portable +zip plus its checksum as workflow artifacts. Configure a dedicated Gitea runner +with the `windows:host` label and the Windows build prerequisites above. + +The native command layer can start and stop edge/supernode processes, query the n2n UDP management API, run ping and TCPing checks, and inspect the local firewall state. Browser preview does not fabricate native process, management, or network-check results. + +## Included UI + +- Overview of managed services, management API client records, P2P/relay counts, and management request latency +- Visual Edge and Supernode option editors mapped to n2n command flags +- Auto-IP/DHCP client table populated from the n2n management API +- Topology view populated from the currently configured services and returned client records +- Ping, TCPing, and local firewall checks +- Process, management API, and tool event log diff --git a/index.html b/index.html new file mode 100644 index 0000000..e5741c9 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Super N2N Control + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..99654f3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2036 @@ +{ + "name": "super-n2n", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "super-n2n", + "version": "0.1.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0", + "lucide-react": "^0.468.0", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.8.0", + "@vitejs/plugin-react": "^4.3.4", + "vite": "^6.0.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "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.29.8", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@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/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tauri-apps/api": { + "version": "2.11.1", + "resolved": "https://registry.npmmirror.com/@tauri-apps/api/-/api-2.11.1.tgz", + "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli/-/cli-2.11.4.tgz", + "integrity": "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.11.4", + "@tauri-apps/cli-darwin-x64": "2.11.4", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.4", + "@tauri-apps/cli-linux-arm64-gnu": "2.11.4", + "@tauri-apps/cli-linux-arm64-musl": "2.11.4", + "@tauri-apps/cli-linux-riscv64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-musl": "2.11.4", + "@tauri-apps/cli-win32-arm64-msvc": "2.11.4", + "@tauri-apps/cli-win32-ia32-msvc": "2.11.4", + "@tauri-apps/cli-win32-x64-msvc": "2.11.4" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.4.tgz", + "integrity": "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.4.tgz", + "integrity": "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.4.tgz", + "integrity": "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.4.tgz", + "integrity": "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.4.tgz", + "integrity": "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.4.tgz", + "integrity": "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.4.tgz", + "integrity": "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.4.tgz", + "integrity": "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.4.tgz", + "integrity": "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.4.tgz", + "integrity": "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.4.tgz", + "integrity": "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.28.0", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@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 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "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": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.416", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz", + "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/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/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/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/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/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/lucide-react": { + "version": "0.468.0", + "resolved": "https://registry.npmmirror.com/lucide-react/-/lucide-react-0.468.0.tgz", + "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "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.54", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "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.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "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/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b5f908f --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "super-n2n", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite --host 127.0.0.1 --port 1420", + "build": "vite build", + "preview": "vite preview --host 127.0.0.1", + "tauri": "tauri", + "tauri:portable:raw": "tauri build --no-bundle", + "tauri:portable": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/build.ps1", + "build:portable": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/build.ps1", + "package:portable": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/build.ps1" + }, + "dependencies": { + "@tauri-apps/api": "^2.8.0", + "lucide-react": "^0.468.0", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.8.0", + "@vitejs/plugin-react": "^4.3.4", + "vite": "^6.0.5" + } +} diff --git a/scripts/PORTABLE-README.txt b/scripts/PORTABLE-README.txt new file mode 100644 index 0000000..2bec63f --- /dev/null +++ b/scripts/PORTABLE-README.txt @@ -0,0 +1,11 @@ +Super N2N Portable + +Run super-n2n.exe to open the desktop control plane. + +The directory includes n2n\edge.exe and n2n\supernode.exe. The application starts +them as .\n2n\edge.exe and .\n2n\supernode.exe, so no PATH configuration is required. + +Windows WebView2 is required. It is included by default on current Windows 10 and +Windows 11 installations. + +The bundled n2n programs are distributed under n2n\LICENSE-n2n.txt. diff --git a/scripts/build-n2n.sh b/scripts/build-n2n.sh new file mode 100644 index 0000000..6fdb494 --- /dev/null +++ b/scripts/build-n2n.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +n2n_root="${1:?n2n source path is required}" +make_bin="${2:?MinGW make path is required}" +clean="${3:-0}" + +cd "$n2n_root" +if [[ ! -f config.mak || ! -f include/config.h ]]; then + ./scripts/hack_fakeautoconf.sh +fi + +if [[ "$clean" == "1" ]]; then + "$make_bin" clean +fi + +"$make_bin" edge supernode diff --git a/scripts/build.ps1 b/scripts/build.ps1 new file mode 100644 index 0000000..f87bd0f --- /dev/null +++ b/scripts/build.ps1 @@ -0,0 +1,150 @@ +[CmdletBinding()] +param( + [switch]$Clean, + [switch]$SkipTests +) + +$ErrorActionPreference = 'Stop' +$PSNativeCommandUseErrorActionPreference = $true + +$projectRoot = Split-Path -Parent $PSScriptRoot +$n2nRoot = Join-Path $projectRoot 'third_party\n2n' +$cargoManifest = Join-Path $projectRoot 'src-tauri\Cargo.toml' +$packageScript = Join-Path $PSScriptRoot 'package-portable.ps1' +$n2nBuildScript = Join-Path $PSScriptRoot 'build-n2n.sh' +$archivePath = Join-Path $projectRoot 'release\super-n2n-portable.zip' +$checksumPath = $archivePath + '.sha256' + +function Get-RequiredCommand { + param( + [string[]]$Names, + [string]$Purpose + ) + + foreach ($name in $Names) { + $command = Get-Command $name -CommandType Application -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($command) { + return $command.Source + } + } + + throw "Missing required tool for $Purpose. Expected one of: $($Names -join ', ')." +} + +function Get-GitBash { + param([string]$GitExecutable) + + $gitRoot = Split-Path -Parent (Split-Path -Parent $GitExecutable) + $candidatePaths = @( + (Join-Path $gitRoot 'bin\bash.exe') + ) + $candidatePaths += Get-Command bash.exe -CommandType Application -All -ErrorAction SilentlyContinue | ForEach-Object Source + + foreach ($bashPath in $candidatePaths | Select-Object -Unique) { + if (-not (Test-Path -LiteralPath $bashPath)) { + continue + } + $bashDirectory = Split-Path -Parent $bashPath + $gitUnixBinCandidates = @( + $bashDirectory, + (Join-Path (Split-Path -Parent $bashDirectory) 'usr\bin') + ) + foreach ($gitUnixBin in $gitUnixBinCandidates) { + if ((Test-Path -LiteralPath (Join-Path $gitUnixBin 'sh.exe')) -and + (Test-Path -LiteralPath (Join-Path $gitUnixBin 'cygpath.exe'))) { + return [pscustomobject]@{ + Bash = $bashPath + UnixBin = $gitUnixBin + } + } + } + } + + throw 'Git Bash was not found. Install Git for Windows.' +} + +function Invoke-Checked { + param( + [string]$Executable, + [string[]]$Arguments + ) + + & $Executable @Arguments + if ($LASTEXITCODE -ne 0) { + throw "Command failed with exit code ${LASTEXITCODE}: $Executable $($Arguments -join ' ')" + } +} + +if ($env:OS -ne 'Windows_NT') { + throw 'This script builds the Windows portable package and must run on Windows.' +} + +$git = Get-RequiredCommand -Names @('git.exe', 'git') -Purpose 'source checkout' +$npm = Get-RequiredCommand -Names @('npm.cmd', 'npm') -Purpose 'frontend dependency installation' +$cargo = Get-RequiredCommand -Names @('cargo.exe', 'cargo') -Purpose 'Tauri compilation' +$gitBash = Get-GitBash -GitExecutable $git +$make = Get-RequiredCommand -Names @('mingw32-make.exe', 'mingw32-make') -Purpose 'n2n compilation' +$null = Get-RequiredCommand -Names @('gcc.exe', 'gcc') -Purpose 'n2n compilation' +$null = Get-RequiredCommand -Names @('windres.exe', 'windres') -Purpose 'n2n Windows resource compilation' + +# Make GNU utilities (rm, cp, gzip) available to n2n's Makefile on Windows. +$env:Path = "$($gitBash.UnixBin);$env:Path" +$env:SHELL = Join-Path $gitBash.UnixBin 'sh.exe' + +Push-Location $projectRoot +try { + Invoke-Checked $git @('submodule', 'sync') + Invoke-Checked $git @('submodule', 'update', '--init') + + if (-not (Test-Path -LiteralPath $n2nRoot)) { + throw "The n2n submodule was not initialized: $n2nRoot" + } + + $cygpath = Join-Path $gitBash.UnixBin 'cygpath.exe' + $n2nRootUnix = (& $cygpath -u $n2nRoot).Trim() + $makeUnix = (& $cygpath -u $make).Trim() + $n2nBuildScriptUnix = (& $cygpath -u $n2nBuildScript).Trim() + Invoke-Checked $gitBash.Bash @($n2nBuildScriptUnix, $n2nRootUnix, $makeUnix, $(if ($Clean) { '1' } else { '0' })) + + foreach ($binary in @('edge.exe', 'supernode.exe')) { + if (-not (Test-Path -LiteralPath (Join-Path $n2nRoot $binary))) { + throw "n2n build did not produce $binary." + } + } + + Invoke-Checked $npm @('ci') + + if (-not $SkipTests) { + Invoke-Checked $cargo @('test', '--manifest-path', $cargoManifest) + } + + & $packageScript -Clean:$Clean + if ($LASTEXITCODE -ne 0) { + throw "Portable package script failed with exit code $LASTEXITCODE." + } + + if (-not (Test-Path -LiteralPath $archivePath)) { + throw "Portable archive was not created: $archivePath" + } + + $stream = [System.IO.File]::OpenRead($archivePath) + try { + $sha256 = [System.Security.Cryptography.SHA256]::Create() + try { + $hashBytes = $sha256.ComputeHash($stream) + $hash = -join ($hashBytes | ForEach-Object { $_.ToString('x2') }) + } + finally { + $sha256.Dispose() + } + } + finally { + $stream.Dispose() + } + "$hash *$(Split-Path -Leaf $archivePath)" | Set-Content -LiteralPath $checksumPath -Encoding ascii + Write-Output "Build completed: $archivePath" + Write-Output "SHA-256 checksum: $checksumPath" +} +finally { + Pop-Location +} diff --git a/scripts/package-portable.ps1 b/scripts/package-portable.ps1 new file mode 100644 index 0000000..5d2512a --- /dev/null +++ b/scripts/package-portable.ps1 @@ -0,0 +1,102 @@ +param( + [switch]$Clean +) + +$ErrorActionPreference = 'Stop' + +$projectRoot = Split-Path -Parent $PSScriptRoot +$n2nRoot = Join-Path $projectRoot 'third_party\n2n' +$releaseRoot = Join-Path $projectRoot 'release' +$portableRoot = Join-Path $projectRoot 'release\super-n2n-portable' +$stagingRoot = Join-Path $releaseRoot 'super-n2n-portable-staging' +$archivePath = Join-Path $releaseRoot 'super-n2n-portable.zip' +$releaseRootFull = [System.IO.Path]::GetFullPath($releaseRoot) +$portableRootFull = [System.IO.Path]::GetFullPath($portableRoot) +$stagingRootFull = [System.IO.Path]::GetFullPath($stagingRoot) +$archivePathFull = [System.IO.Path]::GetFullPath($archivePath) + +if ((Split-Path -Parent $portableRootFull) -ne $releaseRootFull -or (Split-Path -Leaf $portableRootFull) -ne 'super-n2n-portable') { + throw "Refusing to replace an unexpected portable output directory: $portableRootFull" +} +if ((Split-Path -Parent $stagingRootFull) -ne $releaseRootFull -or (Split-Path -Leaf $stagingRootFull) -ne 'super-n2n-portable-staging') { + throw "Refusing to replace an unexpected staging directory: $stagingRootFull" +} +if ((Split-Path -Parent $archivePathFull) -ne $releaseRootFull -or (Split-Path -Leaf $archivePathFull) -ne 'super-n2n-portable.zip') { + throw "Refusing to replace an unexpected portable archive: $archivePathFull" +} + +if ($Clean) { + if (Test-Path -LiteralPath $portableRoot) { + Remove-Item -LiteralPath $portableRoot -Recurse -Force + } + if (Test-Path -LiteralPath $archivePath) { + Remove-Item -LiteralPath $archivePath -Force + } +} + +Push-Location $projectRoot +try { + & npm.cmd run tauri:portable:raw + if ($LASTEXITCODE -ne 0) { + exit $LASTEXITCODE + } + + $files = @{ + 'super-n2n.exe' = Join-Path $projectRoot 'src-tauri\target\release\super-n2n.exe' + 'n2n\edge.exe' = Join-Path $n2nRoot 'edge.exe' + 'n2n\supernode.exe' = Join-Path $n2nRoot 'supernode.exe' + 'n2n\LICENSE-n2n.txt' = Join-Path $n2nRoot 'LICENSE' + 'README.txt' = Join-Path $projectRoot 'scripts\PORTABLE-README.txt' + } + + foreach ($entry in $files.GetEnumerator()) { + if (-not (Test-Path -LiteralPath $entry.Value)) { + throw "Required portable artifact is missing: $($entry.Value)" + } + } + + if (Test-Path -LiteralPath $stagingRoot) { + Remove-Item -LiteralPath $stagingRoot -Recurse -Force + } + New-Item -ItemType Directory -Force -Path $stagingRoot | Out-Null + foreach ($entry in $files.GetEnumerator()) { + $destination = Join-Path $stagingRoot $entry.Key + $destinationDirectory = Split-Path -Parent $destination + New-Item -ItemType Directory -Force -Path $destinationDirectory | Out-Null + Copy-Item -LiteralPath $entry.Value -Destination $destination -Force + } + + Compress-Archive -Path (Join-Path $stagingRoot '*') -DestinationPath $archivePath -CompressionLevel Optimal -Force + + New-Item -ItemType Directory -Force -Path $portableRoot | Out-Null + foreach ($legacyName in @('edge.exe', 'supernode.exe', 'LICENSE-n2n.txt')) { + $legacyPath = Join-Path $portableRoot $legacyName + if (Test-Path -LiteralPath $legacyPath) { + try { + Remove-Item -LiteralPath $legacyPath -Force + } + catch { + Write-Warning "Could not remove legacy artifact $legacyPath because it is in use." + } + } + } + foreach ($entry in $files.GetEnumerator()) { + $destination = Join-Path $portableRoot $entry.Key + $destinationDirectory = Split-Path -Parent $destination + New-Item -ItemType Directory -Force -Path $destinationDirectory | Out-Null + try { + Copy-Item -LiteralPath $entry.Value -Destination $destination -Force + } + catch { + Write-Warning "Could not update $destination because it is in use. The zip archive is current." + } + } + + Write-Output "Portable package created: $archivePath" +} +finally { + if (Test-Path -LiteralPath $stagingRoot) { + Remove-Item -LiteralPath $stagingRoot -Recurse -Force + } + Pop-Location +} diff --git a/src-tauri/.taurignore b/src-tauri/.taurignore new file mode 100644 index 0000000..dd69bd3 --- /dev/null +++ b/src-tauri/.taurignore @@ -0,0 +1,7 @@ +# Ignore generated files that would otherwise restart `tauri dev`. +/target/ +/gen/ +/.tauri/ + +# Local native build diagnostics. +*.log diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..220e218 --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,4513 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.1", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.20", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.4+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7955dfc218a8afb29dfeffd540e3a6e96baeb94fe7138228dd7cc6937fbbf96" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.1", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.20", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.1", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.1", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "super-n2n" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", + "windows-sys 0.61.2", +] + +[[package]] +name = "swift-rs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45c444e496845d3f2a351146bff59aae4975b2280238df1dfaa0c7d1846f38e" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.1", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.20", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.20", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.20", + "toml 1.1.4+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.4+spec-1.1.0", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.1", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap 2.14.1", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.1", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.1", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045979e3f037cd18ad1cb2a419dfda133c5c29c9f3453370079f2255d46c257e" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.20", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..9d8d057 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "super-n2n" +version = "0.1.0" +description = "N2N desktop control plane" +authors = ["Super N2N"] +edition = "2021" + +[lib] +name = "super_n2n_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[target.'cfg(windows)'.dependencies] +windows-sys = { version = "0.61", features = ["Win32_Foundation", "Win32_NetworkManagement_IpHelper", "Win32_NetworkManagement_Ndis"] } diff --git a/src-tauri/app-icon.svg b/src-tauri/app-icon.svg new file mode 100644 index 0000000..34183a8 --- /dev/null +++ b/src-tauri/app-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..fd5efab --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,7 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Default permissions for the Super N2N desktop window", + "windows": ["main"], + "permissions": ["core:default"] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..04f5c7a671afaf77d33c70ed4773cd0ac3f0179a GIT binary patch literal 2424 zcma);`9Bj51IM>nY(yE!6?0R3iCFGAa_9CqI=;%SoRgH8(JCr8`#NH-x$md@?0@)C z@6G@K0M$1)HgJrX*}R3m@8~3;x7F;$K0~##E1fs=Gmm#laQm7u*;~?Hj~~6u2LyUl zUA8OwRM*a0{)BBfTH}02`;qO`Bz+O`4_?NuyVrmvPj56UcfS(AYoV>QJ2NzrhUV}8TmwQ-)~>`%HU zwQtqreMjPD?tmgVJLcvZ53#w)elr-VRSk-=67ekVLsT}jJAK$null*@xLAg@bNJ_A zI342;Qfd5q*d&_G(?`fr#WJ~H@k4(I^sHSpU5PlDkl8((In0sA~$%| zep#MR7(Yt<-A(rvMUs$zlO#x`OmK$-ni~5#p2c(9R-ic^l97YZQo>+m1g; z)Uff_LNF*Dr(Dd3_)eCcu*^vQ%-pQQoa_sYCyp7hr>7kmz7BJOj#G(VPM zu4Ul-KE&Ej9PnRmbZIZlWH1*!&!8SQ7)KU1CqxU$f7oi`rFSJgcx+YUmf z9Y>-Twfinx^|M6$fo+X@+*o^Vqj=m7ych}f@=_1ky0v`Uzk-!En$n%^rB3im zOJcd8SdMKJ`xk*?sj$c1*rKaSo)uicw(+#8k}jRxtl{ldd|t^hJInG%`MP^0Q}5~2cDnFKX8Q_nY<6>m=NW1i+eylC0J zwLMPMbol+p>~?owcQ=xxFCUcFT7B+I^%`F^HiFahbNJZbV0fxck)5JgLQ}V%CaZq$O`e6!N&=f&Vum@A}u0 zCBf;$vA^Ew_F?dz44d)#^L3~xo{B2B)YKLpgm}S3<)m#x!6GitwfM&jV%K8bc0VF0 zPwx4Z+S!WYmQs(C&+DB4T3uCJZKf!X=@@EZ+(y@^v$NB@8PyS$JTt=po!8%c3(EF#|vx-Z+cb=0)k^&Pw@-qzY`Gd*U-j*g@~+CAhUtf(=AWzA|44=x&S zTS~l>_qN4v`+LcIr&d}B|JVI66OWsdgZwsxtw!5+KxvS z7HNiGM$itqrvnKiHp5tlEh44_jR6Q;;_F8pFJo#Cn>|lr z0e-h-10}8RvwAg}fdnkT`w|~wbZ76#8g>zz+DYnVworn+u1P^l?ru8ECYro7Et{vZ z0f}y2OFt=eUQ+LC(|aFpOG;x?l?Hlu?v94n2nJTFhVYe2<&m+WI~ucGfM6Byf5#gf z13>}+V8H)COjXXgC;WHoloAu9A+Qy92bFm>F8C1~+HSZXe;?+Hf#2T%(!ne?AGV*+ z@_uFG#AnbZ?xnifWAV|qSKkSIV~hVbbc`^GP~o&Oi01eldKv7&wbkYDgQg&a)^bUo zGExl}I(80Idd1Xk1nGI7$}}|06k~Esuh%Bpi6hH=78nvT1BGbEeq74s{k~v0T=P~< zpa8rqu1fL6X}3#nHZ?`l07cTiA(WMEbgL^g-qnA))m&=>t(47|=6+T1_#2g!Hym9Z zvr<)0!M$T{$RRi{tB68q7@0aEF{$8K0UF!~YjfefaG3P7gm27B?YT|XUeOm;M08n9 zDL&>D_lk)k@3>ESe`i#Ad%M(o%m~1ypf$0l$MS_>Hln9LPRAaHPGSg20##migP`9Z zr&8~j%`1v%-<1;C(c5g5jki;+Q!dDMWoHeC2gRC%^^KYdoVQuwjf$6#Qj9(|7F+c6 UHz`%}&!YmEU$Zu@F?5gpHyI9_iU0rr literal 0 HcmV?d00001 diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7f3e18c8effe772f2f96eb3ba97a29725e26a8 GIT binary patch literal 4555 zcmcha={poq`^V2LGK^(PQHe&Rh=>-ljFde~vSkUOlzq!?hA32oER{8Dwy{NGj4ew^ z*2WS;sUg{o8D{agp5LqAKk&Rd_xF3;8UDoQaVRFZWSy006I^?ln^YAbTYQ zAolGYw!S5I0ob3cckPN<(8N-foA=AnBi%WK=<>OGgyg{&<%Um6WFGWHl1ueYpa+bUkY!x9+(6nrZb-IrGcrYgajRI&yi9YbNM(u8ya%fOwP?rd~~3<4V7HF zIQouqIZpf1M=69@`el~v-xSKbB(*jI2trQS=;CjPwx{&|`O~Grtr7OK(`F>S+&rsg z-%}V*uLW0(rIc9E5DkhlmiXyA|3Y*rU10*|ym%-&jbek)3>IBWA6|nrpMmE!chU)J z{Ih>yW76;k`@}-hr?@&|3HcG*3VMavhupaNfxATB&iAG2x3m%qUn*I}O=~0M)P}j|T z{Dgl5@Y6y&L1Hb<=AFq)b?0#1TDf%}4C7kwPA22No7rEc!aa~P0w;V8*K5BEY0CnZ zmio%jTksRF#;G}5t0OJQo%rE39^cLnm|C{MOW5P)d}s?RIxgh3jt!Ka949Sx*mN8B zvHU7HL?fN%2+q0)UsWEAs(oUurF0$fqKnFjfQAG|TvW!5BFxmhcOiY^ zl^Z}Gm_B0z$)QPMOJy8N6yRRP;a-=-?|yMb0CBx*%A-Q9W}0aL;PTJ_{4tFKAhz*j z8v+0^0QMXl000WWp8j759LS&-BK7Ymcz!pNdRHmG+=N~0KdW5VV8<7pHn+@K3!j)p?8TNLo&3iC-%-}o(f`|n#on~cXOLq{Ol5oIN z)O`1~xf}$6TUl^*{nVa3S&pkrgTpnLx3{>Huddf!FDh-9(g0zGfja32BB!jBIZFk< zofL}&^qeey&(_b%3Qpsx=QUg7I^&E!i4h+-!MJ!)_r{&5)VU}go!Iu0Ya_olb`tONI4W1c?_Nb+ zAc@Rr=B>YeU_&HN8e}K$o-2z2IP6baqa15YonPPMm??JS*LfK+K#vr?z#+|QLXTgW zjlQ#>>}@rn?)uh84;poRtm5I$;H@ynY7`p$$wTJV%VJ-B(%c(dywQ(^asL1McWaz} zmsv2+$_PTmxK2w-!f)z?xU~PnKeZb!c_*$`UW+P%gm-V(eoK+MS=95c*hqPnh^5ay zyzk|e{*`J2WlY_}5C*|C(Uh*XxN%Q2FqkSH4qJl5|Io7oi^>uIOG#mT}A3 zeM7Z|`pbWAuprAkJlhaqa0uaug}3^-=92?xL-^C-_4C3rYu#+;DV{4c{sDZrEH@VQ zD3b6U$`A+HGc{j`r)aW_-zB`57iyvEsSHb|{_XAVkhRbwn?C{qb?ZJ1)H9>_I6g9v ziB%Zr47ZC*;d+l#nM=JdbzP6(%PS;jd&0wG=_e&6`Jbwcme8>!t40U|IgG3P6zs+H zyE*+FKbVt;IWrt&s`^oNqMxUQPwGcGZ!3ErvX#1lPq~*9+I19?dCX(;-h;qlynAgh z7TzEYuO?>LaOOTIuD6l(Wi00D_ZGi3@BA%uW^C>D=E=`sI5y%oVj-L#i>|%f0>|POpfgAvqM=C>`y5pPBnc> z70zSCDRX&?>BB0wr%xZn!^KXFOTrhu*eT-gA!B3*$bdG+(G8m#}&Efr8Rf z>07kqz%7wXAM1DSLGvoUYvo)Agi{DM80{h7u35gu`BwF9w1u=sQq(gx@oi_&nYN&w zE|;D$dtK;fpN(cC=TN`Kvv`RZPm@aagniB%Y6-^mi4pBHfpOH?lM-PpBiPP<`~-M? z_o^ZEbQoE#MveQ~tuV`$Gn3M35$?8{7vKHRkPO@Gkz9;qt%1(|a=hi1{;WA;r$_e)o@=WA!0M=$Gd)c+&rG^; zXSIjIS>Q*Cm{e!*3r>cItM-3dhAK7O|SAw-av{M<}VuzBDMp2pKJ?$)t<8CK1z( zj;?uimrMXwm5cxL1X>s+aF`v*4`I$(D~DI;6f-h^4kcKW1@-8iRl0w4>(VXIud=H; zYt5-6w5@b*=ZlXbY`l+qtgY^xeFs|-iOUhRR|>EA*#7PQ-2mk#fq{{zwK1|8Wc6n= z-m>ym)2?_b?a!lO^Q0Fy9W~x3YGa90wJj)|l)5gPw_qesVRYfFKU+@c_wu8Ju>NRW zuB}Vfpone^`c*fscdLR1@6WKq$ECX12ceN9Rh<44Re<`t7X=U;B#f^2#4V?S#s}c& z6?gJ7@vC6w$3OM`o}?D1df~@&pR<=)V`OKDD{WRAX=GRXMzq!Qi7M{Vg7}y{j}i25 zMF#8fO;WiUxOB}y$1%=Hw6$M6w3@h33qm%uDg(UPJJu<`$ZO>45BWKiV)<5MTB#S@ zp*FD@6yvFlB=wZ7eo@LD?0b8MBH>3F^BnYr+tlYkb@zw$to0K#ynN0{ar)rM zGEB1y;|6j5w9aU}cqBsGVPU0V{Pn>RaqLAEXy7|V$YxyI*l|deNVq!V&yH+%QzaGe zzS=jwW)1gOTD|XCWbbWxjr)~tlC zyH;tjbRN095mIs$;kEEQ$*k$6uS|}iSEg$P_cmZM%_E(?!&Iy!!%N}l^StY5*K{B`8YrA?JeBq@$Suer!qUjV=ZJl{WEp=PA&~K z@XfFC&Dm2qilf$}#VU+tHpO;)d#0>raRKXyo%J@+8KBg-(F|6I7FJgCAJ%v05>&$P zF*~ND#)m_6Uk`C4v$rpNk0mysC3AF;g(@#Y^-J>e%s;Ugt1zM(s~wQ=VcCx!)m~HT zUmMH3(tIdmfoZM(O)*04-rZ}#PwmuP^_PQj|El`8{zfO}JjZO8*19h-Lq312=uc$r z2gt0*EG+A}#r3qrJNpf&qoHzUpI5rwS8i-pPwl1tok_+*r@gunq>CL56efPX^0c9g zzgJm2qA)SxX*a#lz>UvSVr3h+{EhNk5)QX)mN8tM?q(x!fg7-$yGr&a;}r-;>ISLF zMjo5FA3|QIq)zV29%4*>5?c9}){w^J*n91tWdb&vdAu;12PyQ!f=4Fv1H+_?%z8Ij zQ1G$6o;K-E?MUd`cEZAew%#6Z)L+;l`4ENfU{UoPPiB?xo7$ENeyv_&tv8NwqCnLV zwRIiyE%Mp_lc-Pu?C%T1?x7gMSoc?DtOn3f$l1tg`Nw&OlDV6ZiXW;%06IjCj2$Xa zs8(E~G?Zh|;EwxGuQl7rX=Ax9AK${`Xb>Fmy!-3x2aA~>NT-S3uPas>{C@8XK|;|j z#>7!)&__IsM8aGA8DexV3`4&vkv_eOUfkL8+-;(wgrM76!RXY(8c)%|5o`=2`35oni>?tz%- zl8Q|^VbPIJU;b!t=pK$cxFT{@ao!?Jz`+@q2&L&t=v@VeWB)S5SjX_ENheISpMt|z zZE6ZHh%SeUoZtcS@h$4)Q^4^G0DZ4_Rc?c~2!Oi*9UxJz>R=O$%Uxgke@sq;AR@TD zYZ_1b^uelh@p&%b`izx5#t5|UH6LN`T5_PrfBY!Pp3e6H(66Da@bFyDT&G8?(i5EM zp0(Y$aMkmxGzl0aDu*fj12)en`(1ZX1AS=bOt{MVv7A{B0LN|~Z-=!afxP49@gdke z4f^+`khd5w=L};In}3w$=DaEr`51k`PX7x8j&t1cbuO{@5AZ+Vtsh_a#N;XxN)Omf zKh#V3`i+mZxZfm{!`R(530C)g-W2@ywH9ps6@4}EB(1)(_xdS?f<+C=-PD7s zhJ;K#BrMi4CBj(pjm^r}A2)iSC!um^D9B!Bz8}}(z7>T4@ca#m1c(J1@|Usw(A7f3 zi^FgfNg(1@C$pZbH9fAa<}K|d!Zt7BnIkXo@yy1YKq`FQqS$g}aIM7&2qYU3&}KYP zrMA$IJ*QHF+07xKTQw5aTiM@_sd)%mBPZBt--QEm1Z@7sxL=Eb2UG_!wcbCY^H80j zZjiBt0?W4?B%X$oFKrR{NO}^<{E=ta9l(T7l2=^)y>BYR}P%2S*9A{frGu*v%m-r9>X`Vf2CW=^U zN;<>N9lPLs9YsEd{yZH9Zh2vbc@oMDXO2B#xKOf&X#IE{uxj-R1`A7b6tNS>Pcnps zM!@;I`>lYE;03cEvT`xhiEF~;N`-tF)Y&BQ>ZdpxGNQ2mQ#TjPojZ@9Siz(#3|H@e zW_a+Am0`A^0>kTrw-|Prw1II?Rs&IH;!K2~1as}$bp|m}F@`5ko-#BxHeDbyF#gxV6CpABNyvs`xU*qT2)HbuBpc#Q1Gby8z!u;GpKrY)+j4>> zA;@ri;Ln$z3|AXB)2<{Otqn&VKo0=Q1s?~{{*O$MzS;l*pxv;p*##h%pWeO)cFhc! zz`ayPrT{ue1<3LMkloB6-j6R|9&qsTt^oDbfLujzzl~-VGpqz!9s#r*6zU8B*bd^H TqXi0@00000NkvXXu0mjfn1>ER literal 0 HcmV?d00001 diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..95541b6c78e6b7db1535efa0a571e065bca6a2b8 GIT binary patch literal 1247 zcmV<51R(o~P)hrM2*2< zA`yL&2Q>y~7{Y^Y4}b%f$be19)Fp&&bQ3y+w$!anJL)+{i~X}(*L&~UwDCzU&qMwt~7L+E2AX_&iiy)+tKT$%XuIvr6wILyb zcz3?f#f}(&Jfn-*nG=jNfr-9I(me;soL>*)pcZq{NI3M@Nx@ND>qh*}6&Md}Dws)n z+X-XBfpB=UNwQUZVvxB%?=rw#gbN%U5qFtkY_u3%0B`}g09*hr02hD@zy;s}_hTu$>>$Bd?4rV$#o9YZF)FE(2+gIiYp7;JU`A3 zHIVPGOc9R?GIi`{)xVcl52&oPV`KY9EL&F3K3~1+MPF|p0)b#oUeNa4%PH4prvm7I z`aoXns}^AEv(Mnot~XdGl0l8XwfAj&bGUoqbN|IQb|mBSXZ`HRhkXi@R8hVs7xMc) z{D5quTQb_{wT_NGA1k20t%9iDLVTA=xTEcK5hKVvOqJju}V-2qL{fgK; zYXiOPtMUM<`02C#8Oo=Fj>Nh(ZHn$l$#=iA8qE#1l+RdU7covsY>6t3tDIzrcR#9qhN2JM5pQ`*?zk+loj?vF%<{1s0>PhJP4Z@Ji6@^+Jz(&yL(wZ2QfkJj#F0g|HZX%_#_;8R&=I zo_!t$gF&oq%^n25B|-3^v^X$PCgWXa6AOa3$9!y2lnk3(j>Ee?MulwEWM6d}j6@=s zp1#3SO*ZV_^*SzGxTyR)(K|SL`Wkx|%_aoztHK$(6Njo?jC?EvFfw`f z@Llx4cipGizNU2m&95}iwzfV2i^Y+Jw5!M|9}~4Sc`v>npB3LA}T)o&XEAF)C^qH9c_a`~=3o z`lgd30k{At_@?Nvf%y-M zthCIq5IiEQt1~Qrp+_YDDpCOg2BaUL+)ZJ>KP=hGB~~G7sL{v!e(&V>|Lg}y*8K(x zhQt4IPAZ&awZbzrAXb*V>&sSmO5r30yFeOB+!KbA$sn002ov JPDHLkV1mtfS>yl! literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0b2fc5928d6b3eed33bb518679e4f40b6bafac5c GIT binary patch literal 2116 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 bowFO7=hNFMZ(Y4STLd&!^;9a9Y{UKw`>5p5 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..31f4de9ad1727b3daf885ae00dcc993fd5862d12 GIT binary patch literal 529 zcmV+s0`C2ZP)$Yi~VO90Kmd9Kw#A3fw!2ImxDnr(iE@e zN6Sw${Qmrdx)y^hRZg?TtC>?ufZTeatwQQG~PS zR~j;Sn2Ukg=QsoyCWpAF;?+Cg*@+38;Jmr>@$!3D+-2Bt@)g5r25yG+e3IZ` z-euAT#)S0Z4Qdbw4GUqAk&$6|^5hA_>Q!s7CM*#CeCrj%@u)c@>BVa?r~mAfR-NwweW#hgI2){v@{cBDToUIaa^Up Tm5xhg00000NkvXXu0mjf*>dso literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f02e99cc144927aa10b6044feafa3d68040983d0 GIT binary patch literal 5681 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 dFBC55m>vJmCSnxvs*984SP;;u_Xfwx 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 tn?>p literal 0 HcmV?d00001 diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc49c8717688d6fe59d3f29e0bf5bc178c289f9 GIT binary patch literal 957 zcmV;u148_XP));B$>6vl@ZweH=%iz@NEaZH znp%Mc@r8mEhy)8nlnX}Vuy1<0E1(Ed;y0S0M(A*iD#Q7GV&;?Lhf{=M<{Y2M(g}i4 zPDoThy|Bkl^|DQ-+UM`F#BRp;odU|@Jnj8w7FG8Q3 z#JrXbRt$3vWy6R@H_qXP442+bmWe4v?VuTHCVfHe?aWCo6OsS*hhWG@EUU-pK`YG{-dr{q8h$6IqJssJfhvAXhbw38WD|1 zqy^EXdKMfv%(JivwL?S~Ph&gQfg%o`Tv0fvG-@7JB*> + + + + \ No newline at end of file diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2e90ee4c727fb1789a1279d35e91782d412269 GIT binary patch literal 1803 zcmV+m2lV)fP)E!(P$vYSMtmi$&-|T)oz7t_TNmlH3LIHe z@+z3S=6X~%)WOMFr|d>NvWQfB46ToSIHn;bm5xCG>!p-vB_a!_!dD-GmC2o=`5P#q3i{0{5TOE}gE{2#IT`{vHi9+Lq7tYHgPk=IzIFzp*UW|@D^L^} zj^hj(`Z#F<G61=X&MK_WELCA zSX?-55X>@?Bq5W@@P|&ha1vBiMR!*>;;}fq6%{xkb4eK|WuW1yWtepTVtBnG{{E;H zyB_}tqAHzGy3%?Y(P$KPb+s@I105Zmu*u_IuNRhO9rMtsK$H|tOmSV;QA-b6z4{R} zHeH86WhM6S+mE;2d>h|=yOq4;;W#K52!nvMqvF8&A93;Gdi2k_5LMUB#RZM~@#mIS z$dwvg+vRJUni}!Y!w+Ci!yKggQ~2`Buh8851~*Uz8Rt|U`LC(U8=Bv@Ha}jOAm-+0 zo>_}W?t1|KP$e|-M8mXMXk6BWojZ1-{Xjck!#c{eVd2t?f>?L=bgZaxFv~H}8>~cn zN)4QzeyAZoFhRxArmM03^*1nY=3MTfNF;(Ki>^d~jJ@*6)vHW4^`nuEd1QU`< zrLg3xCAee7awM}UZgFP$o`GIe`@^_l+4b1AZ5x5LIcSmYdGz+FxNG?|m`4rFOvivO zpmWv?R6TziEW_lHeD9=2Oz?-$lSx96WMs2hm>v^1-Fzc9ZrFtF+kZkJ5EwDhJ*9+` zMO7wPRfQ_W&#y&Eg($f42F0tXLAl_PV!;?j4BRbz;uxlWlXm-sLc#O zm{1AtY%MI{rrYy6LX_`YLJk^Wd-UPocrQD7fPAngMJ|Fh%-h-CSTX6r~tB`gL0^(38gwdPn!>6BqMwKPY zT~GBBHr>;_rGuB!g_qUfaCHqnubYD8zHa>a>esOJ9MYx%asKbP;t3GNrGOYQv4^WuI-SPu)>b%lM>rfI;SPS@wF6JCc^W@_|07gQ+Ezn2v*cenZ>dUl59h;rIIyi^cHX z2k+yh7hgdlk>H>TfyhtnQS!uOUY)wSx(f3ICB4&^!Mta0!NgTpz^gKz*iAgKC66bl zl2Pd%eKJ4{U2yRp$7`qA-Cb@);qdPlb>PE?3Y{!P}kONx5 z=5Mr3->4hF!Tp2{jrJ4DS=>*IDkqMQ5|1n)dvpLstp6O{*$uzor8sAya_;W2hcp{w zy~bbJoRh;-~XRi2k}1z@h{9tEQk5t2+IHf002ovPDHLkV1k@UWwHPO literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..aa20e2a086ba60164698c896cb71146a7d7fa792 GIT binary patch literal 2872 zcma);S5OlO6M#cClt}1eDAIdNLQz081PC1j>4JnJJ)9zPv>+{1Ls6P^5TytlEg+#O zgeIM%7!4g2sR8K+KlgqQ|ID|$GdsHv`}A#sxv4&g`8qQI000@FkoPWY$-e<)yv!e| zJP-hY`N9Bs*DCnSWwDjpl(%Q5Zko`Uw7K-kMlHP2BwOsH8Wz%!cAht zg?xo z0(^lnq-4Qx7b3kxhkml&RYc4kbw^9R)m4uPe`*|I&H69iGq5$CG`dDowo2s-nXI`s zrU`dfJ5pXkq*9ITM~TZrI{WX6|E#+%Lfw zKqDiovNjkQtg{eUt-ivp0*3-{=w45Fu&bwFayYLl%~jB799V^QsB3q(wZZ5~!#uYV zLqK5I$WT=PTWvF4*Ih~T))*Xt(k~}*cvBu>PstwoV*?Tr4`L6Lm{__~q8UE+FatrChoRty?)AQ0p zbDC3{3}n2n+5Fo)puQAk-_OuypCa62;Wj*QUv1VyM2nhR5 z{LtKMzD+CoPNC<8XrUCwTub}42ga7!y+W=h$eOYB?9VK!-l_p_EdUUUTg!l8N11!S zzf_ema}4HVPW`~J$sRm5`pDXCuk!Tyh%W@FV?*2K=vQ2J{5 zwr#i*MST}dx8bED-_thu7#Y{YfC$V)>1UrewRKPV_&-WWBB=9{qQSirCpb3aM+adi zY{_Q1k4_rB?J)inB1dlcOn#Zy_22vZs3*=gI$6njS75{ZVW{o%MgdhTVLLmg)?^vk ztjQ&6Zy?z(R_&jQz3=27$YrL=Dh<89^%oi;wNK`VP@y1B_egO$(EPFAASdrDU#Wa> zVen&aEkcD%%_1oZvY(~WS@NN@kH7U1#j9a|2j8!y70pq2^W>$ejZhrOof93@oE6kb z<#^SA!PLX+F^6$NzGYkfr#Jyhv}ch2@d_z?pW)X=97x>2I(UQnwiM$4y@Bg2aK<^~ z`LomE8Z2V<(rD=Hm<7Hc$9CR*Ot9lRBcF{W;!+kRRu8vlyn02nUyT;ty?Ik`u%j)q z#@lP(PLC(N?DU8BmIEnVOOYl=p3X!Sa!Uc}-$GZrZ8kvI{+!d$=<$0}8iH;CsMWS6 z6`WX~w~YGq=NU9n&XgGjII~Dip(!6$tQv~ptFOOf&talfMhp=ba_hg^JltYS>{_L= z4*cXx>z6i|3LU0|ip6ad#$yBVyH6}NUoJ{)^LM5Zjm05`%k0MiR01jPW#_2cP!_X* zQw#9$wsY>3&$Hn?Kh_zschZRa5JT}E0SyA5dz{tY8U!<5{=FFpd4b<17S_KNC(xfU zCkbHF95|k3uj%Zsj%t`Z*zRMo9*>S?c~vhw(A*U*vQU$&B8_Or6;MoWVITd4eXmCpb?lbb6X?TB_&_0owcdGKX zJInGwZ#YXb@&yK{hm+30Hl9LUv)r1k5W8lH%0>Z{V>d$obeKVV+#3?>{RUR?Hdkt;-F2ihxGA~*eO!h8JV$<4 z&b_8M+YLr)c4l{q)Ue44dABDm!%SF4W}&^04xzMgEpV=&n`cN}lg?{wU3;jL$V@IPeOs?9j!7}x$$Avsgl zs2s%Nll(yIuB#lLiS5PAwV}*R)!Pky_gt$lH~cHQG@fEIW`1#BcdV^$d{zM{r2U*z zY0YMNK=hL_TYUq^U{ ziJD-e=j^}!eYFP$Cw5Ub3RJ^V68lw#E6L_xs!?qLm^M8k;J;XRKD8bG(awCZur272a;Rt-q%JlMb`-jC3EW?cl>_o zjvm!${b{9_Bn9nP|gG-nWbcqPKC1Hng{oV^2;>7o%4^_TG+)OcC<_f zLT^Bb9`T%;+&m(M(4ky<{kuCMF7^2;V3C0U%C6QRgo}x}-a{HZH+5+f!!4rMt_diH z;o!hENI1=x$#5v>bCEH#aC5yK5QbA2q~{g(j=S`L=H!ZUrZ;*;2dceJJGQdkp}ZD2 zw_AU<5CD_ZNTbvB+3K}u(SuyOGtK&c`|7{#W*9h>=ATWYo><=WVHTU~!nB|yyvFV- zd?`yKxgJ*}kiCC_{lV`#x&Zb26*EVQ8$iZ9v9EJ)K$xitfvB62I?{W^5Dk*Iy*w)| zzs$EO3b>@tGATqPAacuP6U3y<&m3zY8m#+}pb<7aMzK+Q^6dU6rLHxX~9UbN^0U7xtX)v*=yA==NT&)WNn!owUcT&OINROozm4sd?@9`l+?oM zd}E>16OQ`J77T-0N-?gOyss_{sQyy4iAY|Smd$?arro1i&Z893ht@q>md-uCE~}N| l-Y48Kmhfjs$oTdiHnhU4OV*KV@A4xC80eZJYY-2k{s%diNIL)k literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..676f93f44e423bd06a99a0ad488125eb76d1dfd3 GIT binary patch literal 1659 zcmV->288*EP)-YWBB&9f1c)Ds zpdSW*OblNwputdH1tA7Xj0XB3rL>e;eDr+gE3Tn^!#83ivnhr7bAGJ8(k+FIg7~vVo5BNOdi&1 zUl_e-Tafj5J`7EVt{Wp~F0It7@jX* zg9XJ45a7zM)`W@Os%`rZn(7Z;*GEggZA4X9oJ124O5V2uFeMA`+JWN2M`4I2 zqX+ghJC+tNfz7VqP}M=CDQPft9h3qHgjB36FTn0i#dyx8V_DP(oxFK{b{-tr=@2Xu z+zay{V_ z7aPbzpFl8xtIf^4nlKg=61B4zd(qV!g>08$r4g)Tq)(JluVg@`_aeS9%%F40EV&=Aa0(vi#Xcqi5Z%n;lzQ;188Y)h0E&T-e#U*IlvOCw)O&= zuQcgDrlP6!Dt3SI6{@NZP{nfHGam*MJ8p>`t`jATN(OX7CY@+#z_FvpM$ris zh3iXE^kF#^Dp_hz5EtIvKcY?;R6yr;2s>H z+5Gp6o^ zuPEZPSV{ygZ1HBX%mGbbo`e>P@-VtrV?ajJf(cs`F@wAtN@1Tf`Rj?{)%4+8*$EaA zdQ^iRj-~b*d+P6YB+00x>;NY7Xet?-%VIK*p&r!kxR~tovS#lW}-H(PKQkhw)SDZxQ(auR;^o{ssuf7C{hM;dlT5002ovPDHLk FV1f-h_51(; literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cdfbe1083d6882ed542805b7edd036ef908a93ea GIT binary patch literal 1521 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..23a2788abb7f1a8869be038c985687f1c5858005 GIT binary patch literal 1464 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 UXkJ7?NdN!<07*qoM6N<$f~ELD{{R30 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..bea87c51ce5e3a941b5a0ec9fda92f5ceffa7cca GIT binary patch literal 3771 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 R`k$o~psfy8t5mTK{|^iX8@>Pl literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..21c1a61d7328fc90df6421a81d2ec072529b2a8d GIT binary patch literal 3126 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e85134ffc0315a7a77c8b3e9280f175dcdf07fb6 GIT binary patch literal 5897 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 P8_>9`i}mEr0|(_Lrk3z!8;ZD+UtqRF-^o0gr&l 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f6df447472ea246535b03c6e719c2bbecab8f95e GIT binary patch literal 6535 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 EUy3bVI{*Lx literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..0072e2cec5c78ba8734137aa912afb42cef345dd GIT binary patch literal 7628 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1114e18e88d66d49e7ea6b99c4e3669182e6724e GIT binary patch literal 5625 zcmZvgWl$7s*T;8>g_REJSZN7qSddss=>}nm1w=XoDX9fPLYgI)mIVO`>68^DMOvh# zK_mp}S|0EFdEXE3%sX?P>&!L(|2cE!nmJ#7vHH4?$?h=S0RRAG8tSTsfAgn*f*ADo zHe7Hc0s!uQ(oj`04w&1sB6)7P;fvc}w5l>~uM-?B{Mr`GMqTV&^v!q!=Y>K~DdRzfbkFjWqK`u|OsUpzS$ z`qoTKaWWQh=C3__78d`4CK?hZh#F2MM4C*azbQt*b!XM=zG-%Yg&u-$40O z0Q=DVXh$GybE`FAf`DUflIu?;2y$e^96=f54`ye z!AV8C6NmzZwNDyDPiN=^=|$6DI=r+Vazv3Bbdo?9-UB1&^L+Y5LabbAcn}ICU9nWq z^lHL&;2smZEMhisZSN}O7jqcvajRC40e+e}KHs#X*Z@Y%$>Jq=bD@zI*T!`50&YFv z9bUo%AwC~F*?iD&yGZi$W|=a$2#`x^pzlIv(>i`_P=8N8xhLL2xHtD9mM`D~DT5&W zEG*Fp58)0tRFR)K=uhIfw56{Mqe!pmt{@?(7KaI86IA_;wew}NF5Y2@hMMZXdRmx6 z+t-UnbEqh%b*uZkuWCfYM1I4Rd!v85*-TPrd+gk%?}-QmMC(&>-_lqLo|hwf7zzK{$_?S|xF z&vG^RblQTOph?c0q5==H(}brPR$j=g(l%?VmIX~(Yoz%?L>?GR;u3enyY8A?l;2a0 zCBEQn%xYS#&+^{0Bj}6fAM$JR_J~VU;L|@kQG~i1^Cj3A5wx=f;al9UWX`fg%l2v~ z7cppv4xN;Yb~Ak8;f4)658;>-M+D$y)Hns*KJg@Yu?zIQI!XH^CVK=piEEV(+gVdV9 z(%Sozrz8Fut9$LC`6u@@DVcm1aowD@`io8lS#*Q;ccLj+l|^W~3F(7DRaI44P-l)^ z78U1&v6Rn`KLnk5xGkL1fiADc$DqLQF!pVqwsoQso+Pxw$A{!=#f{7&w>8yiJPfym zk%}SNs)oVQtxm10mb)SQd2cVJJQfjpS+I&XzKHhrB)k0unUIG+2zRHnh%cv;_Ftaf0jnSmgazVNay3dH z2jj(7^I2nY_qY;!Td;%@;g&$aVt~o#wSMX4CeLedwM8ha!$@v;Ad*$}kmEkq_)o4j z{~+Fo>toHw>xBjlAxKY6xLC&@(ChaTVj%ehUO*6(p|j0&0kInYEkkF7SRNQl4h zn`z&7cWd*{i&TpsB#Sd0!qJfdHZpMd`1md7t8oX#$m@F!!|2#H80+dbbfUbHK;A^7 zK?ZQq&pTKPM+n&sGWhMz#0Hrz#!3GOpy{&tAjeHH4*ZJyPOt6pDeYl=STdzPmk z9UY|^Zqst45Lb5wW~Z21NO@9i3F&{sh1^X8dj+^Qc$61`o>))BZ)9rsy;5b*$i4gN zRk(tLed^B>!sJv>b$FA;n3)Q6a!%QK`rPa1#+go{Z3Daze(GNdC{w3VXBCsr<t{pK>gdqa*|sQ0VY%X`r+jGzJaMv8Zs&Oh)35y&jG->97Vs>e{RU!>k1kA|p;Iz3 z-!3*n#6XOt3ImaATrO&!UtZdZBIlGv|iCwhiP-QYSfsmdZ#=i75wmW~nZ@w{iBZL93*EFbR%04^V z98T9?$fQbjQWd0<5L&<6qolTQkk>W9{FC1rg8!yp6p-MHrZ1|#6|l=aFe~^^)oUn*IqJ#=eJAOLOhbv z%#?}TbH(JpueVRmtFz<}!zJo`y}mQvkQRt&SYl3e`cDfvDWw#`75kw~Kuxx!;!s`j zk=vCg~Sgg{c*HsvK;Mv<%0fA}z7c*i$3f@RE?| z+EOomUAAkd?xZ@?fIu3Kdfu(9C8kI1X2cqXuGaQa%BBDV-g~9#8x=QIbKXwrbnt+Z zM&5ddQ8C7W)U@LvrnZdga@QU4c(ol2cf}+FILj$Xwxieup~Agm z0&D&Q!d6Dp-yIo-+M3iiheln+ibj;P=s5%ob}+RfKk$bbWmV)-aRe5-9~z+4!(E_n zSITe8#Y&EL?zCV{-0_?R16O-udEf_wbEvl!&gNRv-x^OC9|gh4>zZ(_cDFfDWKq7J z&GSU)`|k{#QeTcw{8(M~(3Z#j-cvYJrfpXyUHW*M>6gpj?w2gkjJAW}kx zY7Vd{d(*eXh^KjWb^F8${NW*q2`YnZ$In(lq$RS`%6|vJgSo0UbisqP8;5ltCTJ1@ ztp58ueTFrws1{^%&nSO54tmmE8N5x=mbrW1wdXcc!OP}t`fDtK0d<~Q>nqab4K=$>%F?*hPT1x1;nI~;f zu1AkMqwsID>iMNQiQY_pYI}ZSHQ8KWQ}O)E(MB^7N8npE!6S5weLg1**Ne}2UL)Pn&Tm$(dF4^2z91%LXp=KV z)9tzmw6rxeAjcZN@E3s|@%N`E6gb8shp$2|qL!j(^o0D;r%&eA9rxHKw(&+4j#%dQ zJ;bRoX3VAJ*>sWH@HPhp1EZL~%X00C^Jkxfcc1Tnnf*y$Rk%6!yoAcx=yI1~^Y)^p zJR-d?Vt3EJ#!Sbj|HDo!+04=Lqit~6aH1LG%ERBg+kI_E-!(Ljt^VXT?VL8dNW!d1 ze)7^*^d8-wkO*eIBV#^%YfpiX3!5onu3f!krb_73l?bHgI^-;kRd*3eFw1t0ahCZU z#qcb2NuNwq?5^GIQBLjQyxtq00kRR_kxE}t+HW@@BaK%UQ#yx%4C79;dwY8=s};g` zOHw%I>!x2TV%LPn#t&_~KEKedexQzAx0p{{Lx%b@461^*hFxIL_0bHu_e5*G zO@aBDphwC!-rjFdNoLjzsrKM>+fdm^xPxyOU`?H9UvJCdA}#bCGF?e~Ovcb*7cSxD+0928%9pv_JNLGCGsRSk?N~MDIK%s&z0woehRHoY9+onHa2kKR zdtjO^SD0wo84sUo`JV4|X(gVFjx;~&nOivc-q#hZauKy=E&SPQE6EPJA0fulTyVA1 zxYAOlG%HD`vv%Gaj6GaTc*LFQ8r66A0#4=E%N^3vW`qWa%6B6dl=(;c5lILZaMn zj|Gf|j4A|DEt|2{ZG2a#X#FogR>o&ifx( z-1?WFvh=R!AfWIU#%`Wdh;*c*vO&O79AD#GqwXgka1iKqQS?V1Nykg4T&(No2fJ3- z!E<0!!8GPi{<4u(THaTN!C%JRC!g5+F|n80?KoxBA#3bn0g{(+aHQa4)X!?p4!#_o zv9XD%l=7!Ib)mV)u2Rc(hVZ_&;6eKhh|*(poWwLqee_3eYaRBN?`({E76gLNr{|xs z1d{QcgTwS5n;dt8ZO@O`%n~&U3Q*5P<|_uaBvIMopY_^?e(;z_IQ84^THH#diXHBK z?Jq#R0flKE;A^L)HtyzSltJ1>9{<6#1meTaAsO}MLM*!UAZF)Uqd3Rj zu6=(GQ>N``+azcaImmH=3ORg(mXM+oDtf}knv!*k+gf^!*bN=qKbx^{p$f<_e^j0x zaA_W;@hDZNDq!=;-urpka`zzkk=0wRdY;0MhUHSG-oVq@JK3rt2BIi#&4%>?KWo z{WZ?F8hxeh_ifMNRcC~C?#G>4>GAgZNy~7}$!MOj?J9^UMca>Ektg`&GVAatue$n> zM6Jx}>i#8>VqF%rLOMm5H(Dt%_BML_;)~R7@WFJ{1(9Sp^YdkU#m&~<1;(Gdy%|@C z0rGfFqd%Dw*Ws@3m0oDq46odYk@0^Z*(l!U<+Cszv4sk_H7GwB-zE=vC_79zBN4*i zz)hV#!)e3iz!S86^bMR!ljZ)Fmn^Q-7=x(XAiXm;)9JDH*{8FPwSWFB=MwVp=Zomm z3bF0q9)R4e$N7@1yOxqpCDCdx8Z|ewg=iZ;#{tStUG#aS1^PYn>=Er<|d%S>Nc2_;ws zLFk8%=M!9F$le7C7-jN>JW>gy1lv5jCKDw9W-lE*;i4k24;@{idi1ZT!S=8C&luV4 z9xae!+8!I!hd&nE%GC=cYE@W#0~){OA= znV&C}1Ix(%a!5e~00el91po-cz%fA> z5l|_L7a&JSEG7qBX4Frf1p}zT9qj)P9Q_BC$_m{m);MfMG*<{p{YAO}4K-cWYGs>O F{{aE2v%3HQ literal 0 HcmV?d00001 diff --git a/src-tauri/icons/android/values/ic_launcher_background.xml b/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..ea9c223 --- /dev/null +++ b/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..06233720d374ae6cb559920063e7a477232b44c5 GIT binary patch literal 55374 zcmeEucT`kMw`XlsWA{FOH`sFAR-wh(+vnBDpAQ2Bq=$g5+#G= zoIwl-NDd7&-8~2I{la_mzHesUA2Vy#x~#>i-c`Hy-nFYv)vn*Eb8IagTmcx>w6(k_ z0svzEskWvvJqZDpF0sB6jnv*O&-&7a2|1wzx|+$%@jDn-UAbG0kC3e>&a)~-{`z`=@ZO+uSc){ zT&B9PET=i$*vwa-6F6Z}p_(A0Z9Ng-DpM;E2j1NO?uOFRDeosAaSdlp0lKZ2zI-M| z2Xkdv#d9GbAl+KkWH~ms{ilAu4{Cn3{UO7ky_e*b-blID(DSsDvI^Y{ViBu_>PNz9 zL>~UK8LEplWPF=fW@(965->LCkvFedyk_pm4fnUuH0#}&`piFKoelqq*+-lG%4M-w zD(#u=Dv&VZi&A`1SB|syaeeRo#g)`7{^<1A4I9F*wkN(c(Rw;ydBnNNtaX@TIj~B1e5B*W$5BH;w6Cw+)_Zpi*YZ0P zp(-lH%VxUdEa`>87`9t$*L#9x=9&DwPav6|a(yo%{bj>&T$0p?Grb|67Zz!ZhdpbKN|P0B4LE3%ZtUUil}2u6`;3y9!tSX*eH_?z6jDKa2eL7@y^pbrvCIPvz!{ z3SiQdPm|8wfWav;xKk%JZr3RYjCJrDoV@?GuNCjN`VB|=MX54Opr8$IB)MpwOS)U$ zAbJU95L3PM*}(n!m(%1`X!h%qOu^CZJUWu`;2EXn{7Bi`2p^y4nqg7LABxOV@5Pp| zXz|qeBo7Wn=9F}0d<^w!NxvpBPI}dYJNv4KL@$xBoO3FMju)D^fa*2Ps|A-W0&E|M zLem_)8wNl;5(^TM0FaO*Bo+y-JvM;d;EG0q8$kv@6-tjiJ_WyFAR37zGyL$uFaSv= zWN_m+_75rq2@L%=fFTx1Df@ZY4UI(pCZ8a|M=1Lv#Pu168^s!c&xhncWq0CmWB-)> zcOji4Zi;^j34v66{P@obAu9Cm_C)=|!aqztv>&nuY6})>6Vxy=08nhNSYd2zSO8AM zv%=W`TjC*^$O_mTw zV*j8*Sb@1e9++cUDJ8R-r_xzjf0IvGK?9WC0C8otwsvB_g6%`{UuXZbkc>Ztg#44j zk-sSn{llK&uf9>NU>LHn2D0$b>( zSb&NDHZZ}mP@dMd48G68@|%3Z0&1b`T8K;A)YJwW0VWU0|Cnw4Puc$va_8?tLLe2j zwSOpl`dcAHg&x{-2_6!m8^r=bAPc=93tb?Sp9+##7NIsI{%%eDA8licJ*2<`NqakJ zJ*ENxnbJf0FaK6kP|)xfUi~i%e`l_u0qWlrlSr$m)PG(3u;hPHO!~Ld|GntHO8@e} z|9cOt{d*JE{uehuD(c?~SVIByzhPKILpLxg^~%eJad^+RtBz8Y@ItSV0JyTb&7S>|2T zNpC5tB7SWND#6dwd|X*f&@VfEjw&vdSEs&7k$85uROOw;CHo`SWdt|IyL-ceJg4zl zmnRn7rW50F`#)+{)%Go=SEnR!Nvp};D<9^Qt#3rFb;j!|#wxAw9L;&9&{p!qw-ALE zDvLm=sQ1br4PtqhJ0EzLo$2TeFGZN{qutw4@51UHYi1pXiyeJBk+I^CQh*3KYc}1c zS&WOr?j>j|qxvUN{N*&M- z@5BUM4S4VIYZ1+Xs}QK8`fkk5WhJFR5lcPGzcuV!ctoT`(nx^s&C*jAlt4Ar!YIPh zP0);br;Rt_xqTj5^>iL)4E}iOZ_B~_)|=$01QB}!TkCioUe(e@tl7 zk^Q^tOULS1>zNyLa5n$=Ag&J4v?3{LG~l6Hld0qn5-#o4$PAx?!GErJyk3^bM}>|M z&5E^A*n;HBtMhfzR^8u`u9~d&)s%?d6M{V}S)W!3S(1zpyenolKnIKRRo#~6`t@kOe=hO-J%>IMb`FjV?X!2=T(8Urgfh<6 z-qxH<9co60?1#TD)+1#PQNGQ|$#|8!l5O=lmLJacj7Wry*EuRIPjAbMNpKHOQP-p| zynD~^<=PJ_u3PK(J2)fK5vdd=fOKz{k5gefYrP`7fX$*-o)(h@4waHJBg6#=1)Y+(#d}BUmy43 z^>}rUc_5D<@fcKZCRQFiOVWJu!+THebNoA5-+lFtAg7U|LUL|~NAf$5zmaiOx;NcM z-VtRbo%sFvanzjJmE5hF2!3p04W~?{a@WIKpXOV{a!0b7IHqe(r-;klQo1%BA6+|> z_$Ad{&UIlazRw%3KqN(Myy_-M48jj^`u5h2Ig#2O<6pXUL_B7-Tz_JErd3vc<;9KM z{T%z&<)`dx%d3)Nmc#FHE@OJVzOypT7u8#dC+@@Emu^lMEc4rM`s>>MVK$}g z$#qD+`nE55*<{BWlNxr%t~^uwyzre*JRys8*G&_Zg5SC)ssnQ>Ej+fAF`$E(^`^G6 z5_4WP{c3hUhZx-#S)X7fmSr0qPBd~Q>b?JQBgBC#>Zq4>P`aex-5grj`+?}ZuhAWk za#_Cf9&|2U2~1dx=j}|r`6jUcS^+;_eM1oKL*tUu{X1{=p3>S+w?+K$4lOAV(I+_z zBZP$?u0d zL+lUl3vG41L2E);3#76<_|B?~MS{43bpMrX!nph9zKFFt`w_js7;WWSZF&;i79-tL z9The?6Y9(-Dw2CSsJvQrnYSg9H3l>1*v7*8FMO11_D{XLuQgE2TI4#ykdt>SDyo7( zf;(*}cUZe5Z8kRfX2#;U#K!fX+B+VO$$U>P6;9-2RAgI{+JDx7m7=`&g)tlq%Kff0 z16p!dYHDg!%U!E|BgV(c+|=TqxRi=oCJ;t!VtXTRmZneJIX*a3w~8-YuKR+R<$hmT zsWsNGPJ!`W@!Z&B$oeKqa5|$>DDm*z)it$~AJ1BAr>@<%DwtV1mum0X9PL2OSZV_N zl21%r$uDRkvV}^1B4@&{w z?uE-P50|FH-c>2}JLSZQoqKGQ3hTOi-RaJSU!SI$%M!)YR9-e~*D9KdMMN7jq+Vyc zx#sjXVgITunFlr#;}2NQGqt)NeDyEfE5Az$0Jdgl98PIIAU27Y!?J>a^?4?VzV%JK z=FxLOQ8gV+go+=IR@Zo_Gw&=Lo(WTWru=qlfehAm%WCe|kKH33O)r$~8qH3f4vG@| z+_ZkD?@?VKFmw}qPLL^u%UhGj zT)rH`MW7t}Ss13njecu0vwxEJ^Bas_Yi#7jon|K#O3Jjrfd%z8Fi#+a?$-I&%TgTC zApP_`=O5qJFqJo{pWeJbR;enzgb_?&infqsI~ZN)Nbd2=$9~Hz{t^3;u*4@pb5WRs zYQ>+osI4tL?SP-!srl%8qa&Pq;lDDO`qf3BXvJ@)cM(1O-eR*;vE=mMlmw0p*t~14 z@qJfS#Z&9w3$)TI!x|dYLf8@{8d?KoZ^UB4_m7`~2|ufcQ-AS_TDYw;C2&IK4$p~o z`Q^$pPjy6!gwhgjQV@F{IR+@XHTS8ouxfof;`{WhuYezUe?a=zo@QQGjJ79 zqr=F_2rx>ruNXxom~%0Sj*L>iNSICl$##!Y__?%&lT5vv^`*enVp+{Sg%pf%QoB*d z+QJXD63+U^T2Y3k@VX^WDYmjDpR+Wu>hIuuFWgMbIVpkO>k6BZ$LR5uZfUxfZ@@ye zZ3?T=FxB`X?L)Eur`DFBFGF3ebcPHmmb=6Q9vUKUNhmNR^C%g2Z=}#8b4q3E5@N*; zOK@)yGPoy2L3FalHFg&XY?I||&V(A>zb@U_%~>_;!+A|Um?+Ch;ox~Y*z;%yolThB z?f2Rx!S@IroJIGyX((vbT$ziRTD3$T2PxI>RpIloVYB3=+$Am-2cOzCe7_##!!|f} zdVMil@`T8nB9g8IYv*g3@KmEu8RzK?S25NeYvHeMSERxlmjWx<9>tgWJ8Kz`=~&OH zKTbusE{{K?xTte6m`^KNQqZ0|lo!^68a1(Tt#j zoSU+j7_J^sI}Tu}Q$+=1j z_7K+Onp52iYZlQw#4RpZ83*$s9T;VpOG+oFNq`2{KL()dA*= z6^T5rfkdjR1|VrwH#Ss}pNG|)pw$0Qvhxoz;7?Y~L)O4Q>klGfD7L2%W`ueU0W3wV zz}f#Rxc-EdT3efy^=>;WtG0FkE3Gyjug#j()Yu56{{N8-_>;BckTvkn`el%;XAm6q zr)YqB#sX0FEI{2q0*F0fq1M!7VY%wh!lJ1ez(T9Jy{*ZjeaANnO8x&qMnh!4KeGn@ zS-%OAbtupEHzoq3LZyw^@>ZCo*x;RZdb++{ zx#YP}KVgFln#)FmeooT)*k$$C3#nz?57uuK>k8>h>#tuSS8hzD*UNvaa#B|e8+lq~ z>NEnb`pCOG5ruReo2tf7cdts6{%UEOa_`wpCV3{$%g!gg^$6Mh)-K9BrOW?rOMTn& z^68gFevuV^VYFCtsv!2Ex);6*8F=$2OQ(<8s)>u)Z+BXKoc`kNbwN+aPLF4(xBU|` zDrafv-MsWuC5eyxR3~Gl34)8!^Y0?%KGgsZ+Hqr*LLIJ#==L8!TF^9TpSdRE!Pq?g z*R>SS$mrS)sDljoPkQv@;7G00b1pw4xRzr@#>wt39eW%zZ%lRBlWRS8U>#O{9+6hv zv|A&`_+^o7^c>1@` zO>a6aDA5x7EZX$-Yhw;ZnBF|*vME~d5kOWhd5)Y;GEeP?oR|L%pAOXO_z@Vq34Jmc7?_T5mlOg&o#2m)=I$)6O!Ta?#i* z9cEP$1cYnytNm}lT%jE062U6B-N=RTDB>v;9j17;!@b%k#nP;C{btM z)=1^WSF2yf*4kGy_%$%pfTM3;2Ss%WX219abK^9*K2J%N#2UfYNlSHcpDb>P{PA%D ztaBSq@ff5T-{Zxio}m}B18K13HOP1jHdR#D6ZW*w3-F&Kf=-macK|SIuPZx<2!;v! zTc-J?Q1%Xqg@5D5Dz>9*I&el*5jko4Ks^-hbw7*=+Z$9yg;j;4eBl;Wh;|}b91EpU zpr4+c6A9MIQ?LoHgB#C@;7tF-2}3C?k_%wtpJEf-8?j0Dw(H z0r2C-QvgCf@P2|I*ptvg4`qYjAT&h(-ypCcZa0(m`W+F6VLkqL1;Q&;nDy=pQe~B< z48AenRwzpmv)^3LW!_)sIG&x{WmT~4XlEMebMW(w?abI^A>laf>Nm3X4XpVlP6c{1 zuKX_Y}075}29S-U78O+x;B)VEAVg+}q~I}^986zcmMQzxwT!$ zP+-X2Jm8h+5q~^V6@juyy2S6`(IDiy^<3q<#!S{p=$XXS;DD1|Y1;ih4z)`#7*z;( zY57GUBxj%M@)-o6%c{0c&=-PHVOJOK-D_@$n#jWz#2^sp1G62Ps4E*~>RCAr{Al2# z;jSEe)PKrIiZX|#hxcR%*iCuO=uqDwC1N@D>eA)HVkq}$xu$3MO}!`bzOmdj zS5BKKNcShd;sNBdY^U%WUqWMxE4~@1s$NDiq7M{!dQaiS#Z`3f1ibndK&Kqi@b>E9 z*UkNKTe{m)MF{IFNU;&lZ__;rUP%^@yO+sBC}w=t$U?C z(fqnuZSS%*rM}c*cE3Ebb##pF+BSycr)(5zdWXlc8ioqLs>qboE9xTQ!oK_QE>qhh z=Nh5tq#NNY`k-J&z%GT9xP1%mCfreJFeC8jLZzSDF{;}bM7`_1^qGga{=&1q6+chR zuD25JPSGjOx;R{42cS!F98}R*)68`NgP*%LOFh;5i@A64JES&c z5}{2Y?S_tjXHJ;f_G9?o$|#S^&ThzajqU3GL@NeM?B&!!bUr*>KAI-?gId>Bm<-Wt2{^ z`0%q{eh+1E&OS2WIkE0dlgIf_9&IgFZKLKY@DAtAYR$Xet{*NGo(^)*E+CGZrzCE_ zRk-&=6W39LXTR$(@24fe(m)J;0vv}OOKRF0H4WDS##~KT4{}$MB4crW4@@qLznes# z@!4uSv*b@$2Tk31g@#bCjARw|X;fmG?X%~X39P4aZG$|N&H2$mMRi}eu(3ntVY!@j zb0z0ZRd?+@zg1PdCo~od-8hTWPm0vJv(`3Gnc+I(HzAK_WS!#qZrOSpbK+@ecow00 zdN158+fPzX@TFRo0;}eNoIot+y~w&)P4;!i*0<2EXM`PmyCvnD zubhofn(GfU$n|Jby&!4Jz9VrHbjy%rzucl!X5Ev#xc}K%lx(b%X7p3pMe|1D8Cq-# zi@Bt4{>O$MTkD5XRZP8u0qdhPda$**>O#YUn^h#9SGXU61NxB>y0_8g;YyggsnS{` zmS0|lNS`s7CNi{e!Hp=S{Cy=b%%}UY3iXb}EeLJa0^PEk>aDV%(y4=tjhnxP$PD)% zk;PtrA`6g<&{6=y!hCjBpV+13;}`$}wfbOYrLK!5>En-zZikUt%Zd}h-#U_42%|H1 zVfS!flxQ_gOB1>39iGTy0~dHk&FM7Zi}`VcVBL{CIUsS>LizSnORoBE9`EA1g;L

KtZq1%s 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 T{_ec900000NkvXXu0mjfe=wp> literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf7498c9336b087e77de07b63b95d35a51a8313 GIT binary patch literal 762 zcmVKwjgW>VxM-21?va)gv-X0zdnQ3VZaOH2M;%C^1BHy`83c{x2&()3>?6ao zEtlx)Kt6SG29uf5L>tH{#m{he)?unSkcp6j-=BYyWT0}IEzpqyRC6Fv1vSV*PDy^e zYCuT<GY-aiDFq<83tE3S1^0`uHC?P;uEau-T@s2ORIuFTH05S;pyf} zWSd7+2!@7*F!c6yqlgt3l`^bewFawtKTkylttwB3bDRPUe?I?UIP5nKm_&Y%Z600+ zf_!@PIQGPDZE1_)^WFVc3_6OuVD>{+E`~aBO@_C}?lQbNeh(}rDJaUYs%k3H<`K*! zZtiXj#L9V^i^ClU0`kAVF&KUSz#wd;%%EQE3dTV>F%0C`HRua!oFTYt=Pm|f<+h)E z$#C`lXE^^6D_(6&K`0*1M z>KE;N%y8%9e}=p6W(>;&WEuW^`N?oPWidE+f4uUP;mPUSB$-EaIS9%uurvblDZXOC z6jKwjgW>VxM-21?va)gv-X0zdnQ3VZaOH2M;%C^1BHy`83c{x2&()3>?6ao zEtlx)Kt6SG29uf5L>tH{#m{he)?unSkcp6j-=BYyWT0}IEzpqyRC6Fv1vSV*PDy^e zYCuT<GY-aiDFq<83tE3S1^0`uHC?P;uEau-T@s2ORIuFTH05S;pyf} zWSd7+2!@7*F!c6yqlgt3l`^bewFawtKTkylttwB3bDRPUe?I?UIP5nKm_&Y%Z600+ zf_!@PIQGPDZE1_)^WFVc3_6OuVD>{+E`~aBO@_C}?lQbNeh(}rDJaUYs%k3H<`K*! zZtiXj#L9V^i^ClU0`kAVF&KUSz#wd;%%EQE3dTV>F%0C`HRua!oFTYt=Pm|f<+h)E z$#C`lXE^^6D_(6&K`0*1M z>KE;N%y8%9e}=p6W(>;&WEuW^`N?oPWidE+f4uUP;mPUSB$-EaIS9%uurvblDZXOC z6jf;kYhT!yDB?6JD~)LkBjrh^!D{tLLm~b*F%$(YVtxsqJzRj1y+Go zU=>&eR)OULoSZd9)P3Dg-O&X+am6e!yO)brI^g+==Q|o$@V1BpYsK6&W7|?`qioP~ z0~X7^M+NY}r+&$bM@>jX+J?M{1B)sij5AVMD=!meSwp%hpzYzBGw5x3KeB?3@A z37AhZ`aMD0C&!MHtXJ{HgCGmLTrR<1$k*5A=;pnrImmP-Y5(3OS+6JylW$z8Z$M$u z>Oc0QK74*ez=vyJVY?+Qp#73@yx)JHunUmk1x5bR1W9@&rKP(1TGm%Gct*GxB}Eot zX(`Kush0U@F^(0Kmi~p_kkb;aYOI&7TnaD`%ZW6?o60u}Qrh0}1)tXz;59Q1A9V5l zV&vK8TKxDn5H`J%*3vZUzNkpP6NRbUlZ1y+GoV8sG! zb8~VOv+y8RZKjz~jCF}s)8ue?^Or1E1TZ}$uBE5Ml`yS|(f>p|Jvc3QEBlTBXb1n7 zVYt&Daus6p9p~|SWJ1S5#n)fOACjQ{`u07*qoM6N<$g03JZtpET3 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-29x29@1x.png b/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b4df8681bdd971ee557674d758383c0e59c689 GIT binary patch literal 644 zcmV-~0(95OYu`%Tltk49GHr zo?wRW&ptAoh@Q*v`|}UVed_Mv#&G%SMTSRD?lbiEbu;ku^P$N9JbjNr`qEtnVF?}v zxkyvEI7r>>IWxifjvhY@Hisym%F4IF#iIVci9kF7VlX!=!w{P>B%#>y5<Oy1dZjvSVdY9MIXoX*cByZVgomN_mFHM-ooKK&=-Hc{KTp8(el#_uMXU#U*RxX%Zyrz zk$SDItmvAMK=v_Zrlm5{(^8OqOrWNIWOx`|d<(J%WFI4}FSB*WHeg?7_Wz^Djxo|A eNI^b?^<@BpXy|+UIFB&^0000k(0t34eEG-2uO6jHuE9#=0 zUtN`A6cufWx$HtWb3v4D7A?cJgc%jd1##l8k)%RP>m``9d~kj680~?D zy~!i&F@%@WXV9T5lVw3imj*J1op#E0rofeIxtr}~!aC4KC&6zbthM{Dx#iYS z_zXIa78DjN8Y+1HVCezq?&|T{k_#bG6*C{ZU01YK?DHO_sLyGB7mqTaV@y{=~H`lJMk`D#yLG4yobceCR$+5^dFW~&2+@|5r>R_w~5 zIDzn%Lqp{=>~mcdu2?o*-tT4`JaP-{rZ4QNFyN$KUSI5H!%2NOASr?317oY;nv#y@ zKHJE?$=C{mI6s{>Bx<}RyyX-Dm6{J-;Q)jynQ)5IVDzszMy*vHM97+m#df%hW8B|{ z94H6MfpVZ6CXJxT|!hno?g+k8y)#e~ops(`+{L*!dc( z#5tmW%_D0@&5ajX+p6k28+`r(8-%YgkR5@b00000NkvXXu0mjf DNOs&> literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x.png b/src-tauri/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c32ee7372d9ee3f706185c907930562e52eb21e7 GIT binary patch literal 1033 zcmV+k1or!hP)k(0t34eEG-2uO6jHuE9#=0 zUtN`A6cufWx$HtWb3v4D7A?cJgc%jd1##l8k)%RP>m``9d~kj680~?D zy~!i&F@%@WXV9T5lVw3imj*J1op#E0rofeIxtr}~!aC4KC&6zbthM{Dx#iYS z_zXIa78DjN8Y+1HVCezq?&|T{k_#bG6*C{ZU01YK?DHO_sLyGB7mqTaV@y{=~H`lJMk`D#yLG4yobceCR$+5^dFW~&2+@|5r>R_w~5 zIDzn%Lqp{=>~mcdu2?o*-tT4`JaP-{rZ4QNFyN$KUSI5H!%2NOASr?317oY;nv#y@ zKHJE?$=C{mI6s{>Bx<}RyyX-Dm6{J-;Q)jynQ)5IVDzszMy*vHM97+m#df%hW8B|{ z94H6MfpVZ6CXJxT|!hno?g+k8y)#e~ops(`+{L*!dc( z#5tmW%_D0@&5ajX+p6k28+`r(8-%YgkR5@b00000NkvXXu0mjf DNOs&> literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-29x29@3x.png b/src-tauri/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebe6ef85e97786afa8506c07e11138c5de182a8 GIT binary patch literal 1804 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x.png b/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..191ea544383f6934a5a1f722db51331419d46410 GIT binary patch literal 1527 zcmVhJS$B)V~%cpw8$jU1Vemg2GhBk1;ojlXk!uV7=#-mQq@-z1~4no^Nu=alQ9= z?sL!czR&x8&DDWiYilQX{?&Rw(y=ui=e9d2&8AEfx)169>@KZl)Is5PZ3xw7U=Hk_WRmXqvL$NYDkWo zA2KQ>Xl^&a-!0wCYG1$r(YQm0-vhPUd!vEB<#JDcXy}q(MzYZwc;T^)P!i8Tw)Q3% zXC~pYQUeo;F#dP#x+u8TJ^+)K$CkyufI}EV;Z#%Oyr;UD#>T9WpI6{hxD@Y-gAWdD z@%USHxI20VR};VoV8)PCAlXW4_vN98e1(n%KX|V{GQ^#DvjVdqqDXpxhK&8 zF$tBU%+ZsJ_j4zhFlY{sasE9!ag$4|rxtAO*1wkIo&ri^zG`mdUvmW?-{yQEH?TAY z;Wb3C&NSu*mjjwhyr(g8*(XUNjsI|D#KI?`zUZ}AUk9`KtWW25_1WOW>0y3<+RlJ2 zCJN4LBjMmwCs|JfGk2^v($mvGrBZpl5j5`e6JPlEfW~Lw zyYm+KW!s(5nZ6A=)dpuT1U2$~FZ9)!m(4!O2NN&}#m;(se4MjF#yX{@x>owZ1a9CK zL)V|d1Uc*r>hVBSItLGjuiS;RbU54vG%pN`4yby9hhv1n1W!_c{E+^G$$VETV1Rp5 zJs$5l^fiR!ys#!Vf(yAaN#J=+pt*^wV4Dw-3?O=poba&W__OK^gzTFMN}1vZ=13x6>DkUqE6FTwLu4rb0ZRJW$?;8w95B#=I~z8!7nn0b>*^>v>T zJRd{Xm6a19u1fpyhaV9k0loXy+l=di-1DY2aeZWh=-u;>jq4iH0!zU^PIaP7orhuT z(^Bw`aK=jVor7=kOL3ErY#b8r=|R*MU+c6K{HhY^~diJr!P4r4QZ4kLpp d$jcWj^gn(ymJo=VZQTF>002ovPDHLkV1l|w=Z*jX literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-40x40@3x.png b/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d535b796fa21ab516df3fcdb0069fec2f9bf8b4c GIT binary patch literal 2220 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-60x60@2x.png b/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d535b796fa21ab516df3fcdb0069fec2f9bf8b4c GIT binary patch literal 2220 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 JPDHLkV1kgVpilq+ literal 0 HcmV?d00001 diff --git a/src-tauri/icons/ios/AppIcon-76x76@2x.png b/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..41c8c8e95eeb1905fc77e0cf712dfb5f743d1ae3 GIT binary patch literal 2548 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 Hb`k#vYy@2Q literal 0 HcmV?d00001 diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..f775308 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,505 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::{ + collections::HashMap, + fs, + net::{SocketAddr, TcpStream, UdpSocket}, + path::PathBuf, + process::{Child, Command, Stdio}, + sync::Mutex, + time::{Duration, Instant, SystemTime, UNIX_EPOCH}, +}; +use tauri::State; + +struct AppState { + processes: Mutex>, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct StartRequest { + service: String, + binary_path: String, + args: Vec, +} + +#[derive(Debug, Serialize)] +struct ServiceStatus { + service: String, + running: bool, + pid: Option, + started_at: u64, + message: String, +} + +#[derive(Debug, Deserialize)] +struct ManagementRequest { + host: String, + port: u16, + command: String, + password: Option, +} + +#[derive(Debug, Serialize)] +struct ToolResult { + ok: bool, + summary: String, + output: String, + latency_ms: Option, +} + +#[derive(Debug, Deserialize)] +struct PingRequest { + host: String, + count: u8, +} + +#[derive(Debug, Deserialize)] +struct TcpingRequest { + host: String, + port: u16, + timeout_ms: u64, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct TapTrafficRequest { + tap_device: String, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +struct TapTraffic { + interface_name: String, + received_bytes: u64, + sent_bytes: u64, +} + +fn now_epoch() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() +} + +fn empty_status(service: &str, message: &str) -> ServiceStatus { + ServiceStatus { + service: service.to_string(), + running: false, + pid: None, + started_at: 0, + message: message.to_string(), + } +} + +fn relative_binary_path(service: &str) -> Result<&'static str, String> { + match service { + "edge" => Ok("./n2n/edge.exe"), + "supernode" => Ok("./n2n/supernode.exe"), + _ => Err(format!("unsupported service: {service}")), + } +} + +fn app_directory() -> Result { + std::env::current_exe() + .map_err(|error| format!("unable to locate application executable: {error}"))? + .parent() + .map(|path| path.to_path_buf()) + .ok_or_else(|| "application executable has no parent directory".to_string()) +} + +fn downloads_directory() -> PathBuf { + #[cfg(target_os = "windows")] + if let Some(profile) = std::env::var_os("USERPROFILE") { + return PathBuf::from(profile).join("Downloads"); + } + + #[cfg(not(target_os = "windows"))] + if let Some(home) = std::env::var_os("HOME") { + return PathBuf::from(home).join("Downloads"); + } + + std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")) +} + +#[cfg(target_os = "windows")] +fn windows_tap_traffic(tap_device: &str) -> Result { + use std::{ptr, slice}; + use windows_sys::Win32::{ + Foundation::NO_ERROR, + NetworkManagement::IpHelper::{FreeMibTable, GetIfTable2, MIB_IF_TABLE2}, + }; + + fn wide_string(value: &[u16]) -> String { + let end = value + .iter() + .position(|unit| *unit == 0) + .unwrap_or(value.len()); + String::from_utf16_lossy(&value[..end]) + } + + fn guid_string(guid: &windows_sys::core::GUID) -> String { + format!( + "{{{:08x}-{:04x}-{:04x}-{:02x}{:02x}-{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}}}", + guid.data1, + guid.data2, + guid.data3, + guid.data4[0], + guid.data4[1], + guid.data4[2], + guid.data4[3], + guid.data4[4], + guid.data4[5], + guid.data4[6], + guid.data4[7] + ) + } + + let mut table: *mut MIB_IF_TABLE2 = ptr::null_mut(); + let result = unsafe { GetIfTable2(&mut table) }; + if result != NO_ERROR || table.is_null() { + return Err(format!("unable to read network adapter table: {result}")); + } + + let traffic = unsafe { + let rows = slice::from_raw_parts((*table).Table.as_ptr(), (*table).NumEntries as usize); + rows.iter() + .find_map(|row| { + let alias = wide_string(&row.Alias); + let description = wide_string(&row.Description); + let guid = guid_string(&row.InterfaceGuid); + (alias.eq_ignore_ascii_case(tap_device) + || description.eq_ignore_ascii_case(tap_device) + || guid.eq_ignore_ascii_case(tap_device)) + .then_some(TapTraffic { + interface_name: alias, + received_bytes: row.InOctets, + sent_bytes: row.OutOctets, + }) + }) + .ok_or_else(|| format!("TAP adapter not found: {tap_device}")) + }; + unsafe { FreeMibTable(table.cast()) }; + traffic +} + +#[tauri::command] +fn start_service(request: StartRequest, state: State<'_, AppState>) -> Result { + let mut processes = state.processes.lock().map_err(|_| "process state is unavailable".to_string())?; + if let Some(existing) = processes.get_mut(&request.service) { + if existing.try_wait().map_err(|e| e.to_string())?.is_none() { + return Ok(ServiceStatus { + service: request.service, + running: true, + pid: Some(existing.id()), + started_at: now_epoch(), + message: "already running".to_string(), + }); + } + } + + let relative_binary = relative_binary_path(&request.service)?; + if request.binary_path != relative_binary { + return Err(format!("{} must use {}", request.service, relative_binary)); + } + + let working_directory = app_directory()?; + let binary = working_directory.join(relative_binary); + if !binary.is_file() { + return Err(format!("required n2n binary is missing: {}", binary.display())); + } + + let child = Command::new(relative_binary) + .current_dir(&working_directory) + .args(&request.args) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .map_err(|e| format!("unable to start {}: {}", binary.display(), e))?; + let pid = child.id(); + processes.insert(request.service.clone(), child); + + Ok(ServiceStatus { + service: request.service, + running: true, + pid: Some(pid), + started_at: now_epoch(), + message: format!("started {relative_binary}"), + }) +} + +#[tauri::command] +fn stop_service(service: String, state: State<'_, AppState>) -> Result { + let mut processes = state.processes.lock().map_err(|_| "process state is unavailable".to_string())?; + if let Some(mut child) = processes.remove(&service) { + child.kill().map_err(|e| format!("unable to stop {}: {}", service, e))?; + let _ = child.wait(); + return Ok(empty_status(&service, "stopped")); + } + Ok(empty_status(&service, "not running")) +} + +#[tauri::command] +fn service_status(service: String, state: State<'_, AppState>) -> Result { + let mut processes = state.processes.lock().map_err(|_| "process state is unavailable".to_string())?; + if let Some(child) = processes.get_mut(&service) { + if child.try_wait().map_err(|e| e.to_string())?.is_none() { + return Ok(ServiceStatus { + service, + running: true, + pid: Some(child.id()), + started_at: now_epoch(), + message: "running".to_string(), + }); + } + processes.remove(&service); + return Ok(empty_status(&service, "exited")); + } + Ok(empty_status(&service, "not running")) +} + +#[tauri::command] +fn management_query(request: ManagementRequest) -> Result, String> { + let address: SocketAddr = format!("{}:{}", request.host, request.port) + .parse() + .map_err(|e| format!("invalid management address: {}", e))?; + let socket = UdpSocket::bind("0.0.0.0:0").map_err(|e| e.to_string())?; + socket + .set_read_timeout(Some(Duration::from_millis(650))) + .map_err(|e| e.to_string())?; + let tag = now_epoch() % 1000; + let auth = request + .password + .filter(|password| !password.is_empty()) + .map(|password| format!(":1:{}", password)) + .unwrap_or_default(); + let payload = format!("r {}{} {}\n", tag, auth, request.command); + socket + .send_to(payload.as_bytes(), address) + .map_err(|e| e.to_string())?; + + let mut packets = Vec::new(); + let mut buffer = [0_u8; 4096]; + loop { + match socket.recv_from(&mut buffer) { + Ok((size, _)) => { + if let Ok(text) = std::str::from_utf8(&buffer[..size]) { + for line in text.lines() { + if let Ok(value) = serde_json::from_str::(line) { + let finished = value.get("_type").and_then(Value::as_str) == Some("end"); + packets.push(value); + if finished { + return Ok(packets); + } + } + } + } + } + Err(error) if error.kind() == std::io::ErrorKind::WouldBlock || error.kind() == std::io::ErrorKind::TimedOut => { + break; + } + Err(error) => return Err(error.to_string()), + } + } + if packets.is_empty() { + Err(format!("management API timed out: {address}")) + } else { + Ok(packets) + } +} + +#[tauri::command] +fn run_ping(request: PingRequest) -> Result { + let count = request.count.clamp(1, 8).to_string(); + let started = Instant::now(); + #[cfg(target_os = "windows")] + let output = Command::new("ping") + .args(["-n", &count, &request.host]) + .output() + .map_err(|e| e.to_string())?; + #[cfg(not(target_os = "windows"))] + let output = Command::new("ping") + .args(["-c", &count, &request.host]) + .output() + .map_err(|e| e.to_string())?; + let stdout = String::from_utf8_lossy(&output.stdout).to_string(); + let stderr = String::from_utf8_lossy(&output.stderr).to_string(); + Ok(ToolResult { + ok: output.status.success(), + summary: if output.status.success() { "目标可达".to_string() } else { "目标不可达".to_string() }, + output: if stdout.is_empty() { stderr } else { stdout }, + latency_ms: Some(started.elapsed().as_millis()), + }) +} + +#[tauri::command] +fn run_tcping(request: TcpingRequest) -> Result { + let address: SocketAddr = format!("{}:{}", request.host, request.port) + .parse() + .map_err(|e| format!("invalid TCP address: {}", e))?; + let started = Instant::now(); + match TcpStream::connect_timeout(&address, Duration::from_millis(request.timeout_ms.max(100))) { + Ok(_) => Ok(ToolResult { + ok: true, + summary: "TCP 端口可连接".to_string(), + output: format!("connected to {} in {} ms", address, started.elapsed().as_millis()), + latency_ms: Some(started.elapsed().as_millis()), + }), + Err(error) => Ok(ToolResult { + ok: false, + summary: "TCP 端口不可连接".to_string(), + output: error.to_string(), + latency_ms: Some(started.elapsed().as_millis()), + }), + } +} + +#[tauri::command] +fn tap_traffic(request: TapTrafficRequest) -> Result { + let tap_device = request.tap_device.trim(); + if tap_device.is_empty() { + return Err("TAP device name is empty".to_string()); + } + if tap_device.contains(['/', '\\']) || tap_device == "." || tap_device == ".." { + return Err("invalid TAP device name".to_string()); + } + + #[cfg(target_os = "windows")] + { + return windows_tap_traffic(tap_device); + } + + #[cfg(target_os = "linux")] + { + let path = std::path::Path::new("/sys/class/net").join(tap_device).join("statistics"); + let received_bytes = fs::read_to_string(path.join("rx_bytes")) + .map_err(|error| format!("unable to read TAP adapter {tap_device}: {error}"))? + .trim() + .parse::() + .map_err(|error| format!("invalid TAP receive counter: {error}"))?; + let sent_bytes = fs::read_to_string(path.join("tx_bytes")) + .map_err(|error| format!("unable to read TAP adapter {tap_device}: {error}"))? + .trim() + .parse::() + .map_err(|error| format!("invalid TAP transmit counter: {error}"))?; + return Ok(TapTraffic { + interface_name: tap_device.to_string(), + received_bytes, + sent_bytes, + }); + } + + #[cfg(not(any(target_os = "windows", target_os = "linux")))] + Err("TAP traffic monitoring is not supported on this operating system".to_string()) +} + +#[tauri::command] +fn firewall_status() -> Result { + #[cfg(target_os = "windows")] + let output = Command::new("netsh") + .args(["advfirewall", "show", "allprofiles", "state"]) + .output() + .map_err(|e| e.to_string())?; + #[cfg(target_os = "linux")] + let output = Command::new("sh") + .args(["-c", "ufw status verbose 2>/dev/null || firewall-cmd --state 2>/dev/null || true"]) + .output() + .map_err(|e| e.to_string())?; + #[cfg(target_os = "macos")] + let output = Command::new("/usr/libexec/ApplicationFirewall/socketfilterfw") + .args(["--getglobalstate"]) + .output() + .map_err(|e| e.to_string())?; + #[cfg(not(any(target_os = "windows", target_os = "linux", target_os = "macos")))] + let output = Command::new("true").output().map_err(|e| e.to_string())?; + + let stdout = String::from_utf8_lossy(&output.stdout).to_string(); + let normalized = stdout + .to_ascii_lowercase() + .split_whitespace() + .collect::>() + .join(" "); + let enabled = normalized.contains("state on") + || normalized.contains("status: active") + || normalized.contains("firewall is enabled") + || normalized.contains("state = 1") + || normalized.split_whitespace().any(|token| token == "running"); + Ok(ToolResult { + ok: output.status.success(), + summary: if enabled { "本地防火墙已开启".to_string() } else { "未检测到防火墙开启".to_string() }, + output: stdout, + latency_ms: None, + }) +} + +#[tauri::command] +fn export_log(contents: String) -> Result { + let directory = downloads_directory(); + fs::create_dir_all(&directory) + .map_err(|error| format!("unable to create downloads directory: {error}"))?; + let millis = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis(); + let file = directory.join(format!("super-n2n-{millis}.log")); + fs::write(&file, contents).map_err(|error| format!("unable to export log: {error}"))?; + Ok(file.display().to_string()) +} + +#[cfg(test)] +mod tests { + use super::{relative_binary_path, StartRequest}; + + #[cfg(target_os = "windows")] + #[test] + fn windows_tap_traffic_uses_the_adapter_table() { + assert!(super::windows_tap_traffic("__super_n2n_missing_tap__").is_err()); + } + + #[test] + fn start_request_accepts_an_argument_vector_from_tauri() { + let request: StartRequest = serde_json::from_str( + r#"{ + "service": "edge", + "binaryPath": "./n2n/edge.exe", + "args": ["-c", "test-community", "-l", "127.0.0.1:7777"] + }"#, + ) + .expect("a Tauri start request with an argument array should deserialize"); + + assert_eq!(request.binary_path, "./n2n/edge.exe"); + assert_eq!( + request.args, + ["-c", "test-community", "-l", "127.0.0.1:7777"] + ); + } + + #[test] + fn services_have_fixed_relative_binary_paths() { + assert_eq!(relative_binary_path("edge").unwrap(), "./n2n/edge.exe"); + assert_eq!( + relative_binary_path("supernode").unwrap(), + "./n2n/supernode.exe" + ); + } +} + +pub fn run() { + tauri::Builder::default() + .manage(AppState { + processes: Mutex::new(HashMap::new()), + }) + .invoke_handler(tauri::generate_handler![ + start_service, + stop_service, + service_status, + management_query, + run_ping, + run_tcping, + tap_traffic, + firewall_status, + export_log + ]) + .run(tauri::generate_context!()) + .expect("error while running Super N2N"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..a7a70e9 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,5 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + super_n2n_lib::run() +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..f670dda --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "Super N2N", + "version": "0.1.0", + "identifier": "com.supern2n.control", + "build": { + "beforeDevCommand": "npm run dev", + "devUrl": "http://127.0.0.1:1420", + "beforeBuildCommand": "npm run build", + "frontendDist": "../dist" + }, + "app": { + "windows": [ + { + "label": "main", + "title": "Super N2N Control", + "width": 350, + "height": 380, + "minWidth": 350, + "minHeight": 380, + "maxWidth": 350, + "maxHeight": 380, + "resizable": false + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": false, + "targets": "all" + } +} diff --git a/src/lib/tauri.js b/src/lib/tauri.js new file mode 100644 index 0000000..7f460ec --- /dev/null +++ b/src/lib/tauri.js @@ -0,0 +1,39 @@ +import { invoke } from '@tauri-apps/api/core' + +export const isTauri = typeof window !== 'undefined' && Boolean(window.__TAURI_INTERNALS__) + +export async function nativeCall(command, args, fallback) { + if (!isTauri) return fallback() + try { + return await invoke(command, args) + } catch (error) { + throw new Error(String(error)) + } +} + +export const startService = (request) => nativeCall('start_service', { request }, () => { + throw new Error('浏览器预览无法启动原生服务') +}) + +export const stopService = (service) => nativeCall('stop_service', { service }, () => { + throw new Error('浏览器预览没有受管进程') +}) + +export const serviceStatus = (service) => nativeCall('service_status', { service }, () => ({ + service, + running: false, + pid: null, + started_at: 0, + message: '浏览器预览没有受管进程', +})) + +export const queryManagement = (request) => nativeCall('management_query', { request }, () => { + throw new Error('浏览器预览不支持管理 API 查询') +}) +export const runPing = (request, fallback) => nativeCall('run_ping', { request }, fallback) +export const runTcping = (request, fallback) => nativeCall('run_tcping', { request }, fallback) +export const checkFirewall = (fallback) => nativeCall('firewall_status', {}, fallback) +export const tapTraffic = (tapDevice) => nativeCall('tap_traffic', { request: { tapDevice } }, () => { + throw new Error('浏览器预览无法读取 TAP 流量') +}) +export const exportLog = (contents) => nativeCall('export_log', { contents }, () => null) diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..62e4d88 --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,341 @@ +import { useEffect, useRef, useState } from 'react' +import { createRoot } from 'react-dom/client' +import { + ArrowDown, ArrowUp, CheckCircle2, ChevronDown, CircleAlert, Gauge, Globe2, Network, Play, + Download, Router, ScrollText, Server, Settings2, Square, Wifi, +} from 'lucide-react' +import { exportLog, isTauri, serviceStatus, startService, stopService, tapTraffic } from './lib/tauri' +import './styles.css' + +const initialEdge = { + serverHost: '', + serverPort: '7777', + community: '', + dhcp: true, + ip: '', + encryptionKey: '', + managementPort: '5644', + tapDevice: 'n2n0', +} + +function App() { + const [home, setHome] = useState('edge') + const [edge, setEdge] = useState(initialEdge) + const [edgeRunning, setEdgeRunning] = useState(false) + const [advancedOpen, setAdvancedOpen] = useState(false) + const [logOpen, setLogOpen] = useState(false) + const [logs, setLogs] = useState([]) + const [traffic, setTraffic] = useState(null) + const [message, setMessage] = useState(null) + const lastTapSample = useRef(null) + + const appendLog = (text, level = 'info') => { + const time = new Date().toLocaleTimeString('zh-CN', { hour12: false }) + setLogs((current) => [{ time, level, text }, ...current].slice(0, 100)) + } + + useEffect(() => { + let active = true + serviceStatus('edge') + .then((status) => { + if (!active) return + setEdgeRunning(Boolean(status.running)) + appendLog(status.running ? '检测到 Edge 已连接' : 'Edge 已就绪,等待连接', status.running ? 'success' : 'info') + }) + .catch(() => {}) + return () => { active = false } + }, []) + + useEffect(() => { + if (!edgeRunning) { + lastTapSample.current = null + setTraffic(null) + return undefined + } + + let active = true + let timer + const poll = async () => { + try { + const sample = await tapTraffic(edge.tapDevice) + const sampledAt = Date.now() + const previous = lastTapSample.current + const elapsedSeconds = previous ? Math.max((sampledAt - previous.sampledAt) / 1000, .25) : 1 + const downRate = previous ? Math.max(0, sample.receivedBytes - previous.receivedBytes) / elapsedSeconds : 0 + const upRate = previous ? Math.max(0, sample.sentBytes - previous.sentBytes) / elapsedSeconds : 0 + lastTapSample.current = { ...sample, sampledAt } + if (active) setTraffic({ ...sample, downRate, upRate, error: null }) + } catch (error) { + if (active) setTraffic((current) => ({ ...current, error: error.message })) + } finally { + if (active) timer = window.setTimeout(poll, 1000) + } + } + poll() + return () => { + active = false + window.clearTimeout(timer) + } + }, [edgeRunning, edge.tapDevice]) + + const updateEdge = (field, value) => setEdge((current) => ({ ...current, [field]: value })) + const notify = (text, tone = 'error') => { + setMessage({ text, tone }) + window.setTimeout(() => setMessage(null), 3200) + } + + const toggleEdge = async () => { + if (edgeRunning) { + try { + const status = await stopService('edge') + setEdgeRunning(Boolean(status.running)) + appendLog('已断开 N2N 网络') + notify('已断开 N2N 网络', 'neutral') + } catch (error) { + appendLog('停止连接失败:' + error.message, 'error') + notify('无法停止连接:' + error.message) + } + return + } + + if (!edge.serverHost.trim()) { + appendLog('连接校验:未填写服务器 IP 或域名', 'warning') + notify('请填写服务器 IP 或域名') + return + } + if (!edge.community.trim()) { + appendLog('连接校验:未填写群组名称', 'warning') + notify('请填写群组名称') + return + } + if (!edge.dhcp && !edge.ip.trim()) { + appendLog('连接校验:静态 IP 未填写', 'warning') + notify('关闭 DHCP 后,请填写本机 IP') + return + } + + try { + const status = await startService({ + service: 'edge', + binaryPath: './n2n/edge.exe', + args: buildEdgeArgs(edge), + }) + setEdgeRunning(Boolean(status.running)) + appendLog('已连接到群组 ' + edge.community, 'success') + notify('已连接到 ' + edge.community, 'success') + } catch (error) { + appendLog('连接失败:' + error.message, 'error') + notify('无法建立连接:' + error.message) + } + } + + return

+
+
Super N2N
+
{edgeRunning ? '已连接' : '未连接'}
+
+ +
+
+ + +
+ + {home === 'edge' + ? exportLogs(logs, notify)} /> + : } +
+ +
{isTauri ? '本机服务控制已就绪' : '浏览器预览模式'}n2n 3.1.1
+ {message && } +
+} + +function EdgeHome({ edge, updateEdge, running, traffic, advancedOpen, setAdvancedOpen, logOpen, setLogOpen, logs, onToggle, onExportLog }) { + const toggleAdvanced = () => { + setLogOpen(false) + setAdvancedOpen((current) => !current) + } + const toggleLog = () => { + setAdvancedOpen(false) + setLogOpen((current) => !current) + } + + return
+
+
+
+

EDGE

+

加入一个网络

+

填写服务器和群组信息,然后连接。

+
+
+ +
+
+ + + + +
+ 本机 IP updateEdge('dhcp', checked)} /> + updateEdge('ip', event.target.value)} placeholder={edge.dhcp ? '开启 DHCP 后由服务器分配' : '例如:10.0.0.2'} autoComplete="off" disabled={edge.dhcp || running} aria-describedby="ip-help" /> + {edge.dhcp ? 'DHCP 已开启,连接后自动获取 IP。' : '使用静态 IP 时,请确保它没有被其他设备占用。'} +
+
+ + + + {running && } +
+ +
+
+ + {advancedOpen &&
+ + + +
} +
+ + +
+
+} + +function TrafficStrip({ traffic, tapDevice }) { + if (!traffic || traffic.error) { + return
+ TAP {tapDevice} + {traffic?.error ? '无法读取流量' : '正在读取流量…'} +
+ } + return
+
TAP{traffic.interfaceName}
+ + +
+} + +function TrafficMetric({ direction, label, rate, total }) { + const Icon = direction === 'down' ? ArrowDown : ArrowUp + return + {label}{formatRate(rate)}累计 {formatBytes(total)} + +} + +function DhcpToggle({ checked, disabled, onChange }) { + return +} + +function SupernodeHome() { + return
+
+

SUPERNODE

+

创建服务器

+

服务器配置即将加入此页面。

+
+} + +function LogPanel({ open, onToggle, logs, onExport }) { + return
+ + {open &&
+
本次会话
+ {logs.length === 0 + ?

暂无运行记录。连接或校验网络后,事件会显示在这里。

+ :
    {logs.map((log, index) =>
  1. {log.text}
  2. )}
} +
} +
+} + +function Notice({ text, tone }) { + const Icon = tone === 'success' ? CheckCircle2 : CircleAlert + return
{text}
+} + +async function exportLogs(logs, notify) { + const exportedAt = new Date() + const timestamp = exportedAt.toISOString().replace(/[:.]/g, '-').replace('T', '_').slice(0, 19) + const body = [ + 'Super N2N session log', + 'Exported: ' + exportedAt.toLocaleString('zh-CN', { hour12: false }), + '', + ...logs.slice().reverse().map((log) => '[' + log.time + '] [' + log.level.toUpperCase() + '] ' + log.text), + '', + ].join('\n') + const savedPath = await exportLog(body) + if (savedPath) { + notify('运行日志已导出到 ' + savedPath, 'success') + return + } + + const url = URL.createObjectURL(new Blob([body], { type: 'text/plain;charset=utf-8' })) + const link = document.createElement('a') + link.href = url + link.download = 'super-n2n-' + timestamp + '.log' + document.body.appendChild(link) + link.click() + link.remove() + window.setTimeout(() => URL.revokeObjectURL(url), 0) + notify('运行日志已导出', 'success') +} + +function formatRate(bytesPerSecond) { + return formatBytes(bytesPerSecond) + '/s' +} + +function formatBytes(bytes) { + if (!Number.isFinite(bytes) || bytes <= 0) return '0 B' + const units = ['B', 'KB', 'MB', 'GB', 'TB'] + const index = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1) + const value = bytes / (1024 ** index) + return value.toFixed(value >= 100 || index === 0 ? 0 : 1) + ' ' + units[index] +} + +function addOption(args, flag, value) { + if (String(value ?? '').trim()) args.push(flag, String(value).trim()) +} + +function buildEdgeArgs(config) { + const args = [] + addOption(args, '-c', config.community) + addOption(args, '-l', config.serverHost + ':' + (config.serverPort || '7777')) + addOption(args, '-a', config.dhcp ? 'dhcp:0.0.0.0' : config.ip) + addOption(args, '-d', config.tapDevice) + addOption(args, '-t', config.managementPort) + if (config.encryptionKey) addOption(args, '-k', config.encryptionKey) + args.push('-f', '-v', '-v') + return args +} + +const rootElement = document.getElementById('root') +const appRoot = globalThis.__superN2nRoot ?? createRoot(rootElement) +globalThis.__superN2nRoot = appRoot +appRoot.render() diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..2abd834 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,261 @@ +:root { + font-family: "Segoe UI", "Microsoft YaHei", sans-serif; + color: #17242c; + background: #edf5f5; + font-synthesis: none; + text-rendering: optimizeLegibility; + --ink: #17242c; + --muted: #5e7079; + --faint: #81939b; + --canvas: #edf5f5; + --surface: #ffffff; + --line: #d6e1e2; + --line-strong: #b9cacc; + --teal: #087f72; + --teal-dark: #056457; + --teal-soft: #dff3ef; + --blue: #2b6cb0; + --red: #bd3d46; +} + +* { box-sizing: border-box; } +html, body, #root { min-width: 320px; min-height: 100%; margin: 0; } +body { min-height: 100vh; background: var(--canvas); } +button, input { font: inherit; } +button { border: 0; cursor: pointer; } +button:focus-visible, input:focus-visible { outline: 3px solid rgba(43, 108, 176, .35); outline-offset: 2px; } +button:disabled, input:disabled { cursor: not-allowed; } + +.app-shell { min-height: 100vh; display: grid; grid-template-rows: 56px 1fr 36px; background: var(--canvas); } +.app-header, .app-footer { width: min(100% - 40px, 888px); margin: 0 auto; display: flex; align-items: center; justify-content: space-between; } +.app-header { border-bottom: 1px solid var(--line); } +.brand { display: inline-flex; align-items: center; gap: 8px; color: var(--ink); font-size: 16px; font-weight: 700; } +.brand-icon { width: 28px; height: 28px; display: grid; place-items: center; color: #fff; background: var(--teal); border-radius: 6px; } +.runtime { display: flex; align-items: center; gap: 7px; color: var(--muted); font-size: 13px; } +.status-light { width: 7px; height: 7px; border-radius: 50%; background: #a6b5b9; } +.status-light.live { background: #0c9a78; box-shadow: 0 0 0 4px rgba(12, 154, 120, .14); } + +.workspace { width: min(100% - 40px, 640px); align-self: center; justify-self: center; padding: 24px 0 30px; } +.mode-switch { width: max-content; display: flex; gap: 3px; padding: 3px; margin: 0 auto 22px; background: #e0ebeb; border: 1px solid #d1dede; border-radius: 8px; } +.mode-switch button { min-height: 38px; display: inline-flex; align-items: center; justify-content: center; gap: 7px; padding: 0 14px; color: var(--muted); background: transparent; border-radius: 6px; font-size: 13px; font-weight: 600; transition: color 180ms ease, background 180ms ease, box-shadow 180ms ease; } +.mode-switch button:hover { color: var(--ink); } +.mode-switch button.active { color: var(--ink); background: var(--surface); box-shadow: 0 1px 3px rgba(26, 54, 58, .13); } + +.connection-flow { animation: reveal 220ms ease-out; } +.intro { display: flex; align-items: center; justify-content: center; gap: 12px; margin-bottom: 18px; text-align: left; } +.intro-icon, .coming-icon { width: 44px; height: 44px; display: grid; place-items: center; flex: 0 0 auto; color: var(--teal); background: var(--teal-soft); border: 1px solid #b7ddd4; border-radius: 10px; } +.eyebrow { margin: 0 0 3px; color: var(--teal); font-size: 10px; font-weight: 700; letter-spacing: .08em; } +h1 { margin: 0; color: var(--ink); font-size: 24px; line-height: 1.2; letter-spacing: 0; } +.intro-copy { margin: 4px 0 0; color: var(--muted); font-size: 13px; line-height: 1.45; } + +.connection-card { overflow: hidden; background: var(--surface); border: 1px solid var(--line); border-radius: 7px; box-shadow: 0 7px 20px rgba(21, 53, 57, .07); } +.field-stack { display: grid; padding: 18px 22px 6px; } +.input-group { display: grid; gap: 7px; padding: 14px 0; border-bottom: 1px solid #e7eeee; } +.input-group:last-child { border-bottom: 0; } +.field-title { display: inline-flex; align-items: center; gap: 7px; color: var(--ink); font-size: 14px; font-weight: 700; } +.field-title svg { color: var(--teal); } +.input-group input, .advanced-fields input { width: 100%; height: 40px; padding: 0 11px; color: var(--ink); background: #fbfdfd; border: 1px solid var(--line-strong); border-radius: 5px; font-size: 14px; transition: border-color 180ms ease, background 180ms ease, box-shadow 180ms ease; } +.input-group input:hover, .advanced-fields input:hover { border-color: #8ca5a8; } +.input-group input:focus, .advanced-fields input:focus { background: #fff; border-color: var(--blue); box-shadow: 0 0 0 3px rgba(43, 108, 176, .13); outline: 0; } +.input-group input:disabled { color: #83969b; background: #f0f5f5; border-color: #dce6e7; } +.input-group input::placeholder, .advanced-fields input::placeholder { color: #8ca0a5; } +.server-inputs { display: grid; grid-template-columns: minmax(0, 1fr) auto 88px; align-items: center; gap: 7px; } +.port-separator { color: var(--faint); font: 700 19px/1 ui-monospace, Consolas, monospace; } +.ip-heading { display: flex; align-items: center; justify-content: space-between; gap: 16px; } +.input-group small { color: var(--muted); font-size: 12px; line-height: 1.4; } + +.dhcp-toggle { display: inline-flex; align-items: center; gap: 7px; min-height: 28px; color: var(--muted); font-size: 13px; font-weight: 600; cursor: pointer; } +.dhcp-toggle input { position: absolute; width: 1px; height: 1px; opacity: 0; } +.toggle-track { position: relative; width: 36px; height: 22px; flex: 0 0 auto; background: #a8b7ba; border-radius: 14px; transition: background 180ms ease; } +.toggle-track i { position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; background: #fff; border-radius: 50%; box-shadow: 0 1px 2px rgba(18, 42, 45, .2); transition: left 180ms ease; } +.dhcp-toggle input:checked + .toggle-track { background: var(--teal); } +.dhcp-toggle input:checked + .toggle-track i { left: 17px; } +.dhcp-toggle input:focus-visible + .toggle-track { outline: 3px solid rgba(43, 108, 176, .35); outline-offset: 2px; } +.dhcp-toggle input:disabled + .toggle-track { opacity: .55; } +.dhcp-toggle:has(input:disabled) { cursor: not-allowed; } + +.connect-button { width: calc(100% - 44px); min-height: 46px; display: flex; align-items: center; justify-content: center; gap: 8px; margin: 13px 22px 18px; color: #fff; background: var(--teal); border: 1px solid var(--teal); border-radius: 5px; font-size: 15px; font-weight: 700; transition: background 180ms ease, border-color 180ms ease, transform 180ms ease; } +.connect-button:hover { background: var(--teal-dark); border-color: var(--teal-dark); } +.connect-button:active { transform: translateY(1px); } +.connect-button.stop { color: #fff; background: var(--red); border-color: var(--red); } +.connect-button.stop:hover { background: #a7313a; border-color: #a7313a; } +.connection-summary { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); border-top: 1px solid var(--line); background: #f8fbfb; } +.connection-summary div { min-width: 0; display: grid; gap: 4px; padding: 12px 14px; border-right: 1px solid var(--line); } +.connection-summary div:last-child { border-right: 0; } +.connection-summary span { color: var(--faint); font-size: 11px; } +.connection-summary strong { overflow: hidden; color: var(--ink); font-size: 13px; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; } + +.traffic-strip { min-height: 66px; display: grid; grid-template-columns: minmax(135px, 1.1fr) 1fr 1fr; align-items: stretch; border-top: 1px solid var(--line); background: #f7fbfa; } +.traffic-device { min-width: 0; display: flex; align-items: center; gap: 7px; padding: 12px 14px; color: var(--teal); border-right: 1px solid var(--line); font-size: 12px; } +.traffic-device span { color: var(--faint); font-weight: 700; } +.traffic-device strong { overflow: hidden; color: var(--ink); font-size: 13px; text-overflow: ellipsis; white-space: nowrap; } +.traffic-metric { min-width: 0; display: grid; grid-template-columns: auto 1fr; align-content: center; gap: 3px 8px; padding: 9px 13px; border-right: 1px solid var(--line); font-variant-numeric: tabular-nums; } +.traffic-metric:last-child { border-right: 0; } +.traffic-metric span { display: inline-flex; align-items: center; gap: 4px; color: var(--faint); font-size: 11px; } +.traffic-metric.down span svg { color: var(--blue); } +.traffic-metric.up span svg { color: #b36b18; } +.traffic-metric strong { justify-self: end; color: var(--ink); font: 700 14px/1.2 ui-monospace, "Cascadia Code", Consolas, monospace; white-space: nowrap; } +.traffic-metric small { grid-column: 1 / -1; color: var(--muted); font-size: 11px; white-space: nowrap; } +.traffic-strip.pending { min-height: 52px; display: flex; align-items: center; justify-content: space-between; padding-right: 14px; color: var(--muted); } +.traffic-strip.pending .traffic-device { padding-top: 8px; padding-bottom: 8px; border-right: 0; } +.traffic-strip.pending > strong { font-size: 12px; font-weight: 600; } + +.advanced-section, .log-section { margin-top: 8px; background: rgba(255, 255, 255, .58); border: 1px solid var(--line); border-radius: 7px; } +.advanced-toggle { width: 100%; min-height: 42px; display: flex; align-items: center; justify-content: space-between; padding: 0 14px; color: var(--muted); background: transparent; border-radius: 7px; font-size: 13px; font-weight: 600; } +.advanced-toggle:hover, .log-toggle:hover { color: var(--ink); background: rgba(255, 255, 255, .68); } +.advanced-toggle span, .log-toggle span { display: inline-flex; align-items: center; gap: 8px; } +.advanced-toggle svg, .log-toggle > svg { transition: transform 180ms ease; } +.advanced-toggle svg.rotated, .log-toggle > svg.rotated { transform: rotate(180deg); } +.advanced-fields { display: grid; grid-template-columns: 1.4fr .8fr 1fr; gap: 10px; padding: 0 14px 14px; } +.advanced-fields label { display: grid; gap: 6px; color: var(--muted); font-size: 12px; font-weight: 600; } +.advanced-fields input { height: 36px; padding: 0 9px; font-size: 13px; } + +.log-toggle { width: 100%; min-height: 42px; display: flex; align-items: center; justify-content: space-between; padding: 0 14px; color: var(--muted); background: transparent; border-radius: 7px; font-size: 13px; font-weight: 600; } +.log-toggle small { min-width: 22px; height: 20px; display: inline-grid; place-items: center; padding: 0 6px; color: #41616a; background: #dfeaea; border-radius: 10px; font-size: 11px; } +.log-content { padding: 0 14px 14px; } +.log-toolbar { min-height: 40px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-top: 1px solid var(--line); } +.log-toolbar > span { color: var(--faint); font-size: 12px; } +.export-log { min-height: 32px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 0 9px; color: var(--teal-dark); background: #edf8f5; border: 1px solid #badbd3; border-radius: 5px; font-size: 12px; font-weight: 700; transition: background 180ms ease, border-color 180ms ease; } +.export-log:hover { background: var(--teal-soft); border-color: #8ec7b9; } +.export-log:disabled { color: #93a2a5; background: #f2f5f5; border-color: var(--line); opacity: .75; } +.empty-log { margin: 0; padding: 24px 16px; color: var(--muted); text-align: center; background: #f8fbfb; border: 1px solid #e1e9ea; border-radius: 6px; font-size: 13px; line-height: 1.5; } +.log-list { max-height: 190px; margin: 0; padding: 0; overflow-y: auto; list-style: none; background: #172328; border: 1px solid #26383f; border-radius: 5px; } +.log-list li { min-height: 34px; display: grid; grid-template-columns: 68px minmax(0, 1fr); align-items: center; gap: 10px; padding: 6px 10px; color: #d4dfe1; border-bottom: 1px solid #29383e; font: 11px/1.4 ui-monospace, "Cascadia Code", Consolas, monospace; } +.log-list li:last-child { border-bottom: 0; } +.log-list time { color: #80979e; } +.log-list li.success span { color: #79d8bd; } +.log-list li.warning span { color: #edc67f; } +.log-list li.error span { color: #f0a0a6; } + +.coming-soon { min-height: 280px; display: grid; align-content: center; justify-items: center; padding: 32px; text-align: center; background: rgba(255, 255, 255, .68); border: 1px dashed #b7cbcb; border-radius: 7px; animation: reveal 220ms ease-out; } +.coming-soon .coming-icon { margin-bottom: 14px; color: var(--blue); background: #e5f0fc; border-color: #c6dbf4; } +.coming-soon h1 { margin-bottom: 10px; } +.coming-soon p:last-child { margin: 0; color: var(--muted); font-size: 14px; } + +.app-footer { color: var(--faint); border-top: 1px solid var(--line); font-size: 12px; } +.notice { position: fixed; right: 24px; bottom: 24px; max-width: min(420px, calc(100vw - 48px)); display: flex; align-items: center; gap: 10px; padding: 14px 16px; color: #803035; background: #fff7f7; border: 1px solid #e6b9bb; border-radius: 7px; box-shadow: 0 8px 22px rgba(44, 44, 44, .13); font-size: 14px; animation: reveal 200ms ease-out; } +.notice.success { color: #0d6a5e; background: #f0fbf8; border-color: #a8d9cd; } +.notice.neutral { color: #586a70; background: #f7fafa; border-color: #d2e0e1; } +@keyframes reveal { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } + +@media (max-width: 680px) { + .app-shell { grid-template-rows: 54px 1fr 34px; } + .app-header, .app-footer, .workspace { width: min(100% - 24px, 640px); } + .workspace { padding: 18px 0 24px; align-self: start; } + .mode-switch { width: 100%; margin-bottom: 18px; } + .mode-switch button { flex: 1; padding: 0 10px; font-size: 13px; } + .intro { align-items: center; justify-content: flex-start; gap: 10px; } + .intro-icon { width: 40px; height: 40px; border-radius: 9px; } + .intro-icon svg { width: 21px; height: 21px; } + h1 { font-size: 22px; } + .intro-copy { font-size: 12px; } + .field-stack { padding: 10px 16px 2px; } + .input-group { padding: 12px 0; } + .server-inputs { grid-template-columns: minmax(0, 1fr) auto 74px; gap: 5px; } + .input-group input { height: 38px; font-size: 14px; } + .connect-button { width: calc(100% - 32px); margin: 10px 16px 14px; } + .connection-summary { grid-template-columns: 1fr; } + .connection-summary div { grid-template-columns: 80px 1fr; align-items: baseline; padding: 9px 14px; border-right: 0; border-bottom: 1px solid var(--line); } + .connection-summary div:last-child { border-bottom: 0; } + .traffic-strip { grid-template-columns: 1fr 1fr; } + .traffic-device { grid-column: 1 / -1; padding: 9px 12px; border-right: 0; border-bottom: 1px solid var(--line); } + .traffic-metric { padding: 8px 11px; } + .traffic-strip.pending { display: flex; } + .traffic-strip.pending .traffic-device { border-bottom: 0; } + .advanced-fields { grid-template-columns: 1fr; } + .log-list li { grid-template-columns: 66px minmax(0, 1fr); gap: 8px; padding: 8px 10px; font-size: 11px; } + .app-footer { font-size: 11px; } + .notice { right: 16px; bottom: 16px; max-width: calc(100vw - 32px); } +} + +@media (max-width: 400px), (max-height: 450px) { + html, body, #root { width: 100%; height: 100%; min-width: 0; min-height: 0; overflow: hidden; } + body { min-height: 0; } + .app-shell { width: 100%; height: 100%; min-height: 0; grid-template-rows: 42px minmax(0, 1fr); overflow: hidden; } + .app-header { width: 100%; min-width: 0; height: 42px; padding: 0 10px; } + .app-footer { display: none; } + .brand { gap: 6px; font-size: 14px; } + .brand-icon { width: 24px; height: 24px; border-radius: 5px; } + .brand-icon svg { width: 16px; height: 16px; } + .runtime { gap: 5px; font-size: 11px; } + .status-light { width: 6px; height: 6px; } + + .workspace { width: 100%; height: 100%; min-height: 0; padding: 7px 10px 8px; overflow: hidden; align-self: stretch; } + .mode-switch { width: 100%; height: 34px; min-height: 34px; margin: 0 0 7px; padding: 2px; border-radius: 6px; } + .mode-switch button { min-height: 28px; gap: 5px; padding: 0 5px; border-radius: 4px; font-size: 12px; } + .mode-switch button svg { width: 15px; height: 15px; } + .connection-flow { height: calc(100% - 41px); display: grid; grid-template-rows: minmax(0, 1fr) 34px; gap: 6px; } + .intro { display: none; } + .connection-card { min-height: 0; display: flex; flex-direction: column; border-radius: 6px; box-shadow: none; } + .field-stack { min-height: 0; flex: 1 1 auto; padding: 3px 8px; } + .input-group { grid-template-columns: 70px minmax(0, 1fr); align-items: center; gap: 6px; padding: 4px 0; } + .input-group:not(:has(.ip-heading)) > .field-title { grid-column: 1; grid-row: 1; } + .input-group:not(:has(.ip-heading)) > input, .input-group:not(:has(.ip-heading)) > .server-inputs { grid-column: 2; grid-row: 1; } + .field-title { gap: 0; font-size: 12px; } + .field-title svg { display: none; } + .input-group input { height: 30px; padding: 0 7px; border-radius: 4px; font-size: 12px; } + .server-inputs { grid-template-columns: minmax(0, 1fr) auto 58px; gap: 4px; } + .port-separator { font-size: 15px; } + .input-group small { display: none; } + .ip-heading { display: contents; } + .input-group:has(.ip-heading) { position: relative; } + .input-group:has(.ip-heading) .field-title { grid-column: 1; grid-row: 1; } + .input-group:has(.ip-heading) > input { grid-column: 2; grid-row: 1; padding-right: 65px; } + .input-group:has(.ip-heading) .dhcp-toggle { position: absolute; top: 7px; right: 5px; gap: 4px; min-height: 18px; font-size: 10px; } + .toggle-track { width: 28px; height: 17px; } + .toggle-track i { top: 2px; left: 2px; width: 13px; height: 13px; } + .dhcp-toggle input:checked + .toggle-track i { left: 13px; } + .connect-button { width: calc(100% - 16px); min-height: 32px; flex: 0 0 32px; margin: 3px 8px 5px; gap: 6px; border-radius: 4px; font-size: 12px; } + .connect-button svg { width: 15px; height: 15px; } + .connection-summary { display: none; } + + .traffic-strip { min-height: 42px; grid-template-columns: 72px 1fr 1fr; } + .traffic-device { gap: 4px; padding: 5px 6px; font-size: 10px; } + .traffic-device svg { width: 13px; height: 13px; } + .traffic-device span { display: none; } + .traffic-device strong { font-size: 11px; } + .traffic-metric { grid-template-columns: auto 1fr; gap: 1px 4px; padding: 4px 5px; } + .traffic-metric span { gap: 2px; font-size: 9px; } + .traffic-metric span svg { width: 11px; height: 11px; } + .traffic-metric strong { font-size: 11px; } + .traffic-metric small { display: none; } + .traffic-strip.pending { min-height: 42px; padding-right: 7px; } + .traffic-strip.pending .traffic-device { padding: 5px 6px; } + .traffic-strip.pending > strong { font-size: 10px; } + + .secondary-actions { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 6px; min-height: 34px; } + .advanced-section, .log-section { min-width: 0; height: 34px; margin: 0; border-radius: 6px; } + .advanced-toggle, .log-toggle { min-height: 32px; height: 32px; padding: 0 8px; border-radius: 5px; font-size: 11px; } + .advanced-toggle span, .log-toggle span { min-width: 0; gap: 5px; white-space: nowrap; } + .advanced-toggle span svg, .log-toggle span svg { width: 14px; height: 14px; flex: 0 0 auto; } + .advanced-toggle > svg, .log-toggle > svg { width: 14px; height: 14px; flex: 0 0 auto; } + .log-toggle small { min-width: 17px; height: 16px; padding: 0 4px; font-size: 9px; } + + .advanced-section:has(.advanced-fields), .log-section:has(.log-content) { position: fixed; z-index: 20; inset: 42px 0 0; width: 100%; height: auto; padding: 8px 10px; overflow: hidden; background: var(--canvas); border: 0; border-radius: 0; } + .advanced-section:has(.advanced-fields) .advanced-toggle, .log-section:has(.log-content) .log-toggle { min-height: 34px; height: 34px; padding: 0 9px; background: rgba(255, 255, 255, .72); border: 1px solid var(--line); border-radius: 6px; } + .advanced-fields { grid-template-columns: 1fr; gap: 6px; padding: 8px 4px 0; } + .advanced-fields label { gap: 4px; font-size: 11px; } + .advanced-fields input { height: 30px; padding: 0 7px; border-radius: 4px; font-size: 12px; } + + .log-content { padding: 8px 0 0; } + .log-toolbar { min-height: 32px; padding: 0 4px; gap: 8px; } + .log-toolbar > span { font-size: 11px; } + .export-log { min-height: 28px; gap: 4px; padding: 0 7px; font-size: 11px; } + .export-log svg { width: 13px; height: 13px; } + .empty-log { padding: 16px 10px; border-radius: 5px; font-size: 11px; line-height: 1.4; } + .log-list { max-height: none; overflow: hidden; border-radius: 4px; } + .log-list li { min-height: 26px; grid-template-columns: 56px minmax(0, 1fr); gap: 5px; padding: 4px 6px; font-size: 10px; } + .log-list li:nth-child(n + 5) { display: none; } + .log-list li span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + + .coming-soon { min-height: 0; height: calc(100% - 41px); padding: 16px; border-radius: 6px; } + .coming-soon .coming-icon { width: 34px; height: 34px; margin-bottom: 8px; border-radius: 7px; } + .coming-soon .coming-icon svg { width: 20px; height: 20px; } + .coming-soon h1 { margin-bottom: 6px; font-size: 18px; } + .coming-soon p:last-child { font-size: 12px; } + .notice { right: 8px; bottom: 8px; max-width: calc(100vw - 16px); padding: 9px 10px; border-radius: 5px; font-size: 12px; } +} + +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { scroll-behavior: auto !important; animation-duration: .01ms !important; transition-duration: .01ms !important; } +} diff --git a/third_party/n2n b/third_party/n2n new file mode 160000 index 0000000..4831375 --- /dev/null +++ b/third_party/n2n @@ -0,0 +1 @@ +Subproject commit 4831375d6ec787829cc7648308f8d4a48e93301f diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..185d5d0 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + clearScreen: false, + server: { + strictPort: true, + }, +})