From cc4f90e840f08cfa7ddd0d7389e0c5fe107cbb29 Mon Sep 17 00:00:00 2001 From: lucasdpt Date: Sun, 14 Jun 2026 12:32:29 +0200 Subject: [PATCH] first commit --- README.md | 165 + dev-app-update.yml | 6 + electron-builder.yml | 41 + electron.vite.config.ts | 34 + package-lock.json | 7529 +++++++++++++++++++++ package.json | 41 + resources/packwiz-installer-bootstrap.jar | Bin 0 -> 98989 bytes scripts/publish-gitea.mjs | 118 + src/main/auth.ts | 128 + src/main/download.ts | 52 + src/main/events.ts | 29 + src/main/index.ts | 77 + src/main/install.ts | 98 + src/main/java.ts | 209 + src/main/launch.ts | 59 + src/main/modpack.ts | 103 + src/main/net.ts | 57 + src/main/paths.ts | 60 + src/main/play.ts | 50 + src/main/settings.ts | 23 + src/main/updater.ts | 59 + src/preload/index.d.ts | 9 + src/preload/index.ts | 65 + src/renderer/index.html | 16 + src/renderer/src/App.tsx | 236 + src/renderer/src/index.css | 257 + src/renderer/src/main.tsx | 10 + src/shared/config.ts | 39 + src/shared/ipc.ts | 103 + tsconfig.json | 7 + tsconfig.node.json | 24 + tsconfig.web.json | 25 + 32 files changed, 9729 insertions(+) create mode 100644 README.md create mode 100644 dev-app-update.yml create mode 100644 electron-builder.yml create mode 100644 electron.vite.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 resources/packwiz-installer-bootstrap.jar create mode 100644 scripts/publish-gitea.mjs create mode 100644 src/main/auth.ts create mode 100644 src/main/download.ts create mode 100644 src/main/events.ts create mode 100644 src/main/index.ts create mode 100644 src/main/install.ts create mode 100644 src/main/java.ts create mode 100644 src/main/launch.ts create mode 100644 src/main/modpack.ts create mode 100644 src/main/net.ts create mode 100644 src/main/paths.ts create mode 100644 src/main/play.ts create mode 100644 src/main/settings.ts create mode 100644 src/main/updater.ts create mode 100644 src/preload/index.d.ts create mode 100644 src/preload/index.ts create mode 100644 src/renderer/index.html create mode 100644 src/renderer/src/App.tsx create mode 100644 src/renderer/src/index.css create mode 100644 src/renderer/src/main.tsx create mode 100644 src/shared/config.ts create mode 100644 src/shared/ipc.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 tsconfig.web.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..aae1ad8 --- /dev/null +++ b/README.md @@ -0,0 +1,165 @@ +# OFLauncher + +Launcher Minecraft custom pour jouer à **All The Mods 10** (Minecraft 1.21.1 / +NeoForge / Java 21) entre potes, avec **mise à jour incrémentale du modpack** : +quand tu changes le pack, les joueurs ne re-téléchargent que ce qui a changé. + +- **UI** : Electron + React + TypeScript +- **Auth Microsoft** : `prismarine-auth` (cache + refresh automatique) +- **Runtime MC / NeoForge** : `@xmcl/core` + `@xmcl/installer` +- **Java 21** : JRE Temurin (Adoptium) téléchargé et géré automatiquement +- **Sync du modpack** : `packwiz-installer` (delta par hash, conforme CurseForge) + +--- + +## 1. Développement + +```bash +npm install # une fois +npm run dev # lance le launcher en mode dev (hot reload) +npm run typecheck # vérifie les types main + renderer +npm run build # build de production (out/) +``` + +## 2. Configuration (la seule chose à éditer dans le code) + +Tout est dans **`src/shared/config.ts`** : + +| Champ | À mettre | +| --------------- | -------------------------------------------------------------------- | +| `packTomlUrl` | URL publique de ton `pack.toml` packwiz (voir §4) | +| `azureClientId` | Client ID de ton app Azure (voir §3). Laisse `CHANGE_ME` pour tester | +| `serverAddress` | (optionnel) `ip:port` du serveur pour rejoindre en un clic | + +Les **versions Minecraft et NeoForge ne sont PAS dans le code** : elles viennent +du `pack.toml`. Pour changer de version, tu mets à jour le pack, pas le launcher. + +## 3. Auth Microsoft + +Par défaut (`azureClientId = "CHANGE_ME"`), le launcher utilise le flow `live` +qui **fonctionne tout de suite** pour tester, sans app Azure. + +Pour la version « propre » d'un launcher tiers (recommandé en prod) : + +1. Crée une app sur [Azure Portal](https://portal.azure.com) → *App registrations* + (comptes personnels / *consumers*), avec le scope `XboxLive.signin`. +2. **Demande l'accès à l'API Minecraft** via le formulaire Microsoft — cette + approbation peut prendre du temps, fais-le tôt. Réf : + +3. Mets le Client ID dans `config.azureClientId`. Le launcher bascule alors + automatiquement sur le flow `msal`. + +Le login se fait en **device code** : le launcher ouvre la page Microsoft et +affiche un code à saisir. Le token est mis en cache (pas de re-login ensuite). + +## 4. Créer et héberger le modpack (côté admin = toi) + +Le modpack est géré avec [**packwiz**](https://packwiz.infra.link/) (CLI). + +```bash +# 1. Récupère une clé API CurseForge (https://console.curseforge.com) -> CF_API_KEY +# 2. Crée le dépôt packwiz à partir d'ATM10 (depuis le .zip CurseForge d'ATM10) : +packwiz init # renseigne MC 1.21.1 + NeoForge +packwiz cf import All-the-Mods-10-x.y.z.zip # importe les mods + configs + +# 3. À chaque modif du pack : +packwiz cf add # ajouter un mod CurseForge +packwiz update --all # mettre à jour les mods +packwiz remove # retirer un mod +packwiz refresh # régénère index.toml (le manifeste hashé) +git add -A && git commit -m "update pack" && git push +``` + +**Hébergement** (à décider) : le plus simple est **GitHub**. + +- Pousse le dossier packwiz dans un repo (ex. `OFModpack`). +- `packTomlUrl` = lien *raw* vers `pack.toml`, ex. + `https://raw.githubusercontent.com//OFModpack/main/pack.toml`. +- (ou GitHub Pages pour une URL plus propre.) + +À chaque lancement, le launcher relit `pack.toml`/`index.toml` et **ne télécharge +que les fichiers dont le hash a changé** ; les fichiers retirés du pack sont +supprimés de l'instance du joueur. + +> **Mods CurseForge non-redistribuables** : la grande majorité d'ATM10 se +> télécharge automatiquement. Pour les rares mods qui interdisent la +> redistribution, packwiz les signalera ; au besoin tu peux les héberger +> toi-même (si la licence le permet) via un bloc `[download]` dans le `.pw.toml`. + +## 5. Build des binaires + +```bash +npm run build:win # installeur Windows (.exe NSIS) -> dist/ +npm run build:linux # AppImage + .deb -> dist/ +``` + +### Auto-update du launcher (via Gitea) + +Le launcher se met à jour tout seul : au démarrage il lit `latest.yml` à l'URL +configurée dans `electron-builder.yml` (`publish.url`), télécharge la nouvelle +version en fond et propose un bouton **« Redémarrer pour installer »**. + +Les artefacts sont hébergés sur une **release Gitea à tag fixe `latest`** +(provider `generic` d'electron-updater — il n'y a pas de provider Gitea natif). +À chaque publication, les assets de cette release sont **écrasés**. + +Pré-requis côté Gitea (une fois) : + +- un repo launcher, ex. `gitea.ldpt.fr/zertus/OFLauncher` ; +- un **token d'accès** avec le scope `write:repository`. + +Publier une nouvelle version : + +```bash +npm version patch # bump 0.1.0 -> 0.1.1 (la version EST la source de vérité) +export GITEA_TOKEN=xxxxx # token Gitea (scope write:repository) +npm run publish:win # build l'installeur + upload latest.yml/installeur/.blockmap +``` + +`scripts/publish-gitea.mjs` crée la release `latest` si besoin, supprime les +anciens assets puis uploade les nouveaux. URL/owner/repo/tag sont surchargeables +via les variables `GITEA_URL` / `GITEA_OWNER` / `GITEA_REPO` / `GITEA_TAG`. + +**Publier via Gitea Actions (CI, déclenchement manuel)** — au lieu de builder en +local, tu peux lancer le workflow `.gitea/workflows/publish.yml` depuis l'onglet +*Actions* du repo (bouton « Run workflow »). Il build l'installeur Windows sous +Linux via Wine (image `electronuserland/builder`) puis publie sur la release +`latest`. Optionnellement, l'input `bump` (patch/minor/major) incrémente la +version et pousse le commit avant le build. Pré-requis : Gitea Actions activé + +un act_runner enregistré (label `ubuntu-latest`, à adapter) ; le token auto +`secrets.GITEA_TOKEN` suffit s'il a le droit d'écrire les releases. + +> Tester le flux en dev : `dev-app-update.yml` (déjà présent) pointe sur la même +> URL ; avec une version distante > version locale, le bandeau de maj apparaît +> en `npm run dev` (l'install réelle ne se fait toutefois qu'en build packagé). + +## 6. Où vivent les fichiers + +Sous le dossier userData d'Electron (`%APPDATA%/OFLauncher` sur Windows, +`~/.config/OFLauncher` sur Linux) : + +``` +minecraft/ runtime géré par @xmcl (versions, libraries, assets) — jamais touché par packwiz +instance/ mods/, config/, saves/ — cible de la sync packwiz +java/ JRE Temurin 21 géré +auth-cache/ tokens Microsoft (refresh auto) +settings.json réglages (RAM, args JVM) +``` + +## Architecture (code) + +``` +src/ +├── shared/ config + contrats IPC partagés main/renderer +├── main/ +│ ├── index.ts bootstrap Electron + handlers IPC +│ ├── auth.ts login/refresh/logout Microsoft +│ ├── java.ts provisioning Temurin 21 +│ ├── install.ts install MC + NeoForge (@xmcl) +│ ├── modpack.ts pack.toml + sync packwiz +│ ├── launch.ts lancement du jeu (@xmcl) +│ ├── play.ts orchestration de la séquence "Jouer" +│ └── ... +├── preload/ pont IPC typé (window.api) +└── renderer/ UI React +``` diff --git a/dev-app-update.yml b/dev-app-update.yml new file mode 100644 index 0000000..8a88207 --- /dev/null +++ b/dev-app-update.yml @@ -0,0 +1,6 @@ +# Lu par electron-updater UNIQUEMENT en dev (app non packagée) pour tester le +# flux de mise à jour sans build complet. Doit refléter le bloc `publish` de +# electron-builder.yml. Ignoré en production (le vrai app-update.yml est injecté +# dans le build). +provider: generic +url: https://gitea.ldpt.fr/zertus/OFLauncher/releases/download/latest/ diff --git a/electron-builder.yml b/electron-builder.yml new file mode 100644 index 0000000..31fa634 --- /dev/null +++ b/electron-builder.yml @@ -0,0 +1,41 @@ +appId: com.oflauncher.app +productName: OFLauncher +directories: + buildResources: build + output: dist +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml,package-lock.json}' + - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}' +asarUnpack: + - resources/** +extraResources: + - from: resources/ + to: resources/ + filter: + - '**/*' +win: + target: + - nsis + artifactName: ${productName}-${version}-setup.${ext} +nsis: + oneClick: false + perMachine: false + allowToChangeInstallationDirectory: true +linux: + target: + - AppImage + - deb + maintainer: oflauncher + category: Game + artifactName: ${productName}-${version}.${ext} +# Publication des binaires du launcher (auto-update). +# Provider "generic" : electron-updater lit latest.yml à cette URL fixe. +# Les artefacts (latest.yml + installeur + .blockmap) sont uploadés sur une +# release Gitea à tag fixe "latest" via scripts/publish-gitea.mjs. +publish: + provider: generic + url: https://gitea.ldpt.fr/zertus/OFLauncher/releases/download/latest/ diff --git a/electron.vite.config.ts b/electron.vite.config.ts new file mode 100644 index 0000000..873fefa --- /dev/null +++ b/electron.vite.config.ts @@ -0,0 +1,34 @@ +import { resolve } from 'path' +import { defineConfig, externalizeDepsPlugin } from 'electron-vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + main: { + plugins: [externalizeDepsPlugin()], + build: { + rollupOptions: { + input: { + index: resolve(__dirname, 'src/main/index.ts') + } + } + } + }, + preload: { + plugins: [externalizeDepsPlugin()], + build: { + rollupOptions: { + input: { + index: resolve(__dirname, 'src/preload/index.ts') + } + } + } + }, + renderer: { + resolve: { + alias: { + '@renderer': resolve('src/renderer/src') + } + }, + plugins: [react()] + } +}) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..69621b7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7529 @@ +{ + "name": "oflauncher", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oflauncher", + "version": "0.1.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@xmcl/core": "^2.15.1", + "@xmcl/installer": "^6.1.2", + "electron-updater": "^6.8.9", + "prismarine-auth": "^3.1.1", + "smol-toml": "^1.6.1", + "undici": "^7.2.3" + }, + "devDependencies": { + "@types/node": "^20.17.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "electron": "^33.2.0", + "electron-builder": "^25.1.8", + "electron-vite": "^2.3.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^5.6.3", + "vite": "^5.4.11" + } + }, + "node_modules/@azure/msal-common": { + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.1.tgz", + "integrity": "sha512-nyxsA6NA4SVKh5YyRpbSXiMr7oQbwark7JU9LMeg6tJYTSPyAGkdx61wPT4gyxZfxlSxMMEyAsWaubBlNyIa1w==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.3.tgz", + "integrity": "sha512-CO+SE4weOsfJf+C5LM8argzvotrXw252/ZU6SM2Tz63fEblhH1uuVaaO4ISYFuN4Q6BhTo7I3qIdi8ydUQCqhw==", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "14.16.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "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-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "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/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", + "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.1.tgz", + "integrity": "sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/rebuild/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/rebuild/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@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/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@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.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.0.tgz", + "integrity": "sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.0.tgz", + "integrity": "sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.0.tgz", + "integrity": "sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.0.tgz", + "integrity": "sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.0.tgz", + "integrity": "sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.0.tgz", + "integrity": "sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.0.tgz", + "integrity": "sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.0.tgz", + "integrity": "sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.0.tgz", + "integrity": "sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.0.tgz", + "integrity": "sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.0.tgz", + "integrity": "sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.0.tgz", + "integrity": "sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.0.tgz", + "integrity": "sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.0.tgz", + "integrity": "sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.0.tgz", + "integrity": "sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.0.tgz", + "integrity": "sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.0.tgz", + "integrity": "sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.0.tgz", + "integrity": "sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.0.tgz", + "integrity": "sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.0.tgz", + "integrity": "sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.0.tgz", + "integrity": "sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.0.tgz", + "integrity": "sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.0.tgz", + "integrity": "sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.0.tgz", + "integrity": "sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.0.tgz", + "integrity": "sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", + "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@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/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@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/@xboxreplay/xboxlive-auth": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@xboxreplay/xboxlive-auth/-/xboxlive-auth-5.1.0.tgz", + "integrity": "sha512-UngHHsehZbiTjyyNmo8HvdoUDKMID1U9uVfrpFWUK/2UxPuVTKy5n+CzZQ3S488sW5vOhgh0lHqqynT8ouwgvw==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@xmcl/asm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@xmcl/asm/-/asm-1.0.1.tgz", + "integrity": "sha512-7vCVgm1E1IZ2cujiitFk9550Vgu2XAOn1ff90di638fMmTK0XkFMXKsSR/nGZmYKt+XiTMI/0B3TvreqbVjOug==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@xmcl/core": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/@xmcl/core/-/core-2.15.1.tgz", + "integrity": "sha512-ldVWtFGRTnQ836oRnex3YiwCogQmy2XdKfdYz9uAoEbXofMrH/Yq/uEK593iQ9iVJa8Rlfik+LjzGAfsYzR1SQ==", + "license": "MIT", + "dependencies": { + "@xmcl/unzip": "2.1.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@xmcl/file-transfer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@xmcl/file-transfer/-/file-transfer-2.0.3.tgz", + "integrity": "sha512-IzS1EsmirFF7fHQyJ3Otpu8W7l1vD4qzAlJtFDpkCrMRhfG99smgTiprhlfPzK8XklPe3cq8qKoiEO3v11VI9w==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "http-cache-semantics": "^4.1.1", + "undici": "7.2.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@xmcl/forge-site-parser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@xmcl/forge-site-parser/-/forge-site-parser-2.0.9.tgz", + "integrity": "sha512-OHKG2KYE+F6TSeOQmymuGoqEifxbJb3w3X/hmxMNeqtewiYukJldPmKO559ZFnZnOuMQEnr+X0dMbTQwWs5dFg==", + "license": "MIT", + "dependencies": { + "node-html-parser": "^6.1.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@xmcl/installer": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@xmcl/installer/-/installer-6.1.2.tgz", + "integrity": "sha512-q0meO1I4oyL0jCd8mfRD8D92ODgTbg+sQvkfilWwG1115EBd1KNBzqFRKYXzkmEGwjrcCdhbA5Q4ECpJ87Ro0Q==", + "license": "MIT", + "dependencies": { + "@xmcl/asm": "1.0.1", + "@xmcl/core": "2.15.1", + "@xmcl/file-transfer": "2.0.3", + "@xmcl/forge-site-parser": "2.0.9", + "@xmcl/task": "4.1.1", + "@xmcl/unzip": "2.1.2", + "undici": "7.2.3", + "yauzl": "^2.10.0", + "yazl": "^2.5.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@xmcl/task": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@xmcl/task/-/task-4.1.1.tgz", + "integrity": "sha512-UdTf37uBG26hx3UW8oDM5TFTodV0CMTgUKOQu5XGMc2iVEKXuC5rUgVMf6Av7aDAxbgb5LedK/5Ik1lDP9CRRA==", + "license": "MIT" + }, + "node_modules/@xmcl/unzip": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@xmcl/unzip/-/unzip-2.1.2.tgz", + "integrity": "sha512-Lm/eg/e0/p+sfj/RT2QDpsBAf39DZqQ3+XvX1JXZPb64wnjwOf8CGU1WPv6BseEcJ5CMOpm0s2NyrEQD04y0UQ==", + "license": "MIT", + "dependencies": { + "@types/yauzl": "^2.10.0", + "yauzl": "^2.10.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "yauzl": "^2.10.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-bin": { + "version": "5.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz", + "integrity": "sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-25.1.8.tgz", + "integrity": "sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.1", + "@electron/rebuild": "3.6.1", + "@electron/universal": "2.0.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", + "chromium-pickle-js": "^0.2.0", + "config-file-ts": "0.2.8-rc1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "25.1.7", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.0.0", + "resedit": "^1.7.0", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "25.1.8", + "electron-builder-squirrel-windows": "25.1.8" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "dev": true, + "license": "ISC" + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "25.1.7", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-25.1.7.tgz", + "integrity": "sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.10", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.10", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.10", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz", + "integrity": "sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-file-ts": { + "version": "0.2.8-rc1", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", + "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.12", + "typescript": "^5.4.3" + } + }, + "node_modules/config-file-ts/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-file-ts/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.1.8.tgz", + "integrity": "sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "25.1.8", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "33.4.11", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz", + "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-25.1.8.tgz", + "integrity": "sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "25.1.8", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", + "chalk": "^4.1.2", + "dmg-builder": "25.1.8", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "25.1.8", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-25.1.8.tgz", + "integrity": "sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "25.1.8", + "archiver": "^5.3.1", + "builder-util": "25.1.7", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "25.1.7", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.1.7.tgz", + "integrity": "sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "25.1.7", + "builder-util-runtime": "9.2.10", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.372", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz", + "integrity": "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron-updater": { + "version": "6.8.9", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.8.9.tgz", + "integrity": "sha512-ZhVxM9iGONUpZGI1FxdMRgJjUFXi7AYGVa5PwKlO1tV1/4zDxQmfKpXOHVztKrd6L9rLcFjERvi1Mf2vxyTkig==", + "license": "MIT", + "dependencies": { + "builder-util-runtime": "9.7.0", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "~7.7.3", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/electron-updater/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-updater/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-updater/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-updater/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-vite": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-2.3.0.tgz", + "integrity": "sha512-lsN2FymgJlp4k6MrcsphGqZQ9fKRdJKasoaiwIrAewN1tapYI/KINLdfEL7n10LuF0pPSNf/IqjzZbB5VINctg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.7", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "cac": "^6.7.14", + "esbuild": "^0.21.5", + "magic-string": "^0.30.10", + "picocolors": "^1.0.1" + }, + "bin": { + "electron-vite": "bin/electron-vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@swc/core": "^1.0.0", + "vite": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + } + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/macaddress": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.5.4.tgz", + "integrity": "sha512-i8xVWoUjj2woYU8kbpQby86Kq7uF7xl2brtKREXUBWpfgqx1fKXEeYzDiVMVxA/IufC1d3xxwJRHtFCX+9IspA==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "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/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/plist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", + "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.9.10", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prismarine-auth": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prismarine-auth/-/prismarine-auth-3.1.1.tgz", + "integrity": "sha512-NuNrMGZdoigFKsvi1ZZgAEvNYNuE5qe6lo/tw+bqeNbkhpjHC0u1JNxLEujnfqduXI18e19PvUtWNMDl/gH7yw==", + "license": "MIT", + "dependencies": { + "@azure/msal-node": "^2.0.2", + "@xboxreplay/xboxlive-auth": "^5.1.0", + "debug": "^4.3.3", + "smart-buffer": "^4.1.0", + "uuid-1345": "^1.0.2" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.0.tgz", + "integrity": "sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==", + "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": { + "@rollup/rollup-android-arm-eabi": "4.62.0", + "@rollup/rollup-android-arm64": "4.62.0", + "@rollup/rollup-darwin-arm64": "4.62.0", + "@rollup/rollup-darwin-x64": "4.62.0", + "@rollup/rollup-freebsd-arm64": "4.62.0", + "@rollup/rollup-freebsd-x64": "4.62.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.0", + "@rollup/rollup-linux-arm-musleabihf": "4.62.0", + "@rollup/rollup-linux-arm64-gnu": "4.62.0", + "@rollup/rollup-linux-arm64-musl": "4.62.0", + "@rollup/rollup-linux-loong64-gnu": "4.62.0", + "@rollup/rollup-linux-loong64-musl": "4.62.0", + "@rollup/rollup-linux-ppc64-gnu": "4.62.0", + "@rollup/rollup-linux-ppc64-musl": "4.62.0", + "@rollup/rollup-linux-riscv64-gnu": "4.62.0", + "@rollup/rollup-linux-riscv64-musl": "4.62.0", + "@rollup/rollup-linux-s390x-gnu": "4.62.0", + "@rollup/rollup-linux-x64-gnu": "4.62.0", + "@rollup/rollup-linux-x64-musl": "4.62.0", + "@rollup/rollup-openbsd-x64": "4.62.0", + "@rollup/rollup-openharmony-arm64": "4.62.0", + "@rollup/rollup-win32-arm64-msvc": "4.62.0", + "@rollup/rollup-win32-ia32-msvc": "4.62.0", + "@rollup/rollup-win32-x64-gnu": "4.62.0", + "@rollup/rollup-win32-x64-msvc": "4.62.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/smol-toml": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.2.3.tgz", + "integrity": "sha512-2oSLHaDalSt2/O/wHA9M+/ZPAOcU2yrSP/cdBYJ+YxZskiPYDSqHbysLSlD7gq3JMqOoJI5O31RVU3BxX/MnAA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuid-1345": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuid-1345/-/uuid-1345-1.0.2.tgz", + "integrity": "sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==", + "license": "MIT", + "dependencies": { + "macaddress": "^0.5.1" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..263e852 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "oflauncher", + "version": "0.1.0", + "description": "Launcher Minecraft custom pour le modpack ATM10 (1.21.1 / NeoForge)", + "main": "./out/main/index.js", + "author": "OFLauncher", + "license": "MIT", + "scripts": { + "dev": "electron-vite dev", + "build": "electron-vite build", + "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false", + "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false", + "typecheck": "npm run typecheck:node && npm run typecheck:web", + "start": "electron-vite preview", + "build:win": "npm run build && electron-builder --win --config electron-builder.yml", + "build:linux": "npm run build && electron-builder --linux --config electron-builder.yml", + "publish:win": "npm run build:win && node scripts/publish-gitea.mjs", + "postinstall": "electron-builder install-app-deps" + }, + "dependencies": { + "@xmcl/core": "^2.15.1", + "@xmcl/installer": "^6.1.2", + "electron-updater": "^6.8.9", + "prismarine-auth": "^3.1.1", + "smol-toml": "^1.6.1", + "undici": "^7.2.3" + }, + "devDependencies": { + "@types/node": "^20.17.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "electron": "^33.2.0", + "electron-builder": "^25.1.8", + "electron-vite": "^2.3.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^5.6.3", + "vite": "^5.4.11" + } +} diff --git a/resources/packwiz-installer-bootstrap.jar b/resources/packwiz-installer-bootstrap.jar new file mode 100644 index 0000000000000000000000000000000000000000..84b934cf96bb11e119e99461092aec5b3c149300 GIT binary patch literal 98989 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 pIykbM-MxOn+d)Oy{ '') + throw new Error(`Gitea ${init.method ?? 'GET'} ${path} -> ${res.status} ${body}`) + } + return res.status === 204 ? null : res.json() +} + +/** Récupère la release au tag fixe, ou la crée si absente. */ +async function getOrCreateRelease() { + const res = await fetch(`${API}/repos/${OWNER}/${REPO}/releases/tags/${TAG}`, { + headers: { Authorization: `token ${TOKEN}`, Accept: 'application/json' } + }) + if (res.ok) return res.json() + if (res.status !== 404) { + throw new Error(`Gitea GET release -> ${res.status} ${await res.text()}`) + } + console.log(`Création de la release "${TAG}"…`) + return api(`/repos/${OWNER}/${REPO}/releases`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + tag_name: TAG, + name: 'Dernière version', + body: 'Artefacts d’auto-update du launcher (écrasés à chaque publication).' + }) + }) +} + +async function deleteExistingAssets(releaseId) { + const assets = await api(`/repos/${OWNER}/${REPO}/releases/${releaseId}/assets`) + for (const a of assets) { + console.log(`Suppression de l'ancien asset ${a.name}…`) + await api(`/repos/${OWNER}/${REPO}/releases/${releaseId}/assets/${a.id}`, { + method: 'DELETE' + }) + } +} + +async function uploadAsset(releaseId, name) { + const buf = await readFile(join(DIST, name)) + const form = new FormData() + form.append('attachment', new Blob([buf]), name) + console.log(`Upload de ${name} (${(buf.length / 1e6).toFixed(1)} Mo)…`) + await api( + `/repos/${OWNER}/${REPO}/releases/${releaseId}/assets?name=${encodeURIComponent(name)}`, + { method: 'POST', body: form } + ) +} + +async function main() { + const files = (await readdir(DIST)).filter(isUpdateArtifact) + if (!files.some((f) => f === 'latest.yml')) { + throw new Error('dist/latest.yml introuvable — lance d’abord `npm run build:win`.') + } + console.log(`Publication sur ${OWNER}/${REPO} (tag ${TAG}) : ${files.join(', ')}`) + + const release = await getOrCreateRelease() + await deleteExistingAssets(release.id) + for (const name of files) await uploadAsset(release.id, name) + + console.log('✓ Publication terminée.') +} + +main().catch((e) => { + console.error(e.message) + process.exit(1) +}) diff --git a/src/main/auth.ts b/src/main/auth.ts new file mode 100644 index 0000000..c326c84 --- /dev/null +++ b/src/main/auth.ts @@ -0,0 +1,128 @@ +import { shell } from 'electron' +import { Authflow, Titles, type MicrosoftAuthFlowOptions } from 'prismarine-auth' +import { paths } from './paths' +import { config } from '../shared/config' +import { emit } from './events' +import type { PlayerProfile } from '../shared/ipc' + +/** + * Auth Microsoft via prismarine-auth (chaîne MS -> Xbox Live -> token Minecraft, + * avec cache + refresh automatique dans paths.authCache). + * + * Deux modes selon la config : + * - Azure non configuré (azureClientId = "CHANGE_ME") : flow "sisu" avec le + * title officiel Minecraft. Fonctionne sans app Azure. (On utilise "sisu" et + * pas "live" : le flow "live" fait un appel title-token séparé que Microsoft + * refuse désormais avec un 403 ; "sisu" combine device+title+user en un seul + * appel et passe.) + * - Azure configuré : flow "msal" avec TON clientId (le mode "propre" pour un + * launcher tiers, une fois l'app approuvée pour l'API Minecraft). + * + * Dans les deux cas on utilise le flow "device code" : on ouvre la page de + * vérification Microsoft et on affiche le code à l'utilisateur. + */ + +/** Identifiant de compte local pour le cache (un seul compte par machine ici). */ +const ACCOUNT_KEY = 'player' + +/** Résultat complet du login, conservé en mémoire pour le lancement du jeu. */ +export interface AuthResult { + profile: PlayerProfile + /** Token d'accès Minecraft (à passer à launch). */ + accessToken: string +} + +let current: AuthResult | null = null + +function buildAuthflow(interactive: boolean): Authflow { + const hasAzureApp = !!config.azureClientId && config.azureClientId !== 'CHANGE_ME' + + const options: MicrosoftAuthFlowOptions = hasAzureApp + ? { flow: 'msal', authTitle: config.azureClientId as unknown as Titles, deviceType: 'Win32' } + : { flow: 'sisu', authTitle: Titles.MinecraftJava, deviceType: 'Win32' } + + // codeCallback : appelé par prismarine-auth quand une connexion interactive + // (device code) est nécessaire. + // - Mode interactif : on pousse le code dans l'UI du launcher (+ ouverture + // de la page Microsoft dans le navigateur). + // - Mode silencieux (restauration) : on LÈVE une exception immédiatement. + // Ça coupe le flow AVANT le console.info et AVANT le polling de prismarine, + // donc aucun code ne fuite dans la console au démarrage : on retombe juste + // sur "pas de session" -> écran de login. + const codeCallback = (res: { + user_code: string + verification_uri: string + message: string + }): void => { + if (!interactive) { + throw new Error('interaction-required') + } + emit.authCode({ + userCode: res.user_code, + verificationUri: res.verification_uri, + message: res.message + }) + // Ouvre la page Microsoft dans le navigateur du système. + void shell.openExternal(res.verification_uri) + } + + return new Authflow(ACCOUNT_KEY, paths.authCache, options, codeCallback) +} + +function toProfile(p: { id: string; name: string; skins?: { url: string }[] }): PlayerProfile { + return { + uuid: p.id, + name: p.name, + skinUrl: p.skins?.[0]?.url + } +} + +/** Login interactif (déclenche le device code si pas de session valide en cache). */ +export async function login(): Promise { + const flow = buildAuthflow(true) + const { token, profile } = await flow.getMinecraftJavaToken({ fetchProfile: true }) + current = { profile: toProfile(profile), accessToken: token } + return current.profile +} + +/** + * Tente de restaurer la session depuis le cache SANS interaction. + * Retourne null si aucun token valide/rafraîchissable n'est disponible. + * + * Si le cache est vide, on ne tente même pas (évite de déclencher un device + * code). Sinon, le refresh silencieux est une requête réseau rapide ; on la + * met en course contre un timeout pour ne jamais bloquer si prismarine-auth + * décidait malgré tout de demander une interaction. + */ +export async function restoreSession(): Promise { + try { + const { readdir } = await import('fs/promises') + const cached = await readdir(paths.authCache).catch(() => []) + if (cached.length === 0) return null + + const flow = buildAuthflow(false) + const timeout = new Promise((_, reject) => + setTimeout(() => reject(new Error('restore-timeout')), 20_000) + ) + const { token, profile } = await Promise.race([ + flow.getMinecraftJavaToken({ fetchProfile: true }), + timeout + ]) + current = { profile: toProfile(profile), accessToken: token } + return current.profile + } catch { + return null + } +} + +/** Renvoie la session courante (token + profil) ou null. */ +export function getCurrent(): AuthResult | null { + return current +} + +/** Déconnexion : efface le cache de tokens. */ +export async function logout(): Promise { + current = null + const { rm } = await import('fs/promises') + await rm(paths.authCache, { recursive: true, force: true }) +} diff --git a/src/main/download.ts b/src/main/download.ts new file mode 100644 index 0000000..92a4eb7 --- /dev/null +++ b/src/main/download.ts @@ -0,0 +1,52 @@ +import { createWriteStream } from 'fs' +import { mkdir, rm } from 'fs/promises' +import { dirname } from 'path' +import { Readable, Transform } from 'stream' +import { pipeline } from 'stream/promises' + +/** + * Télécharge une URL vers un fichier, en suivant les redirections (fetch le + * fait par défaut). Appelle onProgress(0..1) si la taille est connue. + * + * La progression est mesurée via un Transform intercalé dans le pipeline (et + * NON via un listener 'data', qui basculerait le stream en mode flowing et + * pourrait perdre des chunks -> archive tronquée). + */ +export async function downloadFile( + url: string, + dest: string, + onProgress?: (fraction: number) => void +): Promise { + const res = await fetch(url, { redirect: 'follow' }) + if (!res.ok || !res.body) { + throw new Error(`Téléchargement échoué (${res.status}) : ${url}`) + } + + await mkdir(dirname(dest), { recursive: true }) + + const total = Number(res.headers.get('content-length') ?? 0) + let received = 0 + + const counter = new Transform({ + transform(chunk: Buffer, _enc, cb): void { + received += chunk.length + if (total > 0 && onProgress) onProgress(Math.min(1, received / total)) + cb(null, chunk) + } + }) + + const body = Readable.fromWeb(res.body as Parameters[0]) + try { + await pipeline(body, counter, createWriteStream(dest)) + } catch (e) { + await rm(dest, { force: true }) + throw e + } +} + +/** Récupère un JSON depuis une URL (manifeste, pack.toml résolu, etc.). */ +export async function fetchText(url: string): Promise { + const res = await fetch(url, { redirect: 'follow' }) + if (!res.ok) throw new Error(`Requête échouée (${res.status}) : ${url}`) + return res.text() +} diff --git a/src/main/events.ts b/src/main/events.ts new file mode 100644 index 0000000..8ee67ea --- /dev/null +++ b/src/main/events.ts @@ -0,0 +1,29 @@ +import { BrowserWindow } from 'electron' +import { + IPC_EVENT, + type ProgressEvent, + type GameLogLine, + type DeviceCodeInfo, + type UpdateStatus +} from '../shared/ipc' + +/** Fenêtre principale, définie au démarrage (src/main/index.ts). */ +let mainWindow: BrowserWindow | null = null + +export function setMainWindow(win: BrowserWindow): void { + mainWindow = win +} + +function send(channel: string, payload: unknown): void { + if (mainWindow && !mainWindow.isDestroyed()) { + mainWindow.webContents.send(channel, payload) + } +} + +export const emit = { + progress: (e: ProgressEvent): void => send(IPC_EVENT.progress, e), + gameLog: (l: GameLogLine): void => send(IPC_EVENT.gameLog, l), + gameClosed: (code: number | null): void => send(IPC_EVENT.gameClosed, code), + authCode: (info: DeviceCodeInfo): void => send(IPC_EVENT.authCode, info), + updateStatus: (s: UpdateStatus): void => send(IPC_EVENT.updateStatus, s) +} diff --git a/src/main/index.ts b/src/main/index.ts new file mode 100644 index 0000000..3c4c65f --- /dev/null +++ b/src/main/index.ts @@ -0,0 +1,77 @@ +import { app, shell, BrowserWindow, ipcMain } from 'electron' +import { join } from 'path' +import { setMainWindow } from './events' +import { IPC, type UserSettings } from '../shared/ipc' +import { login, logout, restoreSession, getCurrent } from './auth' +import { play } from './play' +import { getSettings, setSettings } from './settings' +import { paths } from './paths' +import { initUpdater, quitAndInstallUpdate } from './updater' + +function createWindow(): BrowserWindow { + const win = new BrowserWindow({ + width: 980, + height: 640, + minWidth: 820, + minHeight: 540, + show: false, + autoHideMenuBar: true, + title: 'OFLauncher', + backgroundColor: '#0e1116', + webPreferences: { + preload: join(__dirname, '../preload/index.js'), + sandbox: false, + contextIsolation: true, + nodeIntegration: false + } + }) + + win.on('ready-to-show', () => win.show()) + + // Liens externes -> navigateur système. + win.webContents.setWindowOpenHandler(({ url }) => { + void shell.openExternal(url) + return { action: 'deny' } + }) + + // En dev, electron-vite expose l'URL du serveur Vite ; en prod, on charge le HTML buildé. + if (process.env['ELECTRON_RENDERER_URL']) { + void win.loadURL(process.env['ELECTRON_RENDERER_URL']) + } else { + void win.loadFile(join(__dirname, '../renderer/index.html')) + } + + return win +} + +function registerIpc(): void { + ipcMain.handle(IPC.authLogin, () => login()) + ipcMain.handle(IPC.authLogout, () => logout()) + ipcMain.handle(IPC.authGetProfile, async () => { + return getCurrent()?.profile ?? (await restoreSession()) + }) + ipcMain.handle(IPC.play, () => play()) + ipcMain.handle(IPC.settingsGet, () => getSettings()) + ipcMain.handle(IPC.settingsSet, (_e, s: UserSettings) => setSettings(s)) + ipcMain.handle(IPC.appVersion, () => app.getVersion()) + ipcMain.handle(IPC.openInstanceDir, () => shell.openPath(paths.instanceDir)) + ipcMain.handle(IPC.updateInstall, () => quitAndInstallUpdate()) +} + +app.whenReady().then(() => { + registerIpc() + const win = createWindow() + setMainWindow(win) + initUpdater() + + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + const w = createWindow() + setMainWindow(w) + } + }) +}) + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit() +}) diff --git a/src/main/install.ts b/src/main/install.ts new file mode 100644 index 0000000..7f57c5d --- /dev/null +++ b/src/main/install.ts @@ -0,0 +1,98 @@ +import { existsSync } from 'fs' +import { join } from 'path' +import { getVersionList, install, installNeoForged } from '@xmcl/installer' +import { paths } from './paths' +import { emit } from './events' +import { downloadDispatcher, DOWNLOAD_CONCURRENCY, withRetries } from './net' + +/** Options de téléchargement communes : dispatcher tolérant + concurrence bridée. */ +const downloadOptions = { + dispatcher: downloadDispatcher, + assetsDownloadConcurrency: DOWNLOAD_CONCURRENCY, + librariesDownloadConcurrency: DOWNLOAD_CONCURRENCY +} + +/** + * Installe le runtime Minecraft (vanilla 1.21.1) puis NeoForge dans + * paths.gameRoot. Les deux étapes sont idempotentes : si la version est déjà + * présente sur le disque, on ne refait pas le travail. + * + * Retourne l'id de version NeoForge à lancer (ex. "neoforge-21.1.73"). + */ + +/** true si un dossier de version avec son JSON existe déjà. */ +function versionInstalled(id: string): boolean { + return existsSync(join(paths.gameRoot, 'versions', id, `${id}.json`)) +} + +/** Installe Minecraft vanilla (json + jar + assets + libraries). */ +export async function installMinecraft(version: string): Promise { + if (versionInstalled(version)) return + + emit.progress({ phase: 'minecraft', message: `Minecraft ${version} : métadonnées…`, progress: undefined }) + const list = await getVersionList() + const meta = list.versions.find((v) => v.id === version) + if (!meta) throw new Error(`Version Minecraft introuvable : ${version}`) + + emit.progress({ + phase: 'minecraft', + message: `Installation de Minecraft ${version} (assets + libs)…`, + progress: undefined + }) + + // ~3700 assets : on réessaie l'install entière plusieurs fois. Chaque passe + // ignore les fichiers déjà valides et ne reprend que les manquants. + await withRetries( + () => install(meta, paths.gameRoot, downloadOptions), + 5, + (attempt) => + emit.progress({ + phase: 'minecraft', + message: `Reprise des téléchargements (tentative ${attempt + 1})…`, + progress: undefined + }) + ) +} + +/** + * Installe NeoForge par-dessus Minecraft . + * Nécessite un Java (les "processors" de l'installeur tournent en Java). + */ +export async function installNeoForge( + neoforge: string, + minecraft: string, + javaPath: string +): Promise { + // @xmcl nomme la version installée "neoforge-" (ex. neoforge-21.1.224). + // Si elle est déjà présente, on saute l'install (idempotent, comme Minecraft). + const expectedId = `neoforge-${neoforge}` + if (versionInstalled(expectedId)) { + void minecraft + return expectedId + } + + emit.progress({ phase: 'neoforge', message: `Installation de NeoForge ${neoforge}…`, progress: undefined }) + + // installNeoForged retourne l'id de version installée à lancer. + const versionId = await withRetries( + () => + installNeoForged('neoforge', neoforge, paths.gameRoot, { + java: javaPath, + dispatcher: downloadDispatcher, + librariesDownloadConcurrency: DOWNLOAD_CONCURRENCY + }), + 3, + (attempt) => + emit.progress({ + phase: 'neoforge', + message: `Reprise de l'installation NeoForge (tentative ${attempt + 1})…`, + progress: undefined + }) + ) + + if (!versionInstalled(versionId)) { + throw new Error(`NeoForge installé mais version "${versionId}" introuvable sur le disque.`) + } + void minecraft // (info de contexte ; la version NeoForge hérite déjà de Minecraft) + return versionId +} diff --git a/src/main/java.ts b/src/main/java.ts new file mode 100644 index 0000000..6012b39 --- /dev/null +++ b/src/main/java.ts @@ -0,0 +1,209 @@ +import { spawn } from 'child_process' +import { join, basename } from 'path' +import { existsSync } from 'fs' +import { readdir, mkdir, rm, writeFile, readFile } from 'fs/promises' +import { paths } from './paths' +import { downloadFile } from './download' +import { emit } from './events' + +/** + * Fournit un binaire Java 21+ (requis par ATM10 / NeoForge 1.21.1). + * + * Stratégie, du moins coûteux au plus coûteux : + * 1. Java déjà mémorisé dans java/managed.json (provisionné ou détecté avant). + * 2. Java >= 21 déjà présent sur la machine (JAVA_HOME, puis PATH). + * 3. Sinon : téléchargement d'un JRE Temurin (Adoptium) — archive autonome, + * extraite avec l'outil système (`tar` sur Linux/mac, `Expand-Archive` + * PowerShell sur Windows). + * + * Le chemin retenu est mémorisé pour les lancements suivants. + */ + +const JAVA_MAJOR = 21 +const MARKER = (): string => join(paths.javaDir, 'managed.json') + +/** Exécute ` -version` et renvoie la version majeure (ex. 21), ou null. */ +async function javaMajorVersion(javaPath: string): Promise { + return new Promise((resolve) => { + let out = '' + const child = spawn(javaPath, ['-version']) + child.stdout?.on('data', (d: Buffer) => (out += d.toString())) + child.stderr?.on('data', (d: Buffer) => (out += d.toString())) + child.on('error', () => resolve(null)) + child.on('close', () => { + // ex: 'openjdk version "21.0.2"' ou '... "1.8.0_xyz"' + const m = out.match(/version "(\d+)(?:\.(\d+))?/) + if (!m) return resolve(null) + let major = parseInt(m[1], 10) + if (major === 1 && m[2]) major = parseInt(m[2], 10) // 1.8 -> 8 + resolve(Number.isNaN(major) ? null : major) + }) + }) +} + +/** Résout un exécutable via `where` (Windows) / `which` (unix). */ +async function resolveOnPath(bin: string): Promise { + const cmd = process.platform === 'win32' ? 'where' : 'which' + return new Promise((resolve) => { + let out = '' + const child = spawn(cmd, [bin]) + child.stdout?.on('data', (d: Buffer) => (out += d.toString())) + child.on('error', () => resolve(null)) + child.on('close', (code) => { + if (code !== 0) return resolve(null) + const first = out.split(/\r?\n/).map((l) => l.trim()).find(Boolean) + resolve(first ?? null) + }) + }) +} + +/** + * Cherche un Java >= JAVA_MAJOR déjà installé sur la machine. + * Retourne le chemin du binaire ou null. + */ +async function findSystemJava(): Promise { + const javaBin = detectPlatform().javaBin + const candidates: string[] = [] + + if (process.env.JAVA_HOME) { + candidates.push(join(process.env.JAVA_HOME, 'bin', javaBin)) + } + const onPath = await resolveOnPath(javaBin) + if (onPath) candidates.push(onPath) + + for (const c of candidates) { + if (!existsSync(c)) continue + const major = await javaMajorVersion(c) + if (major !== null && major >= JAVA_MAJOR) return c + } + return null +} + +interface Platform { + os: 'windows' | 'linux' | 'mac' + arch: 'x64' | 'aarch64' + archiveExt: 'zip' | 'tar.gz' + javaBin: string +} + +function detectPlatform(): Platform { + const os = + process.platform === 'win32' ? 'windows' : process.platform === 'darwin' ? 'mac' : 'linux' + const arch = process.arch === 'arm64' ? 'aarch64' : 'x64' + return { + os, + arch, + archiveExt: os === 'windows' ? 'zip' : 'tar.gz', + javaBin: os === 'windows' ? 'java.exe' : 'java' + } +} + +/** Cherche récursivement bin/ sous un dossier extrait. */ +async function findJavaBinary(root: string, javaBin: string): Promise { + const stack = [root] + while (stack.length) { + const dir = stack.pop()! + const entries = await readdir(dir, { withFileTypes: true }).catch(() => []) + for (const e of entries) { + const full = join(dir, e.name) + if (e.isDirectory()) { + stack.push(full) + } else if (e.name === javaBin && basename(dir) === 'bin') { + return full + } + } + } + return null +} + +async function extractArchive(archive: string, destDir: string, ext: string): Promise { + await mkdir(destDir, { recursive: true }) + await new Promise((resolve, reject) => { + const child = + ext === 'zip' + ? spawn( + 'powershell', + [ + '-NoProfile', + '-Command', + `Expand-Archive -Path "${archive}" -DestinationPath "${destDir}" -Force` + ], + { stdio: 'ignore' } + ) + : spawn('tar', ['-xzf', archive, '-C', destDir], { stdio: 'ignore' }) + child.on('error', reject) + child.on('close', (code) => + code === 0 ? resolve() : reject(new Error(`Extraction échouée (code ${code})`)) + ) + }) +} + +/** + * Retourne le chemin du binaire java géré, en l'installant si nécessaire. + * Idempotent : si déjà installé, retourne immédiatement le chemin mémorisé. + */ +export async function ensureJava(): Promise { + // 1) Déjà mémorisé (provisionné OU détecté lors d'un lancement précédent) ? + if (existsSync(MARKER())) { + try { + const { javaPath } = JSON.parse(await readFile(MARKER(), 'utf-8')) as { javaPath: string } + if (javaPath && existsSync(javaPath)) return javaPath + } catch { + /* marqueur corrompu : on réinstalle */ + } + } + + // 2) Java >= 21 déjà présent sur la machine ? On l'utilise tel quel. + emit.progress({ phase: 'java', message: 'Recherche de Java sur la machine…', progress: undefined }) + const system = await findSystemJava() + if (system) { + await rememberJava(system, 'system') + emit.progress({ phase: 'java', message: 'Java 21 détecté sur la machine.', progress: 1 }) + return system + } + + // 3) Sinon : on télécharge un JRE Temurin 21. + const plat = detectPlatform() + emit.progress({ phase: 'java', message: `Téléchargement de Java ${JAVA_MAJOR} (Temurin)…`, progress: 0 }) + + const url = + `https://api.adoptium.net/v3/binary/latest/${JAVA_MAJOR}/ga/` + + `${plat.os}/${plat.arch}/jre/hotspot/normal/eclipse` + + const installRoot = join(paths.javaDir, `temurin-${JAVA_MAJOR}`) + await rm(installRoot, { recursive: true, force: true }) + const archive = join(paths.javaDir, `temurin-${JAVA_MAJOR}.${plat.archiveExt}`) + + await downloadFile(url, archive, (f) => + emit.progress({ phase: 'java', message: `Téléchargement de Java ${JAVA_MAJOR}…`, progress: f }) + ) + + emit.progress({ phase: 'java', message: 'Extraction de Java…', progress: undefined }) + await extractArchive(archive, installRoot, plat.archiveExt) + await rm(archive, { force: true }) + + const javaPath = await findJavaBinary(installRoot, plat.javaBin) + if (!javaPath) { + const listing = await readdir(installRoot).catch(() => [] as string[]) + throw new Error( + `Binaire java introuvable après extraction. Contenu de ${installRoot} : ` + + (listing.length ? listing.join(', ') : '(vide)') + ) + } + + // Vérifie que le java extrait fonctionne et est bien >= 21. + const major = await javaMajorVersion(javaPath) + if (major === null || major < JAVA_MAJOR) { + throw new Error(`Java extrait inutilisable (version détectée : ${major ?? 'inconnue'}).`) + } + + await rememberJava(javaPath, 'temurin') + emit.progress({ phase: 'java', message: 'Java prêt.', progress: 1 }) + return javaPath +} + +/** Mémorise le chemin du java retenu pour les prochains lancements. */ +async function rememberJava(javaPath: string, source: 'system' | 'temurin'): Promise { + await mkdir(paths.javaDir, { recursive: true }) + await writeFile(MARKER(), JSON.stringify({ javaPath, source, min: JAVA_MAJOR }, null, 2)) +} diff --git a/src/main/launch.ts b/src/main/launch.ts new file mode 100644 index 0000000..0d523b1 --- /dev/null +++ b/src/main/launch.ts @@ -0,0 +1,59 @@ +import type { ChildProcess } from 'child_process' +import { launch } from '@xmcl/core' +import { paths } from './paths' +import { config } from '../shared/config' +import { emit } from './events' +import type { UserSettings } from '../shared/ipc' +import type { AuthResult } from './auth' + +/** + * Lance Minecraft (version NeoForge installée) en process enfant. + * + * Séparation runtime / instance : + * - resourcePath = paths.gameRoot -> versions/, libraries/, assets/ (jamais touché par packwiz) + * - gamePath = paths.instanceDir -> mods/, config/, saves/ (synchronisé par packwiz) + */ +export async function launchGame( + versionId: string, + auth: AuthResult, + javaPath: string, + settings: UserSettings +): Promise { + emit.progress({ phase: 'launching', message: 'Démarrage de Minecraft…', progress: undefined }) + + const serverArg = parseServer(config.serverAddress) + + const proc = await launch({ + gamePath: paths.instanceDir, + resourcePath: paths.gameRoot, + javaPath, + version: versionId, + minMemory: Math.min(2048, settings.maxMemoryMb), + maxMemory: settings.maxMemoryMb, + gameProfile: { id: auth.profile.uuid, name: auth.profile.name }, + accessToken: auth.accessToken, + // MC moderne attend user_type = "msa" (le typage @xmcl est plus restrictif). + userType: 'msa' as unknown as 'mojang', + extraJVMArgs: settings.extraJvmArgs, + ...(serverArg ? { quickPlayMultiplayer: serverArg } : {}) + }) + + // Streame les logs du jeu vers la console du renderer. + proc.stdout?.on('data', (b: Buffer) => + emit.gameLog({ stream: 'stdout', line: b.toString() }) + ) + proc.stderr?.on('data', (b: Buffer) => + emit.gameLog({ stream: 'stderr', line: b.toString() }) + ) + + proc.on('spawn', () => emit.progress({ phase: 'running', message: 'En jeu.', progress: 1 })) + proc.on('close', (code) => emit.gameClosed(code)) + + return proc +} + +/** "host:port" ou "host" -> chaîne quickPlayMultiplayer ; undefined si vide. */ +function parseServer(addr?: string): string | undefined { + if (!addr || !addr.trim()) return undefined + return addr.trim() +} diff --git a/src/main/modpack.ts b/src/main/modpack.ts new file mode 100644 index 0000000..0e5b5a6 --- /dev/null +++ b/src/main/modpack.ts @@ -0,0 +1,103 @@ +import { spawn } from 'child_process' +import { parse as parseToml } from 'smol-toml' +import { paths } from './paths' +import { config } from '../shared/config' +import { fetchText } from './download' +import { emit } from './events' + +/** + * Gestion du modpack côté launcher : + * - lecture du pack.toml packwiz distant (versions MC/NeoForge = source de vérité) + * - sync incrémentale des mods/configs via packwiz-installer-bootstrap. + * + * packwiz-installer garde un manifeste local (packwiz.json dans l'instance) et + * ne re-télécharge QUE les fichiers dont le hash a changé — c'est exactement le + * comportement "pas de re-download complet à chaque update" recherché. + */ + +export interface PackMeta { + name: string + version: string + minecraft: string + neoforge: string +} + +/** Télécharge et parse le pack.toml distant. */ +export async function fetchPackMeta(): Promise { + emit.progress({ phase: 'pack-meta', message: 'Lecture du modpack…', progress: undefined }) + + if (!config.packTomlUrl || config.packTomlUrl.includes('CHANGE_ME')) { + throw new Error( + 'URL du pack.toml non configurée. Renseigne packTomlUrl dans src/shared/config.ts.' + ) + } + + const raw = await fetchText(config.packTomlUrl) + const data = parseToml(raw) as { + name?: string + version?: string + versions?: { minecraft?: string; neoforge?: string } + } + + const minecraft = data.versions?.minecraft + const neoforge = data.versions?.neoforge + if (!minecraft || !neoforge) { + throw new Error( + 'pack.toml invalide : [versions] doit contenir "minecraft" et "neoforge".' + ) + } + + return { + name: data.name ?? 'Modpack', + version: data.version ?? '0', + minecraft, + neoforge + } +} + +/** + * Lance packwiz-installer-bootstrap pour synchroniser l'instance. + * `java` = chemin du binaire Java 21 géré (réutilisé pour faire tourner le jar). + */ +export async function syncModpack(javaPath: string): Promise { + emit.progress({ phase: 'modpack', message: 'Synchronisation du modpack…', progress: undefined }) + + await new Promise((resolve, reject) => { + const child = spawn( + javaPath, + ['-jar', paths.packwizBootstrapJar, '-g', '-s', 'client', config.packTomlUrl], + { cwd: paths.instanceDir } + ) + + // On garde les dernières lignes de sortie pour pouvoir afficher la VRAIE + // erreur de packwiz si le process échoue. + const recent: string[] = [] + const onLine = (buf: Buffer): void => { + for (const line of buf.toString().split(/\r?\n/)) { + const text = line.trim() + if (!text) continue + recent.push(text) + if (recent.length > 25) recent.shift() + emit.progress({ phase: 'modpack', message: text, progress: undefined }) + // Visible aussi dans la console du launcher. + emit.gameLog({ stream: 'stdout', line: `[packwiz] ${text}` }) + } + } + child.stdout.on('data', onLine) + child.stderr.on('data', onLine) + + child.on('error', reject) + child.on('close', (code) => { + if (code === 0) return resolve() + const tail = recent.slice(-12).join('\n') + reject( + new Error( + `packwiz-installer a échoué (code ${code}).` + + (tail ? `\nDernières lignes :\n${tail}` : '') + ) + ) + }) + }) + + emit.progress({ phase: 'modpack', message: 'Modpack à jour.', progress: 1 }) +} diff --git a/src/main/net.ts b/src/main/net.ts new file mode 100644 index 0000000..f3d7db7 --- /dev/null +++ b/src/main/net.ts @@ -0,0 +1,57 @@ +import { Agent, interceptors, type Dispatcher } from 'undici' + +/** + * Dispatcher undici partagé pour TOUS les téléchargements d'install (@xmcl). + * + * Pourquoi : l'install de Minecraft 1.21 récupère ~3700 petits fichiers d'assets + * depuis resources.download.minecraft.net. Avec la concurrence par défaut, sur + * une connexion grand public, beaucoup de connexions dépassent le timeout de + * connexion d'undici (10 s) -> UND_ERR_CONNECT_TIMEOUT -> fichiers vides -> + * erreurs de checksum. + * + * On limite donc le nombre de connexions simultanées et on allonge les timeouts. + * + * On compose l'intercepteur `redirect` d'undici : c'est ce que fait le + * dispatcher par défaut de @xmcl. Il suit les redirections (l'installeur NeoForge + * sur maven.neoforged.net redirige vers un CDN) ET remplit `context.history`, + * que @xmcl/file-transfer lit (sans lui, `context` est undefined -> crash + * "Cannot use 'in' operator to search for 'history' in undefined"). + * + * NB : on n'utilise PAS le RetryAgent d'undici. Il refait des requêtes Range qui + * entrent en conflit avec le téléchargement reprenable (par ranges) de + * @xmcl/file-transfer -> "content-range mismatch" + jars corrompus. Les reprises + * sont gérées au niveau au-dessus par withRetries(), qui relance l'install (les + * fichiers déjà valides sont ignorés). + */ +export const downloadDispatcher: Dispatcher = new Agent({ + connections: 16, // sockets simultanés par origine (bride la concurrence réelle) + connect: { timeout: 60_000 }, // timeout de connexion (la cause du UND_ERR_CONNECT_TIMEOUT) + headersTimeout: 60_000, + bodyTimeout: 120_000 +}).compose(interceptors.redirect({ maxRedirections: 5 })) + +/** Concurrence de téléchargement des assets/libraries (volontairement modérée). */ +export const DOWNLOAD_CONCURRENCY = 16 + +/** + * Réessaie une opération asynchrone. Pour les installs @xmcl, un nouvel appel + * reprend là où ça s'est arrêté : les fichiers déjà valides sont ignorés, seuls + * les manquants/invalides sont re-téléchargés. Donc quelques passes suffisent à + * absorber les pertes réseau sur les milliers de petits assets. + */ +export async function withRetries( + fn: () => Promise, + attempts: number, + onRetry?: (attempt: number, err: unknown) => void +): Promise { + let lastErr: unknown + for (let i = 1; i <= attempts; i++) { + try { + return await fn() + } catch (err) { + lastErr = err + if (i < attempts) onRetry?.(i, err) + } + } + throw lastErr +} diff --git a/src/main/paths.ts b/src/main/paths.ts new file mode 100644 index 0000000..9e1f276 --- /dev/null +++ b/src/main/paths.ts @@ -0,0 +1,60 @@ +import { app } from 'electron' +import { join } from 'path' +import { mkdirSync } from 'fs' + +/** + * Arborescence des données du launcher, rangée sous le userData d'Electron : + * Windows : %APPDATA%/OFLauncher + * Linux : ~/.config/OFLauncher + * + * On garde le runtime (MC/NeoForge/assets/libs/java) séparé de l'instance de + * jeu (mods/config/saves) pour que la sync packwiz ne touche jamais au runtime. + */ +class LauncherPaths { + /** Racine : userData d'Electron. */ + get root(): string { + return app.getPath('userData') + } + + /** Dossier "Minecraft" géré par @xmcl : versions/, libraries/, assets/. */ + get gameRoot(): string { + return this.ensure(join(this.root, 'minecraft')) + } + + /** Dossier d'instance du modpack : mods/, config/, saves/ (cible packwiz). */ + get instanceDir(): string { + return this.ensure(join(this.root, 'instance')) + } + + /** Runtimes Java téléchargés (un sous-dossier par composant Mojang). */ + get javaDir(): string { + return this.ensure(join(this.root, 'java')) + } + + /** Cache des tokens d'auth (prismarine-auth). */ + get authCache(): string { + return this.ensure(join(this.root, 'auth-cache')) + } + + /** Fichier de réglages utilisateur. */ + get settingsFile(): string { + return join(this.root, 'settings.json') + } + + /** jar packwiz-installer-bootstrap embarqué dans les resources. */ + get packwizBootstrapJar(): string { + // En prod, electron-builder copie resources/ via extraResources. + // En dev, on lit directement le dossier resources/ du repo. + const base = app.isPackaged + ? join(process.resourcesPath, 'resources') + : join(app.getAppPath(), 'resources') + return join(base, 'packwiz-installer-bootstrap.jar') + } + + private ensure(dir: string): string { + mkdirSync(dir, { recursive: true }) + return dir + } +} + +export const paths = new LauncherPaths() diff --git a/src/main/play.ts b/src/main/play.ts new file mode 100644 index 0000000..4b26fe2 --- /dev/null +++ b/src/main/play.ts @@ -0,0 +1,50 @@ +import type { ChildProcess } from 'child_process' +import { getCurrent } from './auth' +import { fetchPackMeta } from './modpack' +import { ensureJava } from './java' +import { installMinecraft, installNeoForge } from './install' +import { syncModpack } from './modpack' +import { launchGame } from './launch' +import { getSettings } from './settings' +import { emit } from './events' + +/** Process de jeu courant (un seul à la fois). */ +let gameProcess: ChildProcess | null = null + +/** + * Séquence complète "Jouer" : + * auth (déjà fait) -> pack.toml -> Java 21 -> Minecraft -> NeoForge -> + * sync modpack (delta) -> lancement. + * + * Chaque étape émet sa progression vers le renderer. Les étapes d'install sont + * idempotentes, donc à partir du 2e lancement seules les nouveautés du modpack + * sont téléchargées. + */ +export async function play(): Promise { + if (gameProcess) { + throw new Error('Le jeu est déjà en cours.') + } + + const auth = getCurrent() + if (!auth) { + throw new Error('Non connecté. Connecte-toi avec ton compte Microsoft d’abord.') + } + + try { + const meta = await fetchPackMeta() + const javaPath = await ensureJava() + await installMinecraft(meta.minecraft) + const versionId = await installNeoForge(meta.neoforge, meta.minecraft, javaPath) + await syncModpack(javaPath) + + const settings = await getSettings() + const proc = await launchGame(versionId, auth, javaPath, settings) + gameProcess = proc + proc.on('close', () => { + gameProcess = null + }) + } catch (e) { + emit.progress({ phase: 'error', message: (e as Error).message, progress: undefined }) + throw e + } +} diff --git a/src/main/settings.ts b/src/main/settings.ts new file mode 100644 index 0000000..cc1ada2 --- /dev/null +++ b/src/main/settings.ts @@ -0,0 +1,23 @@ +import { readFile, writeFile } from 'fs/promises' +import { paths } from './paths' +import { DEFAULT_SETTINGS, type UserSettings } from '../shared/ipc' + +/** Lecture des réglages persistés (fusionnés avec les valeurs par défaut). */ +export async function getSettings(): Promise { + try { + const raw = await readFile(paths.settingsFile, 'utf-8') + return { ...DEFAULT_SETTINGS, ...(JSON.parse(raw) as Partial) } + } catch { + return { ...DEFAULT_SETTINGS } + } +} + +/** Écriture des réglages (validés/clampés). */ +export async function setSettings(next: UserSettings): Promise { + const clean: UserSettings = { + maxMemoryMb: Math.max(2048, Math.min(32768, Math.round(next.maxMemoryMb || DEFAULT_SETTINGS.maxMemoryMb))), + extraJvmArgs: Array.isArray(next.extraJvmArgs) ? next.extraJvmArgs : [] + } + await writeFile(paths.settingsFile, JSON.stringify(clean, null, 2)) + return clean +} diff --git a/src/main/updater.ts b/src/main/updater.ts new file mode 100644 index 0000000..da656a6 --- /dev/null +++ b/src/main/updater.ts @@ -0,0 +1,59 @@ +import { app } from 'electron' +import electronUpdater, { type UpdateInfo, type ProgressInfo } from 'electron-updater' +import { emit } from './events' + +/** + * Auto-update du launcher via electron-updater (provider "generic" pointant sur + * une release Gitea à tag fixe, voir electron-builder.yml). + * + * UX : check au démarrage -> téléchargement en fond -> on relaie l'état vers le + * renderer (bandeau). L'install effective se fait quand l'utilisateur clique + * "Redémarrer pour installer" (quitAndInstallUpdate), ou à la fermeture. + */ + +// electron-updater est CommonJS : on récupère autoUpdater via le default export. +const { autoUpdater } = electronUpdater + +/** Re-check périodique (6 h) tant que le launcher reste ouvert. */ +const RECHECK_INTERVAL_MS = 6 * 60 * 60 * 1000 + +export function initUpdater(): void { + // L'updater ne fonctionne que sur une app packagée (sauf dev-app-update.yml). + if (!app.isPackaged) { + console.info('[updater] dev non packagé : auto-update désactivé.') + return + } + + // On gère l'install manuellement (bouton "Redémarrer"), mais on installe + // quand même à la fermeture si la maj a été téléchargée. + autoUpdater.autoDownload = true + autoUpdater.autoInstallOnAppQuit = true + + autoUpdater.on('checking-for-update', () => { + emit.updateStatus({ state: 'checking' }) + }) + autoUpdater.on('update-available', (info: UpdateInfo) => { + emit.updateStatus({ state: 'available', version: info.version }) + }) + autoUpdater.on('update-not-available', () => { + emit.updateStatus({ state: 'none' }) + }) + autoUpdater.on('download-progress', (p: ProgressInfo) => { + emit.updateStatus({ state: 'downloading', progress: p.percent / 100 }) + }) + autoUpdater.on('update-downloaded', (info: UpdateInfo) => { + emit.updateStatus({ state: 'downloaded', version: info.version }) + }) + autoUpdater.on('error', (err: Error) => { + console.error('[updater]', err) + emit.updateStatus({ state: 'error', message: err.message }) + }) + + void autoUpdater.checkForUpdates() + setInterval(() => void autoUpdater.checkForUpdates(), RECHECK_INTERVAL_MS) +} + +/** Quitte et installe la mise à jour téléchargée (appelé par le bouton UI). */ +export function quitAndInstallUpdate(): void { + autoUpdater.quitAndInstall() +} diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts new file mode 100644 index 0000000..d80400f --- /dev/null +++ b/src/preload/index.d.ts @@ -0,0 +1,9 @@ +import type { LauncherApi } from './index' + +declare global { + interface Window { + api: LauncherApi + } +} + +export {} diff --git a/src/preload/index.ts b/src/preload/index.ts new file mode 100644 index 0000000..b6f2bea --- /dev/null +++ b/src/preload/index.ts @@ -0,0 +1,65 @@ +import { contextBridge, ipcRenderer } from 'electron' +import { + IPC, + IPC_EVENT, + type PlayerProfile, + type ProgressEvent, + type GameLogLine, + type UserSettings, + type DeviceCodeInfo, + type UpdateStatus +} from '../shared/ipc' + +/** API typée exposée au renderer via window.api. */ +const api = { + // --- Auth --- + login: (): Promise => ipcRenderer.invoke(IPC.authLogin), + logout: (): Promise => ipcRenderer.invoke(IPC.authLogout), + getProfile: (): Promise => ipcRenderer.invoke(IPC.authGetProfile), + + // --- Jouer (install + sync + launch) --- + play: (): Promise => ipcRenderer.invoke(IPC.play), + + // --- Réglages --- + getSettings: (): Promise => ipcRenderer.invoke(IPC.settingsGet), + setSettings: (s: UserSettings): Promise => ipcRenderer.invoke(IPC.settingsSet, s), + + getAppVersion: (): Promise => ipcRenderer.invoke(IPC.appVersion), + + /** Ouvre le dossier d'instance (mods/config/saves) dans l'explorateur. */ + openInstanceDir: (): Promise => ipcRenderer.invoke(IPC.openInstanceDir), + + /** Quitte et installe la mise à jour téléchargée. */ + installUpdate: (): Promise => ipcRenderer.invoke(IPC.updateInstall), + + // --- Abonnements aux événements (retournent une fonction de désabonnement) --- + onProgress: (cb: (e: ProgressEvent) => void): (() => void) => { + const handler = (_: unknown, e: ProgressEvent): void => cb(e) + ipcRenderer.on(IPC_EVENT.progress, handler) + return () => ipcRenderer.removeListener(IPC_EVENT.progress, handler) + }, + onGameLog: (cb: (l: GameLogLine) => void): (() => void) => { + const handler = (_: unknown, l: GameLogLine): void => cb(l) + ipcRenderer.on(IPC_EVENT.gameLog, handler) + return () => ipcRenderer.removeListener(IPC_EVENT.gameLog, handler) + }, + onGameClosed: (cb: (code: number | null) => void): (() => void) => { + const handler = (_: unknown, code: number | null): void => cb(code) + ipcRenderer.on(IPC_EVENT.gameClosed, handler) + return () => ipcRenderer.removeListener(IPC_EVENT.gameClosed, handler) + }, + onAuthCode: (cb: (info: DeviceCodeInfo) => void): (() => void) => { + const handler = (_: unknown, info: DeviceCodeInfo): void => cb(info) + ipcRenderer.on(IPC_EVENT.authCode, handler) + return () => ipcRenderer.removeListener(IPC_EVENT.authCode, handler) + }, + onUpdateStatus: (cb: (s: UpdateStatus) => void): (() => void) => { + const handler = (_: unknown, s: UpdateStatus): void => cb(s) + ipcRenderer.on(IPC_EVENT.updateStatus, handler) + return () => ipcRenderer.removeListener(IPC_EVENT.updateStatus, handler) + } +} + +export type LauncherApi = typeof api + +contextBridge.exposeInMainWorld('api', api) diff --git a/src/renderer/index.html b/src/renderer/index.html new file mode 100644 index 0000000..d9bc8aa --- /dev/null +++ b/src/renderer/index.html @@ -0,0 +1,16 @@ + + + + + + + OFLauncher + + +

+ + + diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx new file mode 100644 index 0000000..ba24f80 --- /dev/null +++ b/src/renderer/src/App.tsx @@ -0,0 +1,236 @@ +import { useEffect, useRef, useState } from 'react' +import type { + PlayerProfile, + ProgressEvent, + GameLogLine, + DeviceCodeInfo, + UpdateStatus +} from '../../shared/ipc' + +type Status = 'loading' | 'logged-out' | 'logged-in' | 'working' | 'running' + +export default function App(): JSX.Element { + const [status, setStatus] = useState('loading') + const [profile, setProfile] = useState(null) + const [progress, setProgress] = useState(null) + const [logs, setLogs] = useState([]) + const [error, setError] = useState(null) + const [authCode, setAuthCode] = useState(null) + const [maxMemoryMb, setMaxMemoryMb] = useState(8192) + const [appVersion, setAppVersion] = useState('') + const [update, setUpdate] = useState(null) + const consoleRef = useRef(null) + + // Restaure la session + réglages au démarrage. + useEffect(() => { + ;(async () => { + const [p, s, v] = await Promise.all([ + window.api.getProfile(), + window.api.getSettings(), + window.api.getAppVersion() + ]) + setMaxMemoryMb(s.maxMemoryMb) + setAppVersion(v) + setProfile(p) + setStatus(p ? 'logged-in' : 'logged-out') + })() + }, []) + + // Abonnements aux événements main -> renderer. + useEffect(() => { + const offProgress = window.api.onProgress((e) => { + setProgress(e) + if (e.phase === 'running') setStatus('running') + if (e.phase === 'error') { + setError(e.message) + setStatus(profile ? 'logged-in' : 'logged-out') + } + }) + const offLog = window.api.onGameLog((l) => + setLogs((prev) => [...prev.slice(-800), l]) + ) + const offClosed = window.api.onGameClosed((code) => { + setStatus('logged-in') + setProgress(null) + setLogs((prev) => [ + ...prev, + { stream: 'stdout', line: `\n— Jeu fermé (code ${code ?? '?'}) —` } + ]) + }) + const offAuthCode = window.api.onAuthCode((info) => setAuthCode(info)) + const offUpdate = window.api.onUpdateStatus((s) => setUpdate(s)) + return () => { + offProgress() + offLog() + offClosed() + offAuthCode() + offUpdate() + } + }, [profile]) + + // Auto-scroll de la console. + useEffect(() => { + consoleRef.current?.scrollTo(0, consoleRef.current.scrollHeight) + }, [logs]) + + async function handleLogin(): Promise { + setError(null) + setAuthCode(null) + try { + const p = await window.api.login() + setProfile(p) + setStatus('logged-in') + } catch (e) { + setError(`Échec de connexion : ${(e as Error).message}`) + } finally { + setAuthCode(null) + } + } + + async function handleLogout(): Promise { + await window.api.logout() + setProfile(null) + setStatus('logged-out') + } + + function handleOpenInstance(): void { + void window.api.openInstanceDir() + } + + async function handlePlay(): Promise { + setError(null) + setLogs([]) + setStatus('working') + await window.api.setSettings({ maxMemoryMb, extraJvmArgs: [] }) + try { + await window.api.play() + } catch (e) { + setError(`Échec du lancement : ${(e as Error).message}`) + setStatus('logged-in') + } + } + + if (status === 'loading') { + return ( +
+
Chargement…
+
+ ) + } + + if (status === 'logged-out') { + return ( +
+
+

OFLauncher

+

Connecte-toi avec ton compte Microsoft pour jouer.

+ + {authCode && ( +
+

+ Va sur{' '} + + {authCode.verificationUri} + {' '} + et entre le code : +

+
{authCode.userCode}
+

+ La page s’est ouverte dans ton navigateur. Reviens ici une fois connecté. +

+
+ )} + {error &&
{error}
} +
+ v{appVersion} +
+
+
+ ) + } + + const busy = status === 'working' || status === 'running' + const pct = progress?.progress + const indeterminate = busy && (pct === undefined || pct === null) + + const updateBanner = + update?.state === 'downloading' ? ( +
+ + Téléchargement de la mise à jour + {update.version ? ` ${update.version}` : ''}…{' '} + {update.progress != null ? `${Math.round(update.progress * 100)} %` : ''} + +
+ ) : update?.state === 'downloaded' ? ( +
+ Mise à jour {update.version ?? ''} prête. + +
+ ) : null + + return ( +
+
+
+ OFLauncher + All The Mods 10 · 1.21.1 +
+
+ + {profile?.name} + +
+
+ + {updateBanner} + +
+
+ {logs.map((l, i) => ( +
+ {l.line} +
+ ))} +
+ +
+
+
{busy ? progress?.message ?? 'Préparation…' : ''}
+
+
+
+
+ +
+ RAM + setMaxMemoryMb(Number(e.target.value))} + /> + Mo + +
+ + +
+ {error &&
{error}
} +
+
+ ) +} diff --git a/src/renderer/src/index.css b/src/renderer/src/index.css new file mode 100644 index 0000000..35832cf --- /dev/null +++ b/src/renderer/src/index.css @@ -0,0 +1,257 @@ +:root { + --bg: #0e1116; + --bg-soft: #161b22; + --border: #283040; + --text: #e6edf3; + --text-dim: #8b97a7; + --accent: #3fb950; + --accent-hover: #46c95a; + --danger: #f85149; + font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--bg); + color: var(--text); + height: 100vh; + overflow: hidden; +} + +#root { + height: 100vh; +} + +.app { + display: flex; + flex-direction: column; + height: 100vh; +} + +.topbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 20px; + border-bottom: 1px solid var(--border); + background: var(--bg-soft); +} + +.brand { + font-weight: 700; + letter-spacing: 0.5px; +} + +.brand .pack { + color: var(--text-dim); + font-weight: 400; + margin-left: 8px; + font-size: 0.85em; +} + +.profile { + display: flex; + align-items: center; + gap: 10px; +} + +.updatebar { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + padding: 8px 20px; + font-size: 0.85em; + background: var(--bg-soft); + border-bottom: 1px solid var(--border); + color: var(--text-dim); +} + +.updatebar.ready { + color: var(--text); + border-bottom-color: var(--accent); +} + +.profile img { + width: 28px; + height: 28px; + border-radius: 4px; + image-rendering: pixelated; +} + +.main { + flex: 1; + display: flex; + flex-direction: column; + padding: 24px; + gap: 16px; + min-height: 0; +} + +.console { + flex: 1; + background: #07090d; + border: 1px solid var(--border); + border-radius: 8px; + padding: 10px 12px; + font-family: 'Cascadia Code', 'Consolas', monospace; + font-size: 12px; + line-height: 1.45; + overflow-y: auto; + white-space: pre-wrap; + word-break: break-word; +} + +.console .stderr { + color: #f0883e; +} + +.console:empty::before { + content: 'La console du jeu s’affichera ici…'; + color: var(--text-dim); +} + +.footer { + display: flex; + align-items: center; + gap: 16px; +} + +.progress { + flex: 1; +} + +.progress .label { + font-size: 13px; + color: var(--text-dim); + margin-bottom: 6px; + min-height: 18px; +} + +.bar { + height: 8px; + background: var(--border); + border-radius: 4px; + overflow: hidden; +} + +.bar > div { + height: 100%; + background: var(--accent); + transition: width 0.2s ease; +} + +.bar.indeterminate > div { + width: 35% !important; + animation: slide 1.1s ease-in-out infinite; +} + +@keyframes slide { + 0% { + margin-left: -35%; + } + 100% { + margin-left: 100%; + } +} + +button.play { + background: var(--accent); + color: #04250c; + border: none; + padding: 14px 34px; + font-size: 16px; + font-weight: 700; + border-radius: 8px; + cursor: pointer; + min-width: 160px; +} + +button.play:hover:not(:disabled) { + background: var(--accent-hover); +} + +button.play:disabled { + opacity: 0.55; + cursor: not-allowed; +} + +.center { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 18px; +} + +.center h1 { + margin: 0; +} + +.muted { + color: var(--text-dim); +} + +.linkbtn { + background: none; + border: 1px solid var(--border); + color: var(--text-dim); + padding: 6px 12px; + border-radius: 6px; + cursor: pointer; + font-size: 12px; +} + +.linkbtn:hover { + color: var(--text); +} + +.settings { + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + color: var(--text-dim); +} + +.settings input { + width: 80px; + background: var(--bg-soft); + border: 1px solid var(--border); + color: var(--text); + border-radius: 4px; + padding: 4px 6px; +} + +.error { + color: var(--danger); + font-size: 13px; +} + +.authcode { + text-align: center; + max-width: 420px; +} + +.authcode a { + color: var(--accent); +} + +.authcode .code { + font-family: 'Cascadia Code', 'Consolas', monospace; + font-size: 28px; + letter-spacing: 4px; + font-weight: 700; + background: var(--bg-soft); + border: 1px solid var(--border); + border-radius: 8px; + padding: 12px 18px; + margin: 10px auto; + display: inline-block; + user-select: all; +} diff --git a/src/renderer/src/main.tsx b/src/renderer/src/main.tsx new file mode 100644 index 0000000..611e848 --- /dev/null +++ b/src/renderer/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + +) diff --git a/src/shared/config.ts b/src/shared/config.ts new file mode 100644 index 0000000..8e6fb7b --- /dev/null +++ b/src/shared/config.ts @@ -0,0 +1,39 @@ +/** + * Configuration statique du launcher. + * + * Ces valeurs sont les seules choses que TOI (l'admin) dois ajuster pour ton + * serveur. Tout le reste (versions MC/NeoForge, liste des mods) vient du + * `pack.toml` packwiz hébergé, donc tu n'as PAS à toucher au code pour mettre + * à jour le modpack. + */ +export interface LauncherConfig { + /** Nom affiché du launcher. */ + appName: string + + /** + * URL publique de ton `pack.toml` packwiz (la source de vérité du modpack). + * Exemple GitHub Pages : https://.github.io/OFModpack/pack.toml + * Exemple GitHub raw : https://raw.githubusercontent.com//OFModpack/main/pack.toml + */ + packTomlUrl: string + + /** + * Client ID de TON application Azure AD (compte personnel / "consumers"). + * Scope requis : XboxLive.signin. Voir README pour l'enregistrement. + * Tant que l'app Azure n'est pas approuvée pour l'API Minecraft, utilise un + * client ID de test connu (ex. celui du launcher officiel) en dev uniquement. + */ + azureClientId: string + + /** Adresse du serveur à pré-remplir dans le bouton "Jouer" (optionnel). */ + serverAddress?: string +} + +export const config: LauncherConfig = { + appName: 'OFLauncher', + // TODO: remplace par l'URL de ton pack.toml une fois l'hébergement choisi. + packTomlUrl: 'https://gitea.ldpt.fr/zertus/OFModpack/raw/branch/main/pack.toml', + // TODO: remplace par le client ID de ton app Azure. + azureClientId: 'CHANGE_ME', + serverAddress: 'mc.ldpt.fr' +} diff --git a/src/shared/ipc.ts b/src/shared/ipc.ts new file mode 100644 index 0000000..c818433 --- /dev/null +++ b/src/shared/ipc.ts @@ -0,0 +1,103 @@ +/** + * Contrats partagés entre le process main et le renderer. + * Tout passe par le bridge `window.api` exposé dans le preload. + */ + +/** Profil du joueur après login Microsoft. */ +export interface PlayerProfile { + uuid: string + name: string + /** URL du skin/tête si disponible. */ + skinUrl?: string +} + +/** Phase courante de la séquence "Jouer". */ +export type LaunchPhase = + | 'idle' + | 'auth' + | 'pack-meta' + | 'java' + | 'minecraft' + | 'neoforge' + | 'modpack' + | 'launching' + | 'running' + | 'done' + | 'error' + +/** Événement de progression envoyé main -> renderer pendant "Jouer". */ +export interface ProgressEvent { + phase: LaunchPhase + /** Libellé lisible à afficher. */ + message: string + /** 0..1 si déterminable, sinon undefined (barre indéterminée). */ + progress?: number +} + +/** Ligne de log du jeu (stdout/stderr) streamée vers la console du renderer. */ +export interface GameLogLine { + stream: 'stdout' | 'stderr' + line: string +} + +/** Infos du flow "device code" Microsoft à présenter à l'utilisateur. */ +export interface DeviceCodeInfo { + userCode: string + verificationUri: string + message: string +} + +/** État de la mise à jour automatique du launcher (electron-updater). */ +export type UpdateState = + | 'checking' + | 'available' + | 'downloading' + | 'downloaded' + | 'none' + | 'error' + +/** Statut d'update envoyé main -> renderer pour piloter le bandeau de maj. */ +export interface UpdateStatus { + state: UpdateState + /** Version distante (ex. "0.2.0") quand connue. */ + version?: string + /** 0..1 pendant le téléchargement. */ + progress?: number + /** Message d'erreur éventuel (state === 'error'). */ + message?: string +} + +/** Réglages utilisateur persistés localement. */ +export interface UserSettings { + /** RAM max allouée à la JVM, en Mo. */ + maxMemoryMb: number + /** Args JVM additionnels (avancé). */ + extraJvmArgs: string[] +} + +export const DEFAULT_SETTINGS: UserSettings = { + maxMemoryMb: 8192, + extraJvmArgs: [] +} + +/** Noms de canaux IPC (invoke renderer -> main). */ +export const IPC = { + authLogin: 'auth:login', + authLogout: 'auth:logout', + authGetProfile: 'auth:getProfile', + play: 'play:start', + settingsGet: 'settings:get', + settingsSet: 'settings:set', + appVersion: 'app:version', + openInstanceDir: 'instance:open', + updateInstall: 'update:install' +} as const + +/** Noms d'événements (send main -> renderer). */ +export const IPC_EVENT = { + progress: 'evt:progress', + gameLog: 'evt:gameLog', + gameClosed: 'evt:gameClosed', + authCode: 'evt:authCode', + updateStatus: 'evt:updateStatus' +} as const diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..155ebaa --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.web.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..36342b8 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "target": "ES2022", + "lib": ["ES2022"], + "types": ["node"], + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./out/types-node" + }, + "include": [ + "src/main/**/*", + "src/preload/**/*", + "src/shared/**/*", + "electron.vite.config.ts" + ] +} diff --git a/tsconfig.web.json b/tsconfig.web.json new file mode 100644 index 0000000..9000c39 --- /dev/null +++ b/tsconfig.web.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "@renderer/*": ["src/renderer/src/*"] + }, + "outDir": "./out/types-web" + }, + "include": [ + "src/renderer/src/**/*", + "src/preload/index.d.ts", + "src/shared/**/*" + ] +}