From ab1435a7b6749265c651607e37e2b296fb184d06 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Thu, 13 Aug 2026 18:44:03 +0530 Subject: [PATCH 1/9] feat: added icons and api --- config.xml | 100 + hooks/post-process.js | 38 + package-lock.json | 5239 +---------------- package.json | 4 +- .../ic_acode_aurora_pulse_background.xml | 39 + .../ic_acode_aurora_pulse_foreground.xml | 20 + .../ic_acode_blueprint_background.xml | 21 + .../ic_acode_blueprint_foreground.xml | 52 + .../ic_acode_midnight_circuit_background.xml | 24 + .../ic_acode_midnight_circuit_foreground.xml | 52 + res/android/drawable/ic_acode_monochrome.xml | 14 + .../ic_acode_pixel_party_background.xml | 21 + .../ic_acode_pixel_party_foreground.xml | 26 + .../ic_acode_solar_flare_background.xml | 21 + .../ic_acode_solar_flare_foreground.xml | 20 + .../ic_acode_terminal_glow_background.xml | 21 + .../ic_acode_terminal_glow_foreground.xml | 52 + .../ic_acode_aurora_pulse.xml | 6 + .../ic_acode_aurora_pulse_round.xml | 6 + .../mipmap-anydpi-v26/ic_acode_blueprint.xml | 6 + .../ic_acode_blueprint_round.xml | 6 + .../ic_acode_midnight_circuit.xml | 6 + .../ic_acode_midnight_circuit_round.xml | 6 + .../ic_acode_pixel_party.xml | 6 + .../ic_acode_pixel_party_round.xml | 6 + .../ic_acode_solar_flare.xml | 6 + .../ic_acode_solar_flare_round.xml | 6 + .../ic_acode_terminal_glow.xml | 6 + .../ic_acode_terminal_glow_round.xml | 6 + .../mipmap-hdpi/ic_acode_aurora_pulse.webp | Bin 0 -> 4732 bytes .../ic_acode_aurora_pulse_round.webp | Bin 0 -> 4970 bytes .../mipmap-hdpi/ic_acode_blueprint.webp | Bin 0 -> 4394 bytes .../mipmap-hdpi/ic_acode_blueprint_round.webp | Bin 0 -> 4590 bytes .../ic_acode_midnight_circuit.webp | Bin 0 -> 2986 bytes .../ic_acode_midnight_circuit_round.webp | Bin 0 -> 3210 bytes .../mipmap-hdpi/ic_acode_pixel_party.webp | Bin 0 -> 3592 bytes .../ic_acode_pixel_party_round.webp | Bin 0 -> 3708 bytes .../mipmap-hdpi/ic_acode_solar_flare.webp | Bin 0 -> 5316 bytes .../ic_acode_solar_flare_round.webp | Bin 0 -> 5202 bytes .../mipmap-hdpi/ic_acode_terminal_glow.webp | Bin 0 -> 2978 bytes .../ic_acode_terminal_glow_round.webp | Bin 0 -> 3206 bytes .../mipmap-mdpi/ic_acode_aurora_pulse.webp | Bin 0 -> 2986 bytes .../ic_acode_aurora_pulse_round.webp | Bin 0 -> 3080 bytes .../mipmap-mdpi/ic_acode_blueprint.webp | Bin 0 -> 2742 bytes .../mipmap-mdpi/ic_acode_blueprint_round.webp | Bin 0 -> 3130 bytes .../ic_acode_midnight_circuit.webp | Bin 0 -> 2106 bytes .../ic_acode_midnight_circuit_round.webp | Bin 0 -> 2162 bytes .../mipmap-mdpi/ic_acode_pixel_party.webp | Bin 0 -> 2446 bytes .../ic_acode_pixel_party_round.webp | Bin 0 -> 2554 bytes .../mipmap-mdpi/ic_acode_solar_flare.webp | Bin 0 -> 3216 bytes .../ic_acode_solar_flare_round.webp | Bin 0 -> 3262 bytes .../mipmap-mdpi/ic_acode_terminal_glow.webp | Bin 0 -> 2068 bytes .../ic_acode_terminal_glow_round.webp | Bin 0 -> 2216 bytes .../mipmap-xhdpi/ic_acode_aurora_pulse.webp | Bin 0 -> 6704 bytes .../ic_acode_aurora_pulse_round.webp | Bin 0 -> 7182 bytes .../mipmap-xhdpi/ic_acode_blueprint.webp | Bin 0 -> 6108 bytes .../ic_acode_blueprint_round.webp | Bin 0 -> 6378 bytes .../ic_acode_midnight_circuit.webp | Bin 0 -> 4042 bytes .../ic_acode_midnight_circuit_round.webp | Bin 0 -> 4304 bytes .../mipmap-xhdpi/ic_acode_pixel_party.webp | Bin 0 -> 4664 bytes .../ic_acode_pixel_party_round.webp | Bin 0 -> 5044 bytes .../mipmap-xhdpi/ic_acode_solar_flare.webp | Bin 0 -> 7678 bytes .../ic_acode_solar_flare_round.webp | Bin 0 -> 7608 bytes .../mipmap-xhdpi/ic_acode_terminal_glow.webp | Bin 0 -> 4058 bytes .../ic_acode_terminal_glow_round.webp | Bin 0 -> 4402 bytes .../mipmap-xxhdpi/ic_acode_aurora_pulse.webp | Bin 0 -> 11232 bytes .../ic_acode_aurora_pulse_round.webp | Bin 0 -> 12100 bytes .../mipmap-xxhdpi/ic_acode_blueprint.webp | Bin 0 -> 9498 bytes .../ic_acode_blueprint_round.webp | Bin 0 -> 10134 bytes .../ic_acode_midnight_circuit.webp | Bin 0 -> 5806 bytes .../ic_acode_midnight_circuit_round.webp | Bin 0 -> 6292 bytes .../mipmap-xxhdpi/ic_acode_pixel_party.webp | Bin 0 -> 6258 bytes .../ic_acode_pixel_party_round.webp | Bin 0 -> 6634 bytes .../mipmap-xxhdpi/ic_acode_solar_flare.webp | Bin 0 -> 12590 bytes .../ic_acode_solar_flare_round.webp | Bin 0 -> 12388 bytes .../mipmap-xxhdpi/ic_acode_terminal_glow.webp | Bin 0 -> 5796 bytes .../ic_acode_terminal_glow_round.webp | Bin 0 -> 6258 bytes .../mipmap-xxxhdpi/ic_acode_aurora_pulse.webp | Bin 0 -> 17164 bytes .../ic_acode_aurora_pulse_round.webp | Bin 0 -> 17026 bytes .../mipmap-xxxhdpi/ic_acode_blueprint.webp | Bin 0 -> 12508 bytes .../ic_acode_blueprint_round.webp | Bin 0 -> 13212 bytes .../ic_acode_midnight_circuit.webp | Bin 0 -> 7670 bytes .../ic_acode_midnight_circuit_round.webp | Bin 0 -> 8332 bytes .../mipmap-xxxhdpi/ic_acode_pixel_party.webp | Bin 0 -> 8334 bytes .../ic_acode_pixel_party_round.webp | Bin 0 -> 8972 bytes .../mipmap-xxxhdpi/ic_acode_solar_flare.webp | Bin 0 -> 18510 bytes .../ic_acode_solar_flare_round.webp | Bin 0 -> 18444 bytes .../ic_acode_terminal_glow.webp | Bin 0 -> 7692 bytes .../ic_acode_terminal_glow_round.webp | Bin 0 -> 8392 bytes .../android/com/foxdebug/system/System.java | 52 + src/plugins/system/system.d.ts | 7 + src/plugins/system/www/plugin.js | 9 + www/icons/ic_acode_aurora_pulse.svg | 37 + www/icons/ic_acode_blueprint.svg | 38 + www/icons/ic_acode_midnight_circuit.svg | 33 + www/icons/ic_acode_pixel_party.svg | 29 + www/icons/ic_acode_solar_flare.svg | 28 + www/icons/ic_acode_terminal_glow.svg | 33 + 98 files changed, 931 insertions(+), 5171 deletions(-) create mode 100644 res/android/drawable/ic_acode_aurora_pulse_background.xml create mode 100644 res/android/drawable/ic_acode_aurora_pulse_foreground.xml create mode 100644 res/android/drawable/ic_acode_blueprint_background.xml create mode 100644 res/android/drawable/ic_acode_blueprint_foreground.xml create mode 100644 res/android/drawable/ic_acode_midnight_circuit_background.xml create mode 100644 res/android/drawable/ic_acode_midnight_circuit_foreground.xml create mode 100644 res/android/drawable/ic_acode_monochrome.xml create mode 100644 res/android/drawable/ic_acode_pixel_party_background.xml create mode 100644 res/android/drawable/ic_acode_pixel_party_foreground.xml create mode 100644 res/android/drawable/ic_acode_solar_flare_background.xml create mode 100644 res/android/drawable/ic_acode_solar_flare_foreground.xml create mode 100644 res/android/drawable/ic_acode_terminal_glow_background.xml create mode 100644 res/android/drawable/ic_acode_terminal_glow_foreground.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse_round.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_blueprint.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_blueprint_round.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit_round.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_pixel_party.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_pixel_party_round.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_solar_flare.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_solar_flare_round.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_terminal_glow.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_terminal_glow_round.xml create mode 100644 res/android/mipmap-hdpi/ic_acode_aurora_pulse.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_aurora_pulse_round.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_blueprint.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_blueprint_round.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_midnight_circuit.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_midnight_circuit_round.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_pixel_party.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_pixel_party_round.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_solar_flare.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_solar_flare_round.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_terminal_glow.webp create mode 100644 res/android/mipmap-hdpi/ic_acode_terminal_glow_round.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_aurora_pulse.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_aurora_pulse_round.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_blueprint.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_blueprint_round.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_midnight_circuit.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_midnight_circuit_round.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_pixel_party.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_pixel_party_round.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_solar_flare.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_solar_flare_round.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_terminal_glow.webp create mode 100644 res/android/mipmap-mdpi/ic_acode_terminal_glow_round.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_aurora_pulse.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_aurora_pulse_round.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_blueprint.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_blueprint_round.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_midnight_circuit.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_midnight_circuit_round.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_pixel_party.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_pixel_party_round.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_solar_flare.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_solar_flare_round.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_terminal_glow.webp create mode 100644 res/android/mipmap-xhdpi/ic_acode_terminal_glow_round.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_aurora_pulse.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_aurora_pulse_round.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_blueprint.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_blueprint_round.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_midnight_circuit.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_midnight_circuit_round.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_pixel_party.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_pixel_party_round.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_solar_flare.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_solar_flare_round.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_terminal_glow.webp create mode 100644 res/android/mipmap-xxhdpi/ic_acode_terminal_glow_round.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse_round.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_blueprint.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_blueprint_round.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit_round.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_pixel_party.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_pixel_party_round.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_solar_flare.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_solar_flare_round.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_terminal_glow.webp create mode 100644 res/android/mipmap-xxxhdpi/ic_acode_terminal_glow_round.webp create mode 100644 www/icons/ic_acode_aurora_pulse.svg create mode 100644 www/icons/ic_acode_blueprint.svg create mode 100644 www/icons/ic_acode_midnight_circuit.svg create mode 100644 www/icons/ic_acode_pixel_party.svg create mode 100644 www/icons/ic_acode_solar_flare.svg create mode 100644 www/icons/ic_acode_terminal_glow.svg diff --git a/config.xml b/config.xml index 1667557e80..764a3fb358 100644 --- a/config.xml +++ b/config.xml @@ -78,6 +78,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hooks/post-process.js b/hooks/post-process.js index 16f310469e..f4e0112cb9 100644 --- a/hooks/post-process.js +++ b/hooks/post-process.js @@ -29,6 +29,7 @@ enableLegacyJni(); enableStaticContext(); removeLegacyKeyboardWorkaround(); patchTargetSdkVersion(); +stripLauncherFilterFromMainActivity(); function getPackageName() { const configPath = path.resolve(__dirname, '../config.xml'); @@ -65,6 +66,43 @@ function getTmpDir() { } } +/** + * Removes the MAIN/LAUNCHER intent-filter from MainActivity in the generated + * AndroidManifest. The launcher role is handled by activity-aliases instead + * (see config.xml), so that switching app icons at runtime only toggles aliases + * and never disables the running MainActivity component (which would otherwise + * force-stop/restart the app). + */ +function stripLauncherFilterFromMainActivity() { + const prefix = execSync('npm prefix').toString().trim(); + const manifestPath = path.join( + prefix, + 'platforms/android/app/src/main/AndroidManifest.xml' + ); + + if (!fs.existsSync(manifestPath)) { + console.warn('[Cordova Hook] ⚠️ AndroidManifest.xml not found'); + return; + } + + let content = fs.readFileSync(manifestPath, 'utf-8'); + const updated = content.replace( + /(]*\bname="MainActivity"[^>]*>)\s*]*>\s*]*\/>\s*]*\/>\s*<\/intent-filter>/, + '$1' + ); + + if (updated !== content) { + fs.writeFileSync(manifestPath, updated, 'utf-8'); + console.log( + '[Cordova Hook] ✅ Removed launcher intent-filter from MainActivity' + ); + } else { + console.log( + '[Cordova Hook] ✅ Launcher intent-filter already removed, skipping' + ); + } +} + function patchTargetSdkVersion() { const prefix = execSync('npm prefix').toString().trim(); const gradleFile = path.join(prefix, 'platforms/android/app/build.gradle'); diff --git a/package-lock.json b/package-lock.json index 2facaba1c1..373ddf61f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4125,13 +4125,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "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/@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", @@ -4679,34 +4672,6 @@ "node": ">=10" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/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/@npmcli/name-from-folder": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-4.0.0.tgz", @@ -5720,16 +5685,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@sphinxxxx/color-conversion": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", @@ -5743,29 +5698,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -6607,53 +6539,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/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/accepts/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/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -6675,33 +6560,6 @@ "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": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", @@ -6779,61 +6637,6 @@ "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", "license": "MIT" }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/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-align/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/ansi-align/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/ansi-align/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/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -6844,16 +6647,6 @@ "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -6909,48 +6702,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "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/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -6960,16 +6717,6 @@ "node": ">=8" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -6989,43 +6736,6 @@ "node": "*" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "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/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/autoprefixer": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", @@ -7069,23 +6779,6 @@ "integrity": "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==", "license": "MIT" }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" - }, "node_modules/babel-loader": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.1.tgz", @@ -7171,16 +6864,6 @@ "node": ">=6.0.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -7253,227 +6936,69 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", - "dev": true, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.15.1", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "big-integer": "1.6.x" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 5.10.0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "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, - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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/boxen/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/boxen/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/boxen/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/boxen/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/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "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", + "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", @@ -7509,23 +7034,6 @@ "node": ">=4.0" } }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/cacache": { "version": "20.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", @@ -7547,82 +7055,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/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/cacheable-request/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/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/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7666,13 +7098,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", @@ -7709,13 +7134,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -7765,23 +7183,6 @@ "node": ">=6.0" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "license": "MIT" - }, - "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": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -7796,39 +7197,6 @@ "node": ">=0.2.5" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true, - "license": "ISC" - }, "node_modules/cli/node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7896,19 +7264,6 @@ "node": ">=20" } }, - "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/cmd-shim": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-8.0.0.tgz", @@ -7918,16 +7273,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/codemirror": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", @@ -7993,19 +7338,6 @@ "resolved": "src/plugins/pluginContext", "link": true }, - "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": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -8024,86 +7356,6 @@ "node": ">= 18" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/compression/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/compression/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==", - "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/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8111,60 +7363,6 @@ "dev": true, "license": "MIT" }, - "node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -8191,57 +7389,6 @@ "date-now": "^0.1.4" } }, - "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/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/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==", - "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/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -8249,23 +7396,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "dev": true, - "license": "MIT" - }, "node_modules/cordova": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/cordova/-/cordova-13.0.0.tgz", @@ -8576,61 +7706,6 @@ "resolved": "src/plugins/websocket", "link": true }, - "node_modules/cordova-serve": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cordova-serve/-/cordova-serve-4.0.1.tgz", - "integrity": "sha512-YbfXaZ60yr5dkqmDFQgrU7TSKnzCqYsxHgIUzDeX8RggZb6mz1F9jMfUBbaYyaU7JjcuJ0aoRPYLvwSGQVhGkw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "chalk": "^3.0.0", - "compression": "^1.7.4", - "express": "^4.17.1", - "open": "^7.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10", - "npm": ">= 5.6.0" - } - }, - "node_modules/cordova-serve/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cordova-serve/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/cordova-serve/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/cordova/node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -8833,19 +7908,6 @@ "node": ">=4" } }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cytoscape": { "version": "3.33.3", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.3.tgz", @@ -9354,19 +8416,6 @@ "lodash-es": "^4.17.21" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -9379,32 +8428,6 @@ "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "license": "MIT" }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -9435,19 +8458,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/dedent": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", @@ -9476,23 +8486,6 @@ "node": ">=0.12" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true, - "license": "MIT" - }, "node_modules/delaunator": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", @@ -9502,73 +8495,13 @@ "robust-predicates": "^3.0.2" } }, - "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, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "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/dep-graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dep-graph/-/dep-graph-1.1.0.tgz", - "integrity": "sha512-/6yUWlSH0Uevjj6HWvO86rDeFzuYfzbaKDqifTEemwfwEPyBrODTb3ox/jFzqmc2+UmgJ3IDMS88BKEBh1Nm2Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "underscore": "1.2.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dep-graph/node_modules/underscore": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz", - "integrity": "sha512-HRhh6FYh5I5/zTt7L9MnHRA/nlSFPiwymMCXEremmzT7tHR+8CNP0FXHPaUpafAPwvAlNrvZiH91kQwoo/CqUA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=8" } }, "node_modules/detect-libc": { @@ -9693,52 +8626,12 @@ "node": ">=8" } }, - "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/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/editor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", "integrity": "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==", "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.357", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz", @@ -9800,37 +8693,6 @@ "node": ">=14" } }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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/endent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", @@ -9883,13 +8745,6 @@ "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/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -9900,16 +8755,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "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", @@ -9926,19 +8771,6 @@ "dev": true, "license": "MIT" }, - "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-toolkit": { "version": "1.46.1", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", @@ -9958,23 +8790,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -10071,16 +8886,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -10140,156 +8945,6 @@ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "license": "Apache-2.0" }, - "node_modules/express": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", - "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.15.1", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/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==", - "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/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/extsprintf": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", @@ -10378,29 +9033,6 @@ } } }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/filesize": { "version": "11.0.17", "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.17.tgz", @@ -10422,42 +9054,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -10485,64 +9081,6 @@ "flat": "cli.js" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data/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/form-data/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/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -10584,31 +9122,6 @@ } } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -10652,75 +9165,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -10762,45 +9206,6 @@ "node": "*" } }, - "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": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10813,16 +9218,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -10852,32 +9247,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -10898,55 +9267,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -11001,55 +9321,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/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/har-validator/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/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11060,36 +9331,6 @@ "node": ">=8" } }, - "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-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/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/hasown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", @@ -11184,27 +9425,6 @@ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -11218,22 +9438,6 @@ "node": ">= 14" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -11256,16 +9460,6 @@ "node": ">=10.17.0" } }, - "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-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -11341,16 +9535,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/import-meta-resolve": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", @@ -11370,23 +9554,6 @@ "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", @@ -11414,346 +9581,22 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/init-package-json": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-2.0.5.tgz", - "integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==", - "dev": true, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", - "dependencies": { - "npm-package-arg": "^8.1.5", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/init-package-json/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" - }, + "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==", + "license": "MIT", "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/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/init-package-json/node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/insight": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/insight/-/insight-0.11.1.tgz", - "integrity": "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "async": "^2.6.2", - "chalk": "^4.1.1", - "conf": "^10.0.1", - "inquirer": "^6.3.1", - "lodash.debounce": "^4.0.8", - "os-name": "^4.0.1", - "request": "^2.88.0", - "tough-cookie": "^4.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/insight/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/insight/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/insight/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).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" + "node": ">= 12" } }, "node_modules/is-arrayish": { @@ -11776,19 +9619,6 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", @@ -11804,22 +9634,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -11851,43 +9665,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -11957,26 +9734,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true, - "license": "MIT" - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -12001,13 +9758,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -12081,13 +9831,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -12158,13 +9901,6 @@ "node": "*" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", @@ -12174,13 +9910,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -12188,13 +9917,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/json-stringify-nice": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", @@ -12204,13 +9926,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "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" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -12230,19 +9945,6 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, - "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/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -12252,32 +9954,6 @@ ], "license": "MIT" }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jsprim/node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -12318,34 +9994,11 @@ "katex": "cli.js" } }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.0" - } - }, "node_modules/khroma": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "license": "MIT", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/layout-base": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", @@ -12715,20 +10368,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loud-rejection": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", - "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", @@ -12739,16 +10378,6 @@ "get-func-name": "^2.0.1" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "11.5.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", @@ -12758,19 +10387,6 @@ "node": "20 || >=22" } }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -12904,55 +10520,12 @@ "node": ">= 18" } }, - "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/md5-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", - "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", - "dev": true, - "license": "MIT", - "bin": { - "md5-file": "cli.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -13009,16 +10582,6 @@ "node": ">= 20" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -13044,19 +10607,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -13091,16 +10641,6 @@ "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/mini-css-extract-plugin": { "version": "2.10.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", @@ -13137,16 +10677,6 @@ "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/minimizer-webpack-plugin": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", @@ -13288,30 +10818,6 @@ "node": ">=8" } }, - "node_modules/minipass-json-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", - "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/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-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -13800,13 +11306,6 @@ "mustache": "bin/mustache" } }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true, - "license": "ISC" - }, "node_modules/nanoid": { "version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", @@ -13908,61 +11407,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/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/normalize-package-data/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/normalize-package-data/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -13973,16 +11417,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm-bundled": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", @@ -14126,63 +11560,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/objectorarray": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", @@ -14203,29 +11580,6 @@ "node": ">=12.20.0" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -14251,70 +11605,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -14359,32 +11649,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/package-manager-detector": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", @@ -14480,16 +11744,6 @@ "dev": true, "license": "MIT" }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -14560,13 +11814,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "dev": true, - "license": "MIT" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -14593,13 +11840,6 @@ "node": "*" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -14619,95 +11859,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/plist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", @@ -14895,16 +12046,6 @@ "dev": true, "license": "MIT" }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", @@ -14976,37 +12117,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "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/promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", - "dev": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, "node_modules/properties-parser": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.6.0.tgz", @@ -15017,44 +12127,6 @@ "node": ">= 0.3.1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "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", @@ -15074,41 +12146,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", - "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -15145,45 +12182,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", @@ -15258,66 +12256,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-chunk": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", - "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "with-open-file": "^0.1.6" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/read-cmd-shim": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-6.0.0.tgz", @@ -15327,118 +12265,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/read-package-json": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.2.tgz", - "integrity": "sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-package-json-fast/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "license": "ISC" - }, - "node_modules/read-package-json/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/read-package-json/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/read-package-json/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/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-package-json/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/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "license": "ISC" - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -15506,32 +12332,6 @@ "node": ">=4" } }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "license": "MIT", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", @@ -15552,73 +12352,6 @@ "regjsparser": "bin/parser" } }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request/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/request/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/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "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).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15675,63 +12408,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -15742,76 +12418,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/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/rimraf/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/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "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/rimraf/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/robust-predicates": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", @@ -15864,16 +12470,6 @@ "points-on-path": "^0.2.1" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15903,26 +12499,6 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -16032,107 +12608,22 @@ "semver": "bin/semver.js" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "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", @@ -16154,82 +12645,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -16350,28 +12765,6 @@ "node": ">=0.10.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -16405,32 +12798,6 @@ "node": ">=0.2.4" } }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", @@ -16450,16 +12817,6 @@ "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/std-env": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", @@ -16525,16 +12882,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -16716,13 +13063,6 @@ "license": "MIT", "peer": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -16774,16 +13114,6 @@ "node": ">=14.14" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -16796,37 +13126,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/treeverse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", @@ -16899,26 +13198,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, "node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", @@ -16929,56 +13208,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/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/type-is/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/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -17015,13 +13244,6 @@ "dev": true, "license": "MIT" }, - "node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "dev": true, - "license": "MIT" - }, "node_modules/undici": { "version": "6.27.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", @@ -17082,26 +13304,6 @@ "node": ">=4" } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -17114,26 +13316,6 @@ "node": ">=8" } }, - "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/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -17175,56 +13357,14 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "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": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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" + "punycode": "^2.1.0" } }, "node_modules/url-parse": { @@ -17237,35 +13377,12 @@ "requires-port": "^1.0.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", @@ -17285,28 +13402,6 @@ "integrity": "sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g==", "license": "Apache-2.0" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", @@ -17325,38 +13420,6 @@ "@sphinxxxx/color-conversion": "^2.2.2" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/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/vite": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", @@ -17733,200 +13796,6 @@ "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/wide-align/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/wide-align/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/wide-align/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/wide-align/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/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/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/widest-line/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/widest-line/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/widest-line/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/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/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/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/with-open-file": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", - "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0", - "p-try": "^2.1.0", - "pify": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/workerpool": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", @@ -18147,974 +14016,6 @@ "xml2js": "0.4.23" } }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true, - "license": "ISC" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "license": "ISC", - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/cordova/-/cordova-11.0.0.tgz", - "integrity": "sha512-Hu2YeT0naeP/1sEm/xfJYUsXN48XV6zagxbi1+4q0Ei9c5TKsIq8v4EWukvSHF4UO2pnh+9ViaDlGMcS1Wrnfg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "configstore": "^5.0.1", - "cordova-common": "^4.0.2", - "cordova-create": "^4.0.0", - "cordova-lib": "^11.0.0", - "editor": "^1.0.0", - "execa": "^5.1.1", - "fs-extra": "^10.0.0", - "insight": "^0.11.1", - "loud-rejection": "^2.2.0", - "nopt": "^5.0.0", - "semver": "^7.3.5", - "systeminformation": "^5.9.17", - "update-notifier": "^5.1.0" - }, - "bin": { - "cordova": "bin/cordova" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-app-hello-world": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-6.0.0.tgz", - "integrity": "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g==", - "dev": true, - "license": "Apache-2.0" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-common": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-4.1.0.tgz", - "integrity": "sha512-sYfOSfpYGQOmUDlsARUbpT/EvVKT/E+GI3zwTXt+C6DjZ7xs6ZQVHs3umHKSidjf9yVM2LLmvGFpGrGX7aGxug==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@netflix/nerror": "^1.1.3", - "ansi": "^0.3.1", - "bplist-parser": "^0.2.0", - "cross-spawn": "^7.0.1", - "elementtree": "^0.1.7", - "endent": "^1.4.1", - "fast-glob": "^3.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "plist": "^3.0.1", - "q": "^1.5.1", - "read-chunk": "^3.2.0", - "strip-bom": "^4.0.0", - "underscore": "^1.9.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-common/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-create": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cordova-create/-/cordova-create-4.1.0.tgz", - "integrity": "sha512-8VQohB5w5WwuxurQJ+2L+lAFVhBr//kFvlxLOmF0P3SzTdfIU02pNalbOeLalC0DXD7rfBXJZOxJ+KSM5TOq+Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "cordova-app-hello-world": "^6.0.0", - "cordova-common": "^4.1.0", - "cordova-fetch": "^3.1.0", - "fs-extra": "^10.1.0", - "globby": "^11.1.0", - "import-fresh": "^3.3.0", - "isobject": "^4.0.0", - "npm-package-arg": "^8.1.5", - "path-is-inside": "^1.0.2", - "tmp": "^0.2.1", - "valid-identifier": "0.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-fetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cordova-fetch/-/cordova-fetch-3.1.0.tgz", - "integrity": "sha512-qOT3HlNzVWbsCZVvbkZ6PdvAG1byiK8vWG+/Z+7s+8ZB76rOYKdzMvrmmMwrTTX6nglDnz5uJ/4XjQHJB770GQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "cordova-common": "^4.1.0", - "fs-extra": "^9.1.0", - "npm-package-arg": "^8.1.5", - "pacote": "^11.3.5", - "pify": "^5.0.0", - "resolve": "^1.22.1", - "semver": "^7.3.8", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10", - "npm": ">= 5.6.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-fetch/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-lib": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/cordova-lib/-/cordova-lib-11.1.0.tgz", - "integrity": "sha512-/XM+/wFag72bD4SNSxwX8b3OWatHNNlnmJpgb5pepp2Pobb957nWyR0GPwIkKyOyszdZesWM3Vv8uH9e2Z1k2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "cordova-common": "^4.1.0", - "cordova-fetch": "^3.1.0", - "cordova-serve": "^4.0.0", - "dep-graph": "^1.1.0", - "detect-indent": "^6.1.0", - "detect-newline": "^3.1.0", - "elementtree": "^0.1.7", - "execa": "^5.1.1", - "fs-extra": "^10.1.0", - "globby": "^11.1.0", - "init-package-json": "^2.0.5", - "md5-file": "^5.0.0", - "pify": "^5.0.0", - "semver": "^7.3.8", - "stringify-package": "^1.0.1", - "write-file-atomic": "^3.0.3" - }, - "engines": { - "node": ">=12" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true, - "license": "MIT" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/endent": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/endent/-/endent-1.4.1.tgz", - "integrity": "sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dedent": "^0.7.0", - "fast-json-parse": "^1.0.3", - "objectorarray": "^1.0.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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": "*" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "license": "ISC" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/pacote": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "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).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" - } - }, - "src/plugins/cordova-plugin-advanced-http/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" - } - }, "src/plugins/cordova-plugin-buildinfo": { "version": "4.0.0", "dev": true, diff --git a/package.json b/package.json index 30297fa42a..44502626e4 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,10 @@ "com.foxdebug.acode.rk.exec.proot": {}, "cordova-plugin-iap": {}, "com.foxdebug.acode.rk.customtabs": {}, - "cordova-plugin-system": {}, "cordova-plugin-crashhandler": {}, "cordova-plugin-advanced-http": {}, - "cordova-plugin-acode-webview": {} + "cordova-plugin-acode-webview": {}, + "cordova-plugin-system": {} }, "platforms": [ "android" diff --git a/res/android/drawable/ic_acode_aurora_pulse_background.xml b/res/android/drawable/ic_acode_aurora_pulse_background.xml new file mode 100644 index 0000000000..ce30f7f4c3 --- /dev/null +++ b/res/android/drawable/ic_acode_aurora_pulse_background.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_aurora_pulse_foreground.xml b/res/android/drawable/ic_acode_aurora_pulse_foreground.xml new file mode 100644 index 0000000000..99dbb87b8d --- /dev/null +++ b/res/android/drawable/ic_acode_aurora_pulse_foreground.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_blueprint_background.xml b/res/android/drawable/ic_acode_blueprint_background.xml new file mode 100644 index 0000000000..11b508de04 --- /dev/null +++ b/res/android/drawable/ic_acode_blueprint_background.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_blueprint_foreground.xml b/res/android/drawable/ic_acode_blueprint_foreground.xml new file mode 100644 index 0000000000..d48af39543 --- /dev/null +++ b/res/android/drawable/ic_acode_blueprint_foreground.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_midnight_circuit_background.xml b/res/android/drawable/ic_acode_midnight_circuit_background.xml new file mode 100644 index 0000000000..0ef755aa3b --- /dev/null +++ b/res/android/drawable/ic_acode_midnight_circuit_background.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_midnight_circuit_foreground.xml b/res/android/drawable/ic_acode_midnight_circuit_foreground.xml new file mode 100644 index 0000000000..42de5c1761 --- /dev/null +++ b/res/android/drawable/ic_acode_midnight_circuit_foreground.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_monochrome.xml b/res/android/drawable/ic_acode_monochrome.xml new file mode 100644 index 0000000000..38536a8a9a --- /dev/null +++ b/res/android/drawable/ic_acode_monochrome.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/res/android/drawable/ic_acode_pixel_party_background.xml b/res/android/drawable/ic_acode_pixel_party_background.xml new file mode 100644 index 0000000000..2a5fc569c7 --- /dev/null +++ b/res/android/drawable/ic_acode_pixel_party_background.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_pixel_party_foreground.xml b/res/android/drawable/ic_acode_pixel_party_foreground.xml new file mode 100644 index 0000000000..2898db06e5 --- /dev/null +++ b/res/android/drawable/ic_acode_pixel_party_foreground.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_solar_flare_background.xml b/res/android/drawable/ic_acode_solar_flare_background.xml new file mode 100644 index 0000000000..6f9589c538 --- /dev/null +++ b/res/android/drawable/ic_acode_solar_flare_background.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_solar_flare_foreground.xml b/res/android/drawable/ic_acode_solar_flare_foreground.xml new file mode 100644 index 0000000000..06eeca1ad2 --- /dev/null +++ b/res/android/drawable/ic_acode_solar_flare_foreground.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_terminal_glow_background.xml b/res/android/drawable/ic_acode_terminal_glow_background.xml new file mode 100644 index 0000000000..afd79b72b2 --- /dev/null +++ b/res/android/drawable/ic_acode_terminal_glow_background.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_terminal_glow_foreground.xml b/res/android/drawable/ic_acode_terminal_glow_foreground.xml new file mode 100644 index 0000000000..ee65cf2ef5 --- /dev/null +++ b/res/android/drawable/ic_acode_terminal_glow_foreground.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse.xml b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse.xml new file mode 100644 index 0000000000..6b8c715762 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse_round.xml new file mode 100644 index 0000000000..6b8c715762 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_blueprint.xml b/res/android/mipmap-anydpi-v26/ic_acode_blueprint.xml new file mode 100644 index 0000000000..6415762a4d --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_blueprint.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_blueprint_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_blueprint_round.xml new file mode 100644 index 0000000000..6415762a4d --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_blueprint_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit.xml b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit.xml new file mode 100644 index 0000000000..5b709ba70f --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit_round.xml new file mode 100644 index 0000000000..5b709ba70f --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pixel_party.xml b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party.xml new file mode 100644 index 0000000000..a622de3912 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pixel_party_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party_round.xml new file mode 100644 index 0000000000..a622de3912 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_solar_flare.xml b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare.xml new file mode 100644 index 0000000000..8d0f1caf5e --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_solar_flare_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare_round.xml new file mode 100644 index 0000000000..8d0f1caf5e --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow.xml b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow.xml new file mode 100644 index 0000000000..7f47bfab6a --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow_round.xml new file mode 100644 index 0000000000..7f47bfab6a --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-hdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-hdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000000000000000000000000000000000..39deea40e14634ded4b17e7ceec3aba6fefc717d GIT binary patch literal 4732 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 KTY=ShvSkEHbD^gI literal 0 HcmV?d00001 diff --git a/res/android/mipmap-hdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-hdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c9cb2bd1acbc954921e0b565a90db38e013a997b GIT binary patch literal 4970 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-hdpi/ic_acode_blueprint.webp b/res/android/mipmap-hdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000000000000000000000000000000000..42cf0c189dd1030ed880e0e96295df61166e7466 GIT binary patch literal 4394 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 OZm9!Uz%0hyQU?HBMaY!^ literal 0 HcmV?d00001 diff --git a/res/android/mipmap-hdpi/ic_acode_pixel_party_round.webp b/res/android/mipmap-hdpi/ic_acode_pixel_party_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..30626db1c1b953d66799b10a78629635bcc4b8eb GIT binary patch literal 3708 zcmV-?4ukPhNk&F=4gdgGMM6+kP&iCy4gdfzN5Byf0S9d)Ig+aD;`cm%z?UdQ^nU`l zDj%Z&H4mmfX8|m}ZP4}wZ5Kb%U+m3)xTttbOHgMXJew?wI&DQvk|m4Uwk*qXCh>Mu zSulYY)l8C8otZRM5PV2|IqgmD6LX28Gvj@dEDBTSW&pXhZCA}Ar=uq_^j{m}%rM#h zNpb~FBS~_kyw~~*E`0wjJGl5&xQ--SRr)+!a&YI1{1b7A;`!s!{|Uf9CAA{~pz8b6 zwc+RVLuctr`x4Nn-6tXje5j#aG8fkZwFXr8|L&w&3m}(RA95;y9cq^>SrUneh%9aa zz>E83T?t`%5^Y4h${NQ*9r`!d08-f!wyI*BQ$({|vp9xw1He?lmaT6nGor~ROZ@~b zu-24KT#IOz@A0!MfN=nTBmm?b5j2zNquGREDgd-#SqH<_yah+V0XiPX#aLqb(g0uE zwjFb{ZTp<&y(-SB_T_Xg+qP}{x`u4qHpgsx$hOTS-Iv;Cr8`x1Ow+OB*ptf>ZCl57 z+qRYK`;9*Su3_7@ZQC}ZwvA~9ZNzNb_MG3CcDH-~|F8O?we8q;+qUZQd_S9Qo87jN zH@mg0+dXooNRe$jwQajM`^VS6U++Z$5CDR0bagx1wr$(CZQHhO+j`r!G21HVED$AG z4ci>O`y+us00feZbaL@sQe6_tD9x50 zVUe^BFV_#Mh+ar1q&kT(IknyFydy|R2uW1DxHi2ZBm^M)q3Em_fsfb8RqlOV^!@tN zjko>9Ym49Z=dS^&$B*1&gb+jmEkFL+t$zHq|9Rar_lZ9g1;qwwBA%~@P5WJzM}3ZA zaND1~29QYR5=dv0gg_F%^~t9Ih%O-l{VF=+LOq-IyR3oqhoQ<*UO`6yq-%ln4kvv7 zYX^acU$H|XfQWMR^E+1FT(26Wl-?4l(kP)qS0VIePao}NPaoqmA3IDYf=H?H-d#L2 zVQU%2-MRCCtxjZL*@8D^3Z_p zTcW@}U-&*nqcAi|1dv}%Xx55p!81&$d)y$PGtzcOIMO;I2^BUz8?*@8X@09^aP#T`zkvdl>&J930K|NcfdemIxDG;6b&9t{{^ zj4!WTccs_7*~CT^Q9 zQ(M!UibNoaMk#hz$VHBIc@H505ENjj3QXy``jqXD0gG$52*&hY0*a#P zST2JIphM6ALqR`T3PGK1lRJf5Ty%w*?GH2DnnV8SZwu1@6*UoE;aPYHFM9vdanp1J<%(U0Er# zF#uqcJYo4;{P^jE^fx5u;$)k}J$K#ixvza90|4;Z*S^GcKmJrRyC0(1X^`$hGrdw!IjwSN8kT1 z$@jy{mz_>QUMV#|ch-(ED$N>F0jG@LXI%8@L{8Z2G$NNve!1N^^i}|pS2HuFw>ua> zaWY8^WKuVztf(k!#>f~g4eo zOl^IT;^4yfzXbdR8bzh-r4-QFFbwB|86aUMqX|F#*8limnwdm)*yT$l3d^mL}nklLvin`c`xMQWzYX!q6xx0ddJ` zF#w=NB7rGeeEY_A|GNtl5@nyb^ObJ+k*Av5i)ZX`ivFIAt5_ybQuKj^0{ro$6vjR|-;1W&EFOT63+dXQ>*q_{S}eLuJo{SL&ocXgg(Oh zST7wVhXF*KmCgzzBv5jRMA91;p$ns=${Kn7J)8A5N@OVv#w=Mk_+=ssVZMu_2a(7L zn1v7q3bEM?g3ej-XO|O+EF_aMX-$7VsjSP+CX5pE_}^vl>SEb$=YB)X-)X$eUXWf3 zqcvfaLbb_Vp+D(Y!~zH%T8N~d^qVl7l8}FuVOSmCYAL&oS95+$Nyn6g(MWDn*JZ@g zRRr)>raKE2h(wU|t?47IpDhpU7egY;2@J-!TDA_7hGCeHmZ=a%gb@|>SWxIQ0E{8s zb(6>A0Y{eA^T?`fmUuJD8fAF%6*_c{HegD7hYHUkZ#V#8+wI0Jxid{k&4<@2PDoil5~6qDP~(q!!R zUxQa^pkv9p)nB5tTw&eHw%ylUyvOJsj}iX@X!`;hp;t0)GKN5eg6mkYS+XbWai_ES zzri?)vfLd;OS1MaS|-XhRvmBiL3HhO5~X!PAq?zq!G6TxR<8M$U${=TnWtPvCbuK< z5B~szKcMLNhh1RsQvd+2KR(sABk0=clnW1HYU>Dsa^$mr!N48*4gl~B*)b{Or)Pc) zKz3`D7UlCc{PyeF`uDAx130k_$MAu_e9?gqbN)X=qvOBUeY&^$)f?9B`_@kXTs(d! zUkiJ-dC+JTofBU6mT}=h0FnItt}g>xo~j6GQ_usEA+3H;UZW0%(prN9?<3ps6%9i< z`RzMF=UmC{*MW!PWD1gGmdLUquYIL;wyq;T$7HU_>r)~w^@ubdGTY&(wbz?D^JkPM z*UcG-L^$$|MfO1Dw5}v|HgyG*u1H35>(t-OmpOR#_Ek5Jz?TSle4kDtgyf$uhDZvT z-MWs}HOXgo=mY4y9AzTNjD&*W>xK;gLP#Vv#~}uQ(k(ivPmEjr>XmX4SXb5>n22AX zFQ_oQfuY!fP+;hYbHT&>z_oHKc=%)o0H{CtwVos)0$aCv>M*D>Y)5+>Mzjtk zndn-%)$Q{K@Y>0}N@^=^GGQc1s6A);LZ#u%^X7e|IddvS0f5)`UKO1>ON^q$s^nkJT3?&qYp`^OQWD}X9LEb-r{Qaq zMg+#;fyw}il2nGZY=Fyq7##paXb?mI$zbUYhyV3okR>4=U>AOXjWE12S#4v+;AXa7 zWfog!P!wo{5gG<4aCRA4CgYy88N2ZcHpq|zG3bF05Xk?R(llUb7@#9Nvm=0yu%Et$ zjWayMK{P=)vSFk;gU2du>Pnhl8bv*3&R{h9!bTfzV*}bE9m1K?S{YSHE7XveNu|G(O z#A-VekobDfls0q8tWs%aY#K1Ks;YZt#w38utmxvF(Vs_abgb z{E@s7Qbc$SY@s-3krWX@^6wKE0g&Twy4w=&y}0De{3KqIe59((r%2M0YP0?KRi+pC zCl`1hK&-7jZF5uRnyrwIM(F-yF{32U;6#!n)k^sozy9&=f0`%19QB!*!$BKKj^yv_ z%jqF3gy)auq4a+OP;CIfmoFA?7{KCYnQwqV)<}Wj2u)+EK8Z+VM+z|nIsgWWJ0buO z!zKifUzpK=g=d^`0VHnpMh5~5rqFQ(07Ovq1Rw?g3;-D53og#Pd3hR;0*VQ+0i5LX zd4Ub(pn>l-9Gv0N3D0W>yzOQN0Gu>)(_}N+jBvH>Fg*^gJ%EFqb@SKBh0+rX0Brv7 zx|P)P0PdCV1nL7_;}uWvgh8;dS+-#?4Fv=VLKYZS!-V3=Bxgzs{J;VJ1&tHH$d+m# z7XyQ~Z3M;qVQ;&C2oW&>t@KgfIb2!OQ1uKR054*-)-CEcvTFJk9&4=emLCG;d{$eFq6~a1 z!&og6NEQY`|a&+G2oOSYs8nk{d~qBS{f8 zV7b?y!T;2Yg(Se!GgT?Iwry8i=HBGoK?X$$+2fHYsDLW|esTQoZaKmL5LoqP+dP5Y zR5x%VC*v9zZJfZHYj5n?w%_)10_aNHzerZvyT@nUanD^tA})b@;2NAu@z~wn-I?RM zHs10N{!`}~e%M502WYf$heoy<9o*#~Y)uswxqBBDFVRE{WbUvLjYRJ5J`o-fdE-z; zN0Mz-lH~C-i$QOchWEdU(V3YfPR_h^1<*EaS7VI1j$+%Td*=gEI#qr^6)Lm!2iVE0 zjLs@!96Z}NXYV;;0t7J}|M_2U3e%a+bn1|os@1779m$eYTslZ6=?K~RndEW5M9Y#% zbBSUi(y%2H2q9s#oEkHAZ@=H~^MgF(XY$P`OE};Ad$_!l%Y(e!=CxD7cY#~~ye~J6 zS*udkqzt4N>5SXAZ_5$4esK|_<{h#?iUo)@oq zO` zyYD|{mdujr>L!;QKy#e~Wo|Uu&;@)>gypK&eA{b&Q!f7KH-Ga38SR3ShageU=~+e>FLGteu`BvjT_tD!|&Adf{j90$3llu~x82HRwyE~Pn6Kv7o6Fw9LhpJ)B=QI^{*Ax+`Rm& z@?%y`ozl!NpXXBA(P*Kupp|N=vT?+9IUO%GG|&U$8pUg`L!hCTu$b9L`&cE$%670Y zdTeYvRhf9XG;?mFa_ERf3@Mgm$QIjWxdeRVg_#3ugz8XfnnhRdc-nLcSQQvx;80Q9 z;5>qai{VCyKUbChl!==JZWv~!|Gk{eOJx099jT63V)kvbEK38>Wb1jMG7lf5P@=~G zC@_)-2}Ih|svv>kG241D#R*a%=#9$0P@TyO;Mss-m|^4A=U5_=38!7|+C0rx~@Z`GEE zYhZPWs@D$g12`4%;oLZ5sPoopJGJqOR)!)QUeg>J z8k@h=L1(LW>ZpTr4BH0lCB8oNKHyY3bEwp=r&go5t#dIqeRFSWLqn}CC2iE<2@@YJ zk4xM%ZW8CH?fE`8ew1K_DhERQSQf9d}+rPw?6~#5n{wjx!8? zM5R)xU9ERA(G_xn4mI&WaTxl{ankjNncsQl#4|EiQqP#ni;cGxDM$m{FrFjNCT

o#?LS_N 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 WulHRa8KK1f3f>BNkZ~>SjE4yAcr1qi literal 0 HcmV?d00001 diff --git a/res/android/mipmap-hdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-hdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..da58ca975f8aacdd09e5d8295f0d49d801cc7f88 GIT binary patch literal 5202 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 M%w2a^%QJYB01%(yIsgCw literal 0 HcmV?d00001 diff --git a/res/android/mipmap-hdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-hdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000000000000000000000000000000000..71b0ff5e2e8f3f4f0747478d995bed69acf18b79 GIT binary patch literal 2978 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%0Dx;= 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-mdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-mdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..019f90f83178dc9ad9a99825284a97aa57ebb5fd GIT binary patch literal 2162 zcmV-&2#xnrNk&F$2mkr3_%LWPxnZRxT)H zfeerhCo?lMGdG8NrmFsn%F6EX;N!x{{PiLuI?ko!fFd&DTruz4l9L&hzugHwoWBzs zI9Ci#oG~Ovk|alRJgaAR?Z7!_8VoX|lkpS0oO3|rv(qKVwzgw?&h@;0zu)HPKS|9h zX*~gR24?$D;2T7oHUn@fTfc4lg&aTt2q3y__qJ`1UTxd9ZQGk|P5*1I>22Ft6Cebz z>4ks!%A#&Urz&bJsw*T_6fL6Yzwo1?m!ii)is*sxnS;D=A)B;tAva67DV(k_OXwxk z7bOTGzZVjI@Ec(kRm4KNS|_XM%>NI<;6itG(Mr)~p*^Oy0^pEMMMSv@$3;7Y4_nli z4XMI3VZ0CtP%&nCCcxNqR^W>AgzbM33b&#{T{UBcXeK>>R%3883(VAjuZdPuQI4X) z!qd$uYOYWZXfd6GsRp;eAq)T18oenYMhFK3bPgs>Q=7eeru4+wRB03Q<%Lxg%v8tt zv}5>ZjhSrg45m9xn|u0JP>&VTXs~4a&vMR>5(R+*FnIWX!}5N@9!NAmxHj#Ed8B?tnYS+|W6xSUVHz7uZELr%XxV+Kc+X*$75-P$L3ms@ zxR4F4T4{<}U6_(<_q~o+kJ=VY^Ij~w6X@8xhkA?>UnJ6OSN2tJ-YdXh8m5Ib zq0?~}i&cbjCfgcQ`^Ndua{UAFfxPvs(?M+7Au1PD5xO#IFb$v4SB!hh#4sx!#WKZU zFeF)MNTE)xgN9*nnTe;njM~SICV*+4g(&RlQDcWYY{0xxoYeyftR!NtDvrbzhLga z?+gORU#%grC?(YIIIQToqIkde&1c4ksMT(iX#k6nr>xSK2OF8Q|JM>2+%I~~?pUnY z@oj^##5ht0Km-g)ioXA?Glz^ZjA4`nu*`V!QS{$3Py~zlY58LxSa?{rvBsVsxnal& zCmU#&l7s@Lrb{U701OV#9jcU$06nRSA*rVq_Ka?@m>-ru{saAcMWqtsj=XTYVLAW6 zV3gf(>@_PC@JT1>C{*~6sSS4*oS!9tJ!`j_7Bx!aSsm%I!IEEAKlg)~)wL&GJenJx z?}kyf!Ev?6*^VPjI-Hc~yXY5_fjjTJnX_R5GhDaccF-Pf7|v0c<-&dqgR1odI_euH?a`$aoFoQ=ouY#vB#Uxs z4a7XpCB555*7<-P@6@ODMd!u^FHgAcS$Q$sx-yQ*hbFaW0Tb&CI0m59Nx{wPP zz}Y$Rkc=wP%}$S!a<25K*X4z=9U7J%&&;$fsFCKRG`d8|UZI*2{wZ3@&!8t1*FCFgFP4bR;= z>oR>de&0RQxi|_zOij{Zf6_@h{2kKa^e3O<1Fb~7`7qXqrl-nIdjFU|3I>D0gh_`7 z&$`TB2zE zPQK%CoscVh5^k_rAy#N8WK+L0;qW%3(_n<>qK9nd?6D#E*tZP^19+R96`J7zb`bJ} zo5EYRSg0!O{x{RNNsnp^z`xZT5snB&Y_%}&Z+{SG3aJm*kq+WvAw^iMuu=HTK@@%n o2ZYW-pjwsG40%L!Pk18fPf<}kr0AQPSC5E>3cZDc!cR5}04swdS^xk5 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-mdpi/ic_acode_pixel_party.webp b/res/android/mipmap-mdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f5702fda9376fdc14458e69fc5fd29457e0c28f GIT binary patch literal 2446 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-mdpi/ic_acode_solar_flare.webp b/res/android/mipmap-mdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000000000000000000000000000000000..c7cbf81bf27f467b2a7014a7352b382c90c8055a GIT binary patch literal 3216 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 C=p@<4BW=H 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-mdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-mdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000000000000000000000000000000000..100406746efc77a3d2791b8e12b0f90979f82059 GIT binary patch literal 2068 zcmWlbdpy&NAI3l5ZDv?&Tg7B$a~qD15u%i}pRkT3-Q21rms~@skbK>WLN2A@5JgC# ze#N?QW+FN6`MDEOl9EGI!p?qwJ%2v0=XpKv*XwcMSy>SY0Ec&R?GM?T+Dc>r^z}sw zWaP5{fDP4s;%LkKv6=C(_>U5tkp{26Br^5xVUOzTSSKHuk`;PoR8!Q;R89Vm%) zb|P7q^J2R1Vom(j<#zupe6oJUUBWR<)_A?o&@MlpymzU}|CU#6T((UbU8g12j5qS* z&2yy%KM9Mm^gS(O33B*Ec78wK_(1hIIO2bmpS-;B%!ot27)hEp%bLwHW?-hMY)FU`xK;b2MH?jtZHp!Sg9dZE<^AIw>u7b3gd6DML5Z; z+dzZ{_|H?aDR&SHT8If5vCAY=7ZumF6_(TxB#fIT?BQ zk>zYf0_44pD)86^xN%3lKk5PZxvy9TP$CWk;LrGS>XJDL;8OCp@uDpp5eL1Gpf`f_ z9=QSjl^|`!?}ZoRCf5h|^)0?Ns^zrdS|Ab(BP2wTC1A*)wYGh*>x9-{ek&<=-B}n{ zmmI35Jo|@bGKDJWI;m4InrBAe5sxR^XBZ?j#ZO=iASI8=TXoWrSE+50Pp+$ZxD$y8 zoiiW-z2(cve{7-+QUw%8l;{S0W{qOZDScbD(b4kq{l`wg4fE-#YGv|ZbMMbf=(7@BQQDT=Ye^WPS5x2lU}5^Mw@wpku6n;LQy?)`Gbgro zD4pxNLXR`jya~i6(qE3}u%eBUh{B$_%b8zH!b71#bCD%}*MrdfQSzl)x#CpsxfYOr z?bZbl_Mvq1t5&F>sXJM5w7(l~ez;E-m7fg3PZ0DtKqVF<56~6&^BX{POITDc*?4VU z5yBiYp2+B3E_vUbGq>0qNP-*R_A1t?mn2ZlGE$iUB?5u#(x|F0f+lR=Oo#5QH}%nG z=Ui1I^L48HurNcQfvuZ_6uAoc#_n#kCJ)sW8!VdJ4B+iFh1)#Q^q@!I7a&lm1ROPl zyXSf2)bCei3W9&u*oAA>-ZwipEDP;*i6r1-ZPHBZr@AE<3owe}VGZfp=+5GiMzQ9z zg^PNWimBO;ZzWr&ENUWl91YzFc)^>@ZK`olkvp#BHQf`CJv5AJ3ZK4WKU*!{B@`8; zv(;-)A_DFbSrPED+Uh}6EYL<0dlXQf7da+f4rX%ngsnTjB8=2l2mjq`wb?-MK=Jtz zB;r%|Qw|7xCV&=OS4>3s`S+!WF*ebpGf@j!P?B`GR*4HE<~)3F@(-^03Z*Oi@N>4`lbwS^{SwB=mzJit!# z`$#hWt+7Fs^;^W;l>TE1n~Pw%mI){`Ro;*zaLuhb_B7LZv8Tfd_@M_bH#t39orpVg z`JE+(o$YEiIj3Pa8S?&c#?mS)z_*8W>_JuLKkc9b3cDjW&0B2AOB$jEF5HyFYFo;v zBN%yrbPtcv>l`9DO2sr%~PdW?@C((0~9dnIKboJOea^?w>NF?@<#KNc*rdF&WM zfKnF0Q)AdTPwLH|&p!Ay^@mw!bX5JHL-q#O?NR1chB57RqkBq4Be0E>HSmeh85$dE z`iOT9sM3^L@0n{6?7qk1kXp|u3_j%!E(M8Z){`q6f#FWOy^}CUdm+Kl5F4>QeLd%# z_HZg6b&T_dq|Q@UBWeCbAI|;;MvT#l89NVAKdxR&n28CgQwOWl++iFrD>;D!O}{2| zpB-U>BBIVgvZQGQE2E`|x~2611`i{P$qOb+-1R@KKPjn@HQ}YDW>n(l9T>i4Y>1Om lJZAbh*QYLn8Kp!h3vG|~ZTr3nvmoB8_(!{Z`i%4nz`wT?Tr&Uw literal 0 HcmV?d00001 diff --git a/res/android/mipmap-mdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-mdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..9e5d1de40b20c7d01bdb20718fefa75e1589a614 GIT binary patch literal 2216 zcmV;Z2v_$~Nk&GX2mk~v@1>7F;B62Q{ht6J zxI$$6;utGK$|ws1;2dMrBNnBzgUh1ILXdDN;U{H`U4m z|6L^;+(@#mDqSCqs6qC>Hg^q)C^wNLIZ~QE{gS}*rzh>%{wI7?P!#wiDd?got_pYp z*cHB9aWgIgS7YO9>;j6e_O!|ZU~EJn#)1HV)kfai&hhj=Gi<{)-66ng9U9D4*6TK$ zzOql?C>9uLIMICjNfiYY3&0TB=BMCAkM|Q;!9cEf;}6CFpcn8FL*PFwZQFi6n!Km; z$v>4}+U`PgY}>Q7{ROnMZO_WKXKUN`tQu7{Y!~wXzo|UO4aYfRB}>Y>$z9BYut}d|fVg+qUCx&f2zZyB+-p z*qUs2v~AmVJGE5Zq4O=(0hq|miZ?L!Sv z6N2JY&MEcy*zy`l!Atyxll1!evBAdqaY@FE(7*r`=>P$sdILIQOp6c*QgMl{BIhKu zetv9u>GRk9!B=sB1OP%H01E{$hz#0zjJNOaOr~_EdbJL3mvYU-4<0)LI5v{t_662LT|kCfo9-TPB7e z(F<{0KOK*L0sQ?7X>L6k1Iuejz z#i`Et1%Mx=oGwWK9#{FxY$1v3=ooFd$AIr)uvYAR^TCZXnqiS zprA{tppvwxgSt?~73ol&!U1NI0xXoH4RQeM0nU0 zvYAiK5CE)fcK{yH1ONu%p_2xStzAMI1WB`u;Vb%A(_pIs09dbwQ3C+50L)1+kYJMs z3;}@E{kyP_5qgzyApoi|2}l4W3~2xoOtQbIYe9fOU@eSMaat}#)*mkq>s!e&lW(kt z%L=Hx<>~U8N4gEep<{DV7N_ncQh-S@G?h~HqwuUv9XpT!z!B>AC>GKk=S^`PcSz5dgMj2LKy6 zPR#N4d3r%!E-e6Na@g5JO$wv|#OnT4oFY>IKqDa`FFk*<4uG9Gt^mM#T}HT}j(4qx ze*pkaI8My~Kuv->hGNtYS?u296>b1cvfg2?S$X?Uhs_0Khh`2mo*iQU>8^Zf}45q7k?e zaWen_Fg=jt{g@9J(=!ZJ(Cd%OzQEmwPyGGaa~}M5zkFps04BI5$F+5|0&tOx7tfxT zdra$(B#IwoP#*#W@s zRVy00Ph? z3;+ORU{ZidU=qCu0+d^J*^H&daB_`YBma|`0PKXW0&^w)>ljF98q82oQ%ysV)(n4; zhCv|^2$A#?L&oSN(kj-!xrWdZe~$pDbEBn$&u zvT%bS0SKfpfrBmNtPOyv>?SEplYIF5@0tJ`xMn|?6o3R|VCG~7AR%1>KtqIJDG3tT z=mTI^4s$RmhBy59-DMfrK!g-vDiTZ&La7@7s9Dnfk_Zby%*+fV1mH)t&!wejq+p9mZ|5s7lb^`$5 zN3aRoLzdlN(m(=c$B_a63F!Rqz<(eCkm%c;0?+;Uhf=hi6tz=O3JVObR3c=EG9s~UDEa;lwf)m+Feydi0z&9|GVJW#xJZ$+OWk)PJ(`TPnrY(0wYOW qX4jAlCu8K`Fov?GX_K)(dCuM-H%A=tv|PNwbL__yF%WZMl>q>k4cgTJ literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-xhdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000000000000000000000000000000000..f1c02e51d285f6960fbc7e1476f2b5c450514e44 GIT binary patch literal 6704 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 GkOKgP3gSor literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-xhdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..d0954ac52f06c9dce911eada06da950e79ad09ac GIT binary patch literal 7182 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_blueprint.webp b/res/android/mipmap-xhdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000000000000000000000000000000000..eb9c22ffa5e836928bb4d7479559ac8a04aacaab GIT binary patch literal 6108 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-xhdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..9ee9d89350fc152dbbd58630cb693edbbf020cd2 GIT binary patch literal 6378 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 RJx<-g$C#Y9A1Mn0;C~R%8TtSK literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_midnight_circuit.webp b/res/android/mipmap-xhdpi/ic_acode_midnight_circuit.webp new file mode 100644 index 0000000000000000000000000000000000000000..881a1aecf98ff2fa8096cc1e1dfe109500c56c94 GIT binary patch literal 4042 zcmV;*4>j;oNk&G(4*&pHMM6+kP&iDs4*&o!U%(d-0mp3{NfKn$uXgeexcb6I5Yhh$ z0K`k^ZsJ3lxXX!x)C-_t#YwNIu?197EjZXNo*s3RzW@e3LS1QhlB(LAcDSOdl7u*c zEZnhBHx`{FA2;+M=?xpH76`DIUQ)xC%$p3W{E`>OkL0L#!rAtx12?g4yUP0ildD&f zxeD+v3juU55(K!7BuSC-zyM|j5gz@w>ctnJ+P1B_nc+tP#dN}v%>VEE36Yggc2xC$ z0x*^opS)IDhzdyn0Evb=1&R^&N<=OGU8bd@Ua3q9Qq)N(KuT2pr0UqgIXm1>#jgyo zb9{gA78VTz0TAH8;|j3j*}OcZgd=JI2ugq+4CmFk*>QLD49@`5j4zRafMp8MkL3gI zo_BDxYyj}X7i9wCJGk->F0il!IvJ5#wv-+Tcmd!{83QyEp#TZM9|0~L?qNa# z5?UDvK$jAo33@1o9NqD2gbpMy{tnrw?|uQmv$oBOB+0h*iK=;6dYGAeaAq+xGjm-- zwYaLqRZZqLb5*bUj7?@{X67n0XLEB?dCF8oh79!^@S|J4P?cOKWfk$YUPGsEULmLf>l%+qPqmr1SdzxXq*nrBsh?+xE=P zwvCl-+q1Q`vuCPpcTd@=9-1WY@)q?>-N~I$P6t&^TMX*Sw$7n3%$GG*~w{C{<2>^mY zu7&E5Iy;I`-JysY0v{qwcFQf`A%?nTZ6X6W0)Uh)f^|%R3g``=Jtn)AdgwN)Tx+b+ z$-LRwW&?Ri;G~Jch5(>^=;8oHa0=A{f=b!j_bt2ibN4a83J4eC+B(IRZOkm;8R`Y$ z9uR>$s5=lr>Q<%++f<)mofnS=)`$o!f~7ssF(n8@G`1E3!QljmD4dAo$V{I?Frgr{ zf*%0DPvJTcA@;B69A}$pW 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-xhdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..96207773f7ba9ce50fab2a210cac5b894db9d234 GIT binary patch literal 4304 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_pixel_party.webp b/res/android/mipmap-xhdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000000000000000000000000000000000..df57252484756402d2e2572409e66383fc91eb8d GIT binary patch literal 4664 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_pixel_party_round.webp b/res/android/mipmap-xhdpi/ic_acode_pixel_party_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..4514e58f715913601810550d1a3d0a3ad47164cd GIT binary patch literal 5044 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 KmoVd$f2je9{3+1@ literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_solar_flare.webp b/res/android/mipmap-xhdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000000000000000000000000000000000..0f217b7e15e9fe50855b7ccf4ca0533b4b954426 GIT binary patch literal 7678 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

48Zx*2-gb5YoB#tKIToLQ?HzIZZlZ)IOlRzQ zt%i903$$(Tou1IIo;Wf-`pENmot4<($w&^abw{n@5HwqW!?6>?PlM^G)X3qZ@hcar zXFo^n%87iPko13>eUNE zBhdh3yayv}Qr#WJ#!~r@uin6 za!G4h1h`89StktEJg=~^R3AMvLyu?{V#6Y6G<|{|f#!CV0y@+sv)YP;)Slr!XFG34_l^Rv20 JgM}^t{{tN5moxwX literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-xhdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000000000000000000000000000000000..fb96a64a8e22d927b25996845489498505bfb72c GIT binary patch literal 4058 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 M^m1xoG(46908FP@-v9sr literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xhdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-xhdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..8d62dfe0b203479e1c043d2993f3aff980b45206 GIT binary patch literal 4402 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000000000000000000000000000000000..28a57cc13bfb0e6d289ad629abf75cb491ec99bf GIT binary patch literal 11232 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_blueprint.webp b/res/android/mipmap-xxhdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000000000000000000000000000000000..78078a8b05f05b29084a315ce24281b08721d1b7 GIT binary patch literal 9498 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-xxhdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b808964308233863c1a88a3ef286ce6d47407aed GIT binary patch literal 10134 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 F{tqQhCh-6O literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_pixel_party.webp b/res/android/mipmap-xxhdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000000000000000000000000000000000..f70c7da9538cdeea5438ddfaf9d9274e508c08fb GIT binary patch literal 6258 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 o`aw3)QKaG~!UAv?H*ppF literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_solar_flare.webp b/res/android/mipmap-xxhdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f172e6cf8dcd6643d30bdafa2ea371c5bff0a14 GIT binary patch literal 12590 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 Q^JmkVEThLy-TPVw024X*cK`qY literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-xxhdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c9ae98cb087f95edff07d51b4f2604ab3cd17613 GIT binary patch literal 12388 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-xxhdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000000000000000000000000000000000..6dc9706dd5b088426cb9f466c1340e0c940b2bf7 GIT binary patch literal 5796 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 UY2s`XQ3YHSg6?Tv_w5DXe+18LO8@`> literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxhdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-xxhdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..44739c9f26d1d65c685898b4d14d4033fbd0826a GIT binary patch literal 6258 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Ⓢ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 T?ZxIV6p26n<3(n%`a7Ot>c9)` literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..8b7a9e5d82d8e123f2674b2b059e315bfcf64e3d GIT binary patch literal 17026 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxxhdpi/ic_acode_blueprint.webp b/res/android/mipmap-xxxhdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000000000000000000000000000000000..04dcc97dd4248367f5e5d8eba91f7c159bbcd1a1 GIT binary patch literal 12508 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxxhdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..63e5981b27087bb78aa55fb9a39997e6b9b24d10 GIT binary patch literal 13212 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit.webp b/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit.webp new file mode 100644 index 0000000000000000000000000000000000000000..d3c296fd15cea2d54da4a2b0f8c2da169a4c5073 GIT binary patch literal 7670 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 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..7483fbb3b9d1df1033399cbdeb332f9878237717 GIT binary patch literal 8332 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 YnUP`}T+{l5ft@H6(W-<8>hV!2q8Ab>1gA-Dv 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 F;D0yrOTYjC literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxxhdpi/ic_acode_solar_flare.webp b/res/android/mipmap-xxxhdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000000000000000000000000000000000..5295472a055ce141966d28bc3f995b585ef8a001 GIT binary patch literal 18510 zcmV(vK3(5T`=RP0NjE?6m3ni|gP+a7A8GG+FFu)b3vaNi#a108iRRrF z&A6#EB{8CvnJs@Mi4lH}*fOO92}%G^mpK`?I9_xxg6v_2hkqlHd`OUJ`#eNQQmnNO zxrx`tJo+IdsgWs37k&^CF~&ubo)>KSF0G|~tuz63%pX)$NkZ9UdqrlB%)D^(>srg! zTD4!ysw~eW@oud##z`l$TjmAkzOL5n9Je$(nf-xPRi~;pYri5%YnYk;hz;A^%={<3 z8q9#l+|A5?z;j$+=5A)*dkvDSk?FKwx*42aG*sDvG~;K>-2mV0LefZPWnRYEhU(w| z-0a4yRb}4B7*%7~TFc!5@P>;rvw$%ybBs|{k`QYxckcl>jM{;bIo6}&T5I`Mr!t^U zBz3H9t&^W`Fu>}@%v5IPYF@&2;J{{H-_1FzssNx+)!;jCOf;zm-}rgH0l)HV9Oi7{ z#)jWBA~tl1bt6ARpLk)djMJPgAR0`WcR$jq4uy^)=CuW^j#?2hKZ2=+Pw=`y0yxF( zd7f92dbrK~`A9wBA0!`TlRXu{#brU`LWG@M~we*gkOl9HI6@O4+kim%y3m;KfKzrd67G}l3xzWZE9iJ% zB1tfT06?J(;mk}1Kq3Jk$U1n%Z@_@fOzjd49r31ct@Mn*C%>#b~rAc(=ZgK7h=Vi1{$Ou3b}WfHiOS(=F; z2;(ZiIOQU*1_1oRGlC$Pn7}qTg?RTo-#s7bNG9GD{n*?LbS0B$Yj%FxKhWuYkL2u? zOmwAbnttEat2a&4{69E6aGK`Rfubnz;d26?3PA5!fkE3gf|BrOeY@R1gNT>_x1jQ@ z06sIy*2{Lm-YGt{lf7K@@L}}ub~m=}u0euN9{B}mEW4b=)&-Uu0R_{Y-lzbfG8t1m zM3A)-RfJJtDtqxpQ~^OiB?7p(3YY~Th(PJ^v6c|C0L7P19I-Xf7iS>(xB%y)08~Df z@~jvwVHH)AP+-Zn3cQ`xfsiV%$-P#%I41f?@Xzp01%M$R%hF`ZA5n)ZSD(fB-?hfos4LE?3tx3+E(h;vMrAd z8YM9)9EuM;uj%; zDt9m73j8XeAhU&#P{=9W$?7aml4Ps4ZQGVw?TZ=qj_$NGLuluTnPIf*v|`(KZ7Z$M zbMGVPqyUpBc=zc*Az$&HA$Qxh<8RK`w(WFnW=+Xd+cq}-1)6NHw!Yt1+uv{Ol%sYV zGn8#5%F_^A1#!*#0N?umsd1xiTUCh~+-(QPjx%(g7c;Ig^RW+U@w#3W~ zV~jqqx9sV*ZPksmZ5wm$b7YF-%t*8p7c)b&tHkgRn3<`{%v8l1Q<0f#%oqw&GH2Kd zr*zJm0YQ@FwoQWp02PiAARQh6V))GNx4-&SD91RwG|AC~qX|c$ykz0Xz$pz!svPX$ z_Phy>vh5N5wiGdFdNaAQI zSg;hik!>5YbMXFT6bDN^E0cnnMbF|?K#dI6UVtqeXa!QKQOhzEYA5MkdG$><8dke;g?izQ;fioH++P@_lF8nmzg)jH9d>UZh~15tbSZjKMoSpBa|%MqAf` z7(zYQSRFoZh=(7np9VAc&+IVuWG{sy;;rz-H%dAoCLNE2OL_HcIA)9`?q#%)8UJkf z7q5OS_%w=f6CV$W8;X*dH_{JOaTqL8A>S$dEwc9vsc-7A)7Qw--gA}bUUr~xAF zkPgfA!2k)Mw)xFsp8UsLy^(KfXrObwIMHLrHn8VNDeZ8zFqBE;T=?dR-E+2y(jQlk5vg+-Yi!xQ#`cdC^)Swa(3b zcmW#3s&}L=9e+A@Dbi3jZ+EPBK<-e*{YAn;E}VD=kzmv?s;(@Sa!Wij&K3vm+4(s% zK5wa5*wlx~Xhv$?NdLJ32=WtaGa2@qex= zM&-_*V3!mlbt%KG8QP6O$~G3P-a{J^A$d<4GyIaUH6*+ffQF7M9v&`?$3GF9)Yn!r zN8PsyL$_jPS&02k-G|qu)Bvss$WFwlyrx)wr+Xcfb^%{EhSM!C)mGfdfG&8gi2Hq4 z2(CCa*PVWsXCBjGBB6pKRlTZTMO77jOnhuCAFn9JW1|e12N5n#XfxtLBa1`k@Qy1v zOPX0X&HO4Sc^LPIz$;*)q9&cwLJY;pQ7Z~Zvo3L<{m>842^i&;r-ua-6@CTiX3cWh zcM3 z81D`W_=b6z!{Z7N5I%GPGy5ts5Ry;Fo!sQCxke;Hf$2oYtSE3T8H}n@X8MXC_~@kN zg%OU6&M9W5HQplz_4;x8j}MGS;afo>L7Pyse0wj09)d6_4HKzQgFd0WvIXLAnVtfC-{+!qeo zM`tyo<#ymwIC^#HXNbB}=Ylgc({jp4`?6=3rR<4wb5)-Q`O_I$om89Z5Up7*i~0<% zm(R)}SW_cyI)0N+nU=dHqI7JbSznp7KY&%dr+{A(Vnqj2oHlVTU9SVm@Dw)3)75oe zJT0Yr_V{8ssB@V;j#{A(I-XQa#fMJeFHo5v1&i=f*Q}!rIllbHVfqC^&qOElP1TV66^9 zAR$rtA%V(=WuZ|9!Fipt%lnBfQ|p_NqhQ5D8Rq|^(YGMsMZ}g03m2~1>B@j?V-6p- zmq(U?8{5@uc#0BK(BQ&D*EfH6~^pY{8`T(pC}WI7qM$q~!f`voO=q#%m=}>)Ap`BMl?i zcDaXrBL(zZ|JH_hb<7$KIUa3JWVCYKBg2xqgaOKrwB)udfjToc+q^h>(J6DD1%AA- z(AzmvRZ-c5P%r^#Nxbt))`ofE%Rl^!tXCxf9WIsWPWf4AE7_<^`z!*dGzw6w*MeX~ zu=#Fru+f6nW?>=2Kj(xHO&6>^(~JZ$yO(j*^l%?Z&XV3*fjTg>ZGYTyV##q_wab~* zqhTC3AmxrrN+b2zncRllcfXF8Y@sS@k~d#W)l`gGqImt4%hjtpUe>^r2$9GWb36(l zSWVm8g=Gfo4RrP{Z8*Qa6js-+m zU_&qkVPp}@W|SKs;Q7WcKrC~uzI)hOvrfHc2b72qI2Q8zG493e`NL=;I+|;Bo?HM4 zg}>eylw_lKaJ>W@zWC8wAyOcPBgZ1x$0C>=!%6ykqS9zK0+|{(BID5s$BLK4p@`D& zeiL`7E#_w@oqe}yLtsv%ggAK2jv(uwQHNKFD5+H`h1`odmB))9PB>QFz|T|6CP4{H zY*9BhWN!jy4AX;SoDfrDi7jEt{g5SO&hu1zLDrlx%nC20h8A3Stg4C(sYP~ju!X0Z z7D!SH;1X~LR~OQ3-nkMsa@5&e>Z?=boPOCq^-x^Q@!k$uF%=W047FsfzHLUjIFQEY z{-c{fADA5ZIuF1GHS}{E;GDKAKqCvx@w-2``@R3|MgT{GR(Qn=2UCnzF2-X|MrE09 zxbxJD$OS_qbMd#bVJJE_IxDtEcR5d6Trk|j;cj$~W#gQ9=}GXqH2-<$YLM}>`#1X= z7gVLkUQ`AZgoMI(QA8h7QIwmFqEpIqaM5%h|BN!M#5w+2P5CBa5-rY}M-Tl#B3J7fL?|un*VD;3a@0@+_>hTEmi~*!P zk)ezoOR-=?YQKa?ykb@Dpb^-;@oIShDMY~Zm<2j+@u}CK+y@#xPiC*EJzB_xVxo^v z>LT`LZj=DXarST-2nwVe;lGC(!n|{XZQiNY#LP`NITM<+Y_)BA0@x`g^ellm3JI{J z^|O2&Bhz)Xfj+PnSqo_iq-tO>bo8;Iu@Nnj7aq(gqLXD0WM24|L}RRT?%@tp^-}1S zG~#b%@ZL|#9(DaQ4h5URZIcD8bI$1|yqpJDZvJbWAks|#l4sLf6wwQwZ?s;vZMB^U z^#*o~Atge@1r^dr1R)@$0wNj0A#YgYbCa6j%s`l0^&j0$L)??pPzgGOkuZ*NULFjh zc-}oDciCnR<=jhQL%@58Cb^T|rf$IByydum_q#9X$I6#9;|6f<5rV7!?qP)qbeb}4 zxZ_5yN^lWaQyqk2FjXV@Ep{WdT~h(_uEBxMJeQBsO+sr;TMZjj0aP3 zE1@bOYt$iMs+0yYQitgHV?yK!_0I`}Zwt;%TWy^O_r!g)+%y~pr7!`${854%mK)?= zcG00|AEZ$5vL)~sep?FdQFDt6@7dGb8Bq{;PjR=h&OoJb$7F>|e|OKieehyln6uKP zj`D=z$$*An0%MNeQcYA)q(Lze4NYBJ?~#y@PD@8(i3OVScwA!dcZn5w@5bhq+XP?qLc(c{KX^&z3GB#Xb$i&F4b0uMoZRC#pGTo(6Op z8}MlkHHgUPg+DNmw$X(OPv~8aTmRONGYEx91kbRi) zmfTloH`l!BpiGWG14q-ip*}zbd*wxrNT5&oc2Tx4`A|@3&F1&~)P2{6H+q?$I z-49Z@FMp2#l4M4Z{P4FCtYY;FpCxT^AzHR2;*AD5z5uJ3^DK2)F%`#aa^iS^#8@U$ zaY*_92*0xPu_0ldMCoWx#RtY8_CP~EE2 zku30BkD$qCS&5dARTbQe{DeEYV=(z>0g$gQMG>`paq_<(-+`vDd1%UHgY~P~@ijTW z;_;Cc6fmO^uE`%IxW}j>N;9&n9qwSJgk9(h$|v!6bv8;JU$t;ErTGkj>Fz}Wspc+? zY4KsExj4g>Azpdz^Wz5{`FG^)f$z|q{v-V+j>IquwD&N=7jY}o>2!}&o#n40VS*~n zuA4n1q`Nort=#Ya2>VFDjGw{5{h;mO?8<#g1pvnC%uo>B`+EfJA-hC?18^!rCVJhO z;6i%>F+UH{=Y1?q9&#)l+PRmrT%$n+%FJ{}q1<<3+#Q2%#9k|4ZfWVzQ5w|2L(_ zKuzu|8HVw4Nbq|1p#7f8dz1SD*ZMd z_5O~~cXXtxuMX3*HYrbG=W@p$&7ViHx=BcO6Ub3Gm-eUW3k);K`PHEWdMQ0U=(vR7 zb#o6UZWcY1H#ZgU==pYRh@-!P&M1%0Z{}n}W&rbQaKRiW^{~annWh^2tExX@`fjz@ zFuxjoX7Q>6FyyD1F@EkUZ^3OjoiJEDg_c~dNyc%En$SLTEg8a^Y{tjeDxmVaJdf|oj!AdQ!chQ_+l<@9Z&aaRHvjjw}7dj@0};~^L2 zr8+fi0=|4N9idw99#rdC65Y%^nh!G`!ql8yDzSPr3C>cF(GL(9lBF+L7`&4Q!Z3HD zxo$}aVOkDG6V1U57rL}Fj;REL;bs{WGfI~ueu_+loYRaJ7c4@c6l?-$hC!NFOowh) za!zPZ)3FsTnoR@@XjXz38cb_}%#@}Y)k(e7GA-UL@-0^;7MkTkCe5egQ>n{q>e9r* zG>vN-qmo=Sm+Ekh5KM44NJ-lyJN!8KvKEUP2htfr5B$`)M6Ww|Nlk&x36uL3%lQ;s zA1nxsO%qE-F1SoC=v#|5;-+fqsCVj88xG~?%9+F+%+C$hKizq_T*$gDZ8=JgWrVrF zPjZY8$|>6oTgw%fRmDqQ{MsD8G`GCQz@s56iW4COgrcy)nqoajV0^CdpMLLpoS|)VWPIyclBx8FIGHpWiXR+FQ1v; zxfp?jr|a>$NOS!*%p&G7yxj!1K35bt$ejn`oLpBXCTiP_dLglqBH_)#m^4}ow>oau zx4PUGm=FvYw=vUZy}>l~)UI&^%A_$dz1E`X3mFB5C>U*76V$bbe5US&dtfv=Xx}a(Bi5pFomtm z{k`rmkVKJDu&K+*w2Qq}n(7)jDsvRzQmlA$_TD10W3v(}igoCF{+AOp~BFr-oP9&rT1NnvQ6DKTR3RV6H*laC@UHOUBsez66qe9HuoKhS~bSnRARe1 zB6JPE9X|yZpu`{{e1|r^+Ux#~_iWA@2wms`p+OoZ&XExyNUN{(3SXZ&po6m=wm%b{ zNq#_FJ~X-^%Zf*>qF@sgKanfaCS?~r&57>ZifJUMx4am(80EcKt2@&+(EUkc=j|8fmXWAU`*AgU=L$9W+b8%mv*GycCsX93%8bth}O*8Et85 zuu#dwgEa88W@kR2iH>;9i;P$O8impozc5#QmBouT8>j}5QgZRRVlsH?m#Az~?V$%* zdquS}vv*_LKVs88WRllYLJgPM%Wv1^C3<=ZP>r_HiZSs;K4~z0>`JbETuc$WLR`8jG zA*hQTYrWPRvSB5(Z4xqXvgjnSyNHICbW2G{h)e)dsr^@N;+%SnY@qU%*kh!kPb?nPtqOdgCM#<{ox5MgUGnUJ3iGDj2M z6r+YrR+Vld^_xsqS0&LHZ6!DC)0#H2Uh?shGc5huB0jfk0$M5vCdl?>A=u z=KJMG^F|{g2x%E3ov>1$S$8ik2K_$1wlXAIq}yAh>~TIibYI<6Q(_$EnBYsUu=)#` z2BJcD|GTdj^$-5^KR^7(r^Sn0l8(Y1M1>giaLPem9E~sc^woGIBtjsi!)%5iD64xk z!t!&EbUg?R+Xm@ou+DrU^DpYqoIbG7#+`Np*v*vOf5Y#J`qO?9PezQ)pWQ0c+{4ZT z_iwo!31I$Ug}_LOJ#w z6m`jedA7uemz%KTB|XlGQY40kwd<+zv@nF*n>+{!!{U!xVWhZ8-h2~ch?!XxPb zeo`ev7Cjw$SXH`?<-r++bpt+Kcv!s$ba*jp-WSK^L)Zp}*bO~s_2YX;56X}A_(;Zd zO^e%loM9-?*wTk7sHD%2pPZwm0inWXt_Z|IfZ!s+ioczC4Zf0PBVhzLU{5alJgt_wx*QY_?Az0kRdV5B_jbZ7Mk=s8nNZUAE{eb2v00|%h;IR-py zEhmfHyiGX`P$blxTESEDXRRCq4S~)mST|uofSkv&fS4~J!!QCsm>4FKv!26FSa;3I zx1A153`+a1=bVYWW7`%No@=LHPo`rE1LIqN$J4vE8D;jfwTbip=Qp{vM_2NM&qeW6DnD*96clW2j2G$-X7RMPWmPv4Q&Ai>!vtB+Pcj!96;0M z-{v!Gu0~FhhIgC>N0#E8{5)hb75I5G=nrU*7luQF9^r~Xw(m-4Z7Gq+d@O>#!@*Mb z4}9of`i#(!=gYn3%e@X3cmf=th`|JWnOEkH5W2TL;hYD8Kvc}#PpMB90zbI%!8)An z5n43$Q5YZd`v|&`H#RI%0|^dZ7d=(z8Gw%a9>nJJ)ffPt$(F|}gGntH0Om#WD$NI{ zc#@);FUozuAB1ZPkXV*b@ol8<7jQbDt*4XdhY4&6of1i61?0RS9N1iVApAe#{KOw% z;)|fL{C)2r1*Q00{`F55H~tm`E@(P=5a*vyemo>QaZl`gfpAWn7Gqc7G+r1cRIEhA z2#GrPcf9Uj`5M&z@!!9gd@TR>x9mR9bzglD{`zyzm!>j)H5sq@c>(V_-Ek!$M+dWW z0oJk-CNQ5G7Or2^QB~=R3PmbmgH@%?7ncwT)b6_R=Y19U?)N;Y)f{w`7!+Y_ImIxz zfq(Jk2mW1TM~4kh*Phx;(uV8J zDZQKNzjWvsYtZ2-!udD7s)CxY7h2Dq0O}V{B7fBPZ?>zjX^Q?Wu(8EMnsR}lN&cGW zd1HkYmX#7Kp&v$Hz04_LJVP*Ssjk9v<+RAf@UPLq-}JJ7?OR1I_M9j*G=BXRPwF-P zY@fSnPel)(v9L*8fxk(Cu>Yw~{bkQViy(2z^#T%BlAl@`K!)ptV^C2a+%RYZzd2Mg z3)~I!JpX{N1~tFVKRSzrwGaNw?|3s5ZnS&LuEK_k|HI$TBx%s@JymjAaFJ{(HdDC) zJ=MV)Pli=)_*aFcv_CnUYXe*4EEvRt$~QyRcu%LyYic;g*23E92gBX{$KI_lZTY~> zx9n5N$7_4t?c%(Ub}5I@JSq^nG$xidXE#pFsOH?9S-9_?UOO%2$4$}1o)vXdmqLSO z6mSM%E;Ez)zDD+r<{v$*wN@e>_x$M}eM#ZA{j?f8K2`)0x70Wd1Eef%a>5}}k-kXN z1r|0a?((OnO#P2Yce-8;V*mEzw-@_3#X-> zC3(s%{>OJN`H{j6yA=9ndkQ@B)KEjpg0PU})%hq8{^xsgXp@03Z7kIqp{=J_~}dXY&{8(?k*@)V|x<56{gU*zkov#=i)7;9m-lmfw5bQTPv^ z&^QIPnM~d+1cFke{gG-he@!rz6@~}(RQWiBX^mUf1JR1_SuxK7V!9@r$aL0#BtfFc zJM^|pF2!A%5qu^_oG^8yaKj!2VP|uN|M&+xg>k}sW2x?is1;a+)G9VW(yXq|#0ZBl zz8=m=`B1f&6;AH!7Z&ub<35iOTirnz~FL5 zwP$C~m(ERdX6ffNdvgWB9tx~PYG}ELN%rT6(Kv8zr2ITQ3o4W|`YmrsbP4DADd2Mm zy0Oa1WOYrzxAy(shaz((g1NCy0M2=osv|RPMPbEPcaGhzy7hQ-h8EbHCF`L`SNw;3 zxakBi<+}?Rj=iGQeCm}GtOJ#<6M{T5rK5f|uQ^-3H7r8SY&YaHoGY0!-|iJ}dAJ&f ze{=+rT}tkf92&IPc3R=aZPx;=Pug`>`RrzZOt_K!AfzOxM4iZL=gq#;>oO-#sbtnW zbYgjyNDHW*v&sdiYf4k(5GF%7&kU9dZJ4&)0PtAPEnxg5o&qJQf_iH$OlpQhO5Pff z&+<%#8&A8i!50Ldv1_id^*E&%lJ;37#X_Fg$%%SRK7UW*+T0SWJn)xnVi2hi$>Kbr zi>YZRxd>GgH#<@-RmEIYFgBtN*JaDowO!D#srLJ~pUpl^jT?()y-w>EU*tIoH*R~@ zu6@#C$61A~r)>-|hn#Kf-~StGVUzgJm%AydV6To7ETr6*IMtBuiegr|U%`IpHgl@w zRL7;*^E6u^2okzkq00=MORNf<=U?)@N6(te=1y9-9^m|yUXhRF)@>hHyMkSFWnst^ zvV9O~vG_dCvTCFI@zp;JyMNj+u`-l51IC@%`BZ2x>UpZceS_B;|Nk`TOjqHlb9b#9 zwLVUaB2Dg!1x#wi1Zuza_b(nk`~&BICFjJ3_SPX)cD4~}sHZ?r@pP+z)YQgP9aX6L zEYV%4b!RT;_s%H8V%gbW^u-(g`xJ800XtS-DC_mGlSo+AGn?z?6hP~WJ>0dU2nz9F>s6#4|oTvND;aC%0E8XmP`l+7H z>MG7Fo;q(vGX9N;r9HT(*DvVK@ z+gr0vm6dbHtia;id#dy443$*XsXkQ~HQSYU5@IdXm*qW-m4)Z37ByCPbMD>Nj7{Fv9@rY zB#6MwdxJXdQdL-#vz)9H7j=67UqY z<}7W`sZY9Ou^ebP+r`BuTk58bw#~oX6VCHQu+WcCIP|i}lWnQKx&sIswvq2zyA<$7 zBP=Z5GgpMO{W#TUgPi^MTi3{e&eH%-M1gU40vaOtp3gC@X`Rt{OK;sVET~~qP*X_r zOvyU(1?)|b32iy+;?$ES#YhIq_0py2#@lp`*4xTfcV*r+KxAiponI?*+nh)V)spMb z;OvYZegYnvD_m%%@BbZG3$-@fXemtC#p!F< zvnu$VItiPI;?-4Mcp658Q7_wCcRCksc;wHaHGh4!8s;!62q34ECDbXeGftZ-Tp!Cg znH-V}X1MxW5|IjO6HGP$DVT)b*d{;IIe%Sb63l{HbpBv;Y7hHoOEtfcOGL&MJ-(AKy!(B>$N$Rb?SsCtde<>5!KLcBU9aC?q&dhWoY8*irn`*V^5jo zo8TU4@IAN#zt3 zG6l0D`dOt;c1Y>G^RS}oc{^}c3f1l=UlwsADqW19sGIE*~SQ<3j+ zXuG`Ys(jZ%CV=mRhuCt@4f!sZo_59P4XF9LKu3yUm@J8qNp#e*!KMZ?8ZT^U2(}iJ~naq{HzvOzW|FT|&mqaF~jKQ`n)>`U<6}UJ5t3dVV+_k>Zq%rX@TAP}v z2@}ygr#O;md97o5Q&T&1)CVVY3Uhu3@K42zJTi-!HLwd>McL_wP>vz%+o2OTa+T*DXm)*;DyU9 zx4$(wYc`QKJhkv?g5wd^aD*5?%>aAFhU0*)KJ8dp-YpuwLEkq&==hy5oMcp+1CRya z<%=nNge+%9d8wvU%hXr9hJGc#p^%Q?vQg=cHTnabrfJ9fuDa^;Z(>8&054oIaVuxq zp%vp^>zEQ~f{-b(q05Xe{zTRD3(Aj!tt&(}laT`>ZeisgZL91RUFB$wbXQjZ}( zq{Fmei9;erz)?6xZt0eK>7M=NU06BmHD8r;2(^X+c9bw_gjh^Vi`J{|A}TJdV$*@o_V*}3nNhINk*;@0gT-e@^{;bBUQ9QNIIAo}>pGV#Qx zO}ZOHOF$E8oLhB*2IsLW=bLS4%)ZD4nv>ID*}aeZmDGqSYh7|E-?uG38?uv6U=tnI zQahi>CrenE;-VQefvC@ItE0>7II07~vEs=zvj+*B!$_)XU5ObqY{(JnP7dJeZ5QC| z;9ZHe2PuBR_dtd~KqO3nTpkhWaKJ%gX=pjS-8fmZxjS-jR->lbF`kZI^`44J^9j#+ z^G2}Hjx9=Zr!LJJe}WGn%{3*xsEOF*Oz8&Al3XDJDXFNMu#V~eI2r(b%U?j?-{DBh z5_54^pZ2Vsq7ID??mJW5euw%PE+^wd(A*E~qwMT~@rZZEU`xIxnDgdh>uiSHxJRRV z)D78}AWIlMZ0$d8v#kvM7U0ZuaXAAthQ%aPk(DgeD2-Ccs8G|GW>0UMWrwkd8dX$- z2N#~IJqju15iXD+BEtufbLXB;o?ND1TK&rSutzacbw0a5;o5D-;@y+Z5i4=eT;bpU z`^kUz2VjE6)asx7MLME`xUGHLDqK)QTlbncWy_VPiWi!{<8n202XndWh zEjjTuk;R%5{DScjWuh&)FgnNiInQF4R?iyj*2&?k7%hyAzl9{OTGk}PB?a@cQmk(10$ z0zJjDK32+V;gTfMp)@-pe3iEF2<{f<|Jw@1Mbo3KW9{str&XPEMay~d3K0`VBFU$6 zv~UR*8XF;=jx>pP8_xiO#mZMevq}kQ40QxuLK(7Qq{1{lZ&f zHJt_7G@RHbN)q2YX=X{UI^W{AKhL&kVA{K2qs!uQU1#F5^%Z`k z>5U)le)}KyV}#$l&u8!Dz|o+f7EUG21uhNW2SazMmmmBpbz~U@m+Q@@8TRHu=3=2? zdWHXpEB=GNsy4j2tPp5X!v2)|>kmD_qL_0Z-N4Db~(UtHK|3CMseBSyu z9 z%gjkiR3RkUhMOA-VK}B_nAYLWz?N=Tf4_H2NN7(@nm6nR>7%%6Q7oa<48BQKq{X7D zGJ&)NNqiODD>HwQOF0YoQyYaHclO?I0~%L_#GFhW=ezjd8OF1qR7aO3;!m8x-apQ0 zivh&8nOkq;{_eNL#FpBYyu6E5i-4vbTjY(9>4}j#U-haL>DSiTACQ;LZxJnt)>9Jh zxfvQ`6|UHYwb7Ls5$@Z`ckzFxC?+RAG09leVPJ+aAsEahI6e~~o9iXGGPA0J-TezP z=1p5<5JMR9>)!r#zq@@3RQ+-TCWt~vx*Vj5(9?pNWr?}oU>E1i6jGAI^aI{R&|UL< zZ<|-?O=!D*JCf|8ihbEJE=}v}tNnX-@*Sm#T za|V*z;?>;H!|4C;M&tBS^c~DpjQxg#SGp-;zyih1q&Q>Y#};;vM8!JPiK;4 zRu%DC*CF4PcGT=lPVboY<{tWs6ckPi@R;S z5;Sdb7$-Y^#RA?Xh7UKbg$wr`; zTWC<9A-p!bIZ=iKjXNf7SQ8z{bSbS4Y-gb2kjlTyi!fSF(@TFezeZG|ESN`(- zhi`W>8sDfjzLswyUFR&Ukja693M<54l17sl`{4ik3BiKbQo`LwQi_#W9sRuv1D|lL z3d`#@sA*AWjuey%b?FW8c)M%9@_hE%abea2{PprrgE$GkW&yGARbKlwAMg6;o!|KA zz2E(7fBDHT{rUS^k6)xEkEX98XyvTIUuLVqSTeu7wjt551l6Ok1haG#EcS@oaQ}lz zNt$xCYTYYbJh$Y;gN5upsOps2Ll+h5FdFvW@3iwbWskN!Eg-tW52>E*X?yQ?p z-b*>j=Y28vDn^TOd#zO93MRuAeri;`SXCRk{8aK|Iw{V_^3W2L&5|`LtkLLvI>BBzdH@&9r^Mtv z=<^3t(INeiysMG<%^VBI(&W9^s9}Ram`|r>c6KlRzx9vC=^G=vDU0mj+)9|NAY?;$ zy;&KqDS$0h4IyqpFY9xdOj4?y#d-R)ug$#5SZp|{&>~*C*9VxINmSwg_gBU$UsA!W zoRVc~m`mr+mwPE8Gv-4tKJ8nZaVFA9qMo83IY$}Dh9DUP2LT=2+(K7KE16j$_^cFy ziDZi9rZfm1;xS?;0-tajv|k1#W=uZ;xly5ZL5i zba)NANpFzM40TdujDn3o8a68lfv>L7h!P|oowp#gKKBrN)b#mYzLRm5w$n6)$t;DM zmrKc>e6KrAlQ1*cStusP+Ej?QcQfAefX}WNRHrJma64DtAG;mz65X{i=RWX}-t9yVT8^Ndr7TuS>d! zg^Y?9Y?;yI{|)wYiz}E-r2%QfSq|z`NBUE?TCEErmQy_Rne~$UJV=`Dj43 zj}bvbDUg%f^*AOvp{yvY=Qv5H=pBdvEKgBDYE-2ezlnW#3}qO$K!oRG&tzU5&5EG! zI_ui(v>BQ>j1jX#kUot@W|{CTwzqNKbnv(f_ zkzylFB~4^fSW6H4gZKm>?M+ejl6``i2GU6)dp@FGYh9ZyYH3|b1W z+J8610|z1p=}D%Fl@~ah7N5+#Mbl-4wy>c+hNfK?A2?RDLkXIbGL;iNm`@l_k@?o3 z)+Q9A4AJ-8$;^uW>;UIBtwYQMN--=S7+_h;GFD5Q8tRFwa%9rK`vl^YS>VEzcCsq_ zx*3v4kW0q>*(%W%Z^b0cI1VlI;Ldka3*sDR&LwjI_aPP~$v+4{f%y7A`*66HIxHrg z#(z`~WtKB$IL41fi!YLFM>)ghV1*=IZ6{jF?0+ev#Al$qg_AWoJYXUwtW26R8uZz+ zW8A9#d&Y07FvptPSRd&PrHdrh?&?l zym#I9XXTdKX=cNTTuG4>fbK-(1$5c|&nq{JheDb}DZv7fMk7lOS3f9@A@gWmSxarxJ3wJY z)S*=}*EQoR*xQMGYxKm{-u$7Jgxc5H>ZC-sf=Cv@F%M2?5T!O+T2gw2pq`{< zr;_48kSPPH(y`S0v{k65wYsU|S^36jF*q%Wduw;ZJk%zfjs+*4y*6ilmEEBk4on=l z^MY$0Ej@FT^Xu_6qW2v#H5j+cYis-qj?ogc<*NiTXPwEJj%TTG#R?uJt4o?Ox>|y` z3o#unf3!lzNCwQElx$3A#`Q}>iFOfRLyMtfX4`-gpg7<3k9$I-4|QR^r%epWx9h$x zBoj_C9aH+9M}FVkX(*oc9gBvW341KP%uF12)_Xyl5F|3E~Q& zJ^|CCnc3H@cd1vf71dNIOIXKdwnj|aW%){)&VKnM@BD3%$i67?SOIY&byV^l-2YqN zVBIWtjsY~gB|#SiL9VwN-u%{O$Qa2eu?bh4PtInlWYB}lGM6u-DgI_Spt=fa-Qa1)9W^NBDDpJRSZeJea%lBM zN$(iKoA5cp@|1xeB+vswTIN~)fsddU#CUtXLnx#xc_}kZlA*=SKYM+trnN`a^YXt~ zoEV&zQ`xf#*bw9eX72JXD;ciBq2l=)hX7_2GRWlA|Ydja=Vcf>TLD$HyM0XYc9_vhCvB2JxHnI+AOK*?-b zU(++v+IiaUpc4;h*x51V8k;ga?;$M7aVZ{C1~af=bGa>l#JN|Hy^B%xoR?TWlB&aUcGx zlpMfbcK0r2aSmX(_gRAqe&-@T>DuUhV)L2r=ue;}*Fj<(ff6VeNfOto?OI3AGOxgf zmik4j;Rtn1qpb12@*Ni%c z`I@9hrjC*46;Q??OG(117I<94J^0k^@kl;#1A$FL4^Hxc#kJuQCi>J(q)z zK1^aR6;A(`t69X{2h*OGV(wt~t^f^12OU)*1(=V>^A=zTk7GvDAmv<%Swl+IJ#g7< zWfPvJ6PowsIIOHBw%<@CSzle8(%2>_R$PUezQKdPT)jxBHl``pWw}o5j*L#~CLdQo z2LVC~B}eHwon6M#2n~P$bJOUd-%Ll9Z39OxtgY(rAWb>KU}*A~sqA`O0q zgXR0?5u!zIc)fZx$+8K(Oq!~7#MHNe88mR>IaWM0`>Z^mq(OH=E{iB6z4CK17GSGyQ_=ppT;` zQW_OI7!>y>sbFe6z&r_AK0cCDIWG@G7A!G(fih6`@VdLK?-{PF0Je}%#3=>NJSzps zSIhJC$^7ALk%vD+2su9H3zBX*cqv(1k@-+41;U-s+JjFy(}9KVdwMzxrXeC1Rb*GEC?1FFtq8(!d+0|@TBT+Z1*9;CA1LnbaD&w)7T zkt$uFP4Cc>k9Or9|@N^FKwBpGeZSU9^GnJQsBV}M)H2ZNo-n^NOVh9QWRyh-;w z3s{02KYwsHFv>sDwU7@bDrH(SNkBDP`CtodMhc`EqZ?P1udi2NG&;cCln=I{u!%~Y z(ne*c7}HJa;i{%fSsa#VG|vxbdZaWVlHCmVhZ6)l4*7Htq8&g+!)+CE-D{`B(lo@L z8EKD)gez}WQUnK=vUGQ0w^W9kz&5TdPjnqtqaw;b1bR#*xRZvGWVGSvL&#F!DB{{z z8gcSa9&IFypopUgEE;tu1;`t~1NuS2I?^En!ZVmnilp6S?A*4Q)jXT2#Qey|v6vXK zMDesyX8h9Ny7?aDoI8=X6;BeG1x56{@F5X;Ec&W4qtoG>9Wv^8@-eM!U?22kq#DgV zJ_s)CM%bv}Ajzn*{5HyxXSC%B{ta%6$or=M`kqov04u?BT%E~_D~XhuiAO$M6BkTz zySda@lN+;{V1^)T@bu9DgO*Q5C4a`3@x=1O?-gWR50`TUym@aEod>u!8nBCJ4^niA zCy4V@HR5I@afZ&DfI9-G5Y$9Satq@}umOX?^n*wI*f8iWF~w zLH-4@l;sr`FQfcJj2@PaW7>^_B#I8+_?c}PQ0nO*O2ItDyyNq5M$|aE=WAv>;UC_6 zD^ZJZlPq|XfHdMMEGsI_BH0m@4~B05Y5gIIvj}12zTqy;j3ot^f99T_;1c-G=j1H+ zE$7TiGlTQ;OkLw{IRsV%F6Wpe5d3pjYJBWyZ&AOD3{RO*N6wG@2%rmz+;JXQ%|+<$$q-~2Oiy@dXAV9G?;OQ(Ke3*VbRGij zIJCQSibNHM>I`f-ZrNvKc)o6Dt7Yd-F!&qk?iRzr_uwqMlv9}xiKX+z6gHis+K}n$ zGG{8;o4lj#4os1m(W?T5kKib5FQ30N{_VDG%S_A3J?XIy1uu6ugx*$M&Vlq+D-S?A z<4JrcACZ9b@l1t1mo5Bb(oT@@IQEVKnOl;Ru)BOQ?*AEgEdk3+%XU0o;TmfVt0_km zt45eaSmMFX%Ebfid9~2sA;(eZEL%B#g^oJ?O&pC@VHT z8nM5yU~}0RVZoXhZ-2 literal 0 HcmV?d00001 diff --git a/res/android/mipmap-xxxhdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..fbe5fb4ce3d0cd1ab9213939a5dc032a8056ee83 GIT binary patch literal 18444 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 f3>YhhXgJ APP_ICON_ALIASES = Map.of( + "default", "MainActivityIconDefault", + "midnight_circuit", "MainActivityIconMidnightCircuit", + "aurora_pulse", "MainActivityIconAuroraPulse", + "terminal_glow", "MainActivityIconTerminalGlow", + "solar_flare", "MainActivityIconSolarFlare", + "blueprint", "MainActivityIconBlueprint", + "pixel_party", "MainActivityIconPixelParty" + ); + private Activity activity; private Context context; private int REQ_PERMISSIONS = 1; @@ -159,6 +169,9 @@ public void run() { } ); return true; + case "set-app-icon": + setAppIcon(arg1, callbackContext); + return true; case "get-cordova-intent": getCordovaIntent(callbackContext); return true; @@ -2185,6 +2198,45 @@ private void setNativeContextMenuDisabled(boolean disabled) { webView.setNativeContextMenuDisabled(disabled); } + /** + * Dynamically changes the app icon by toggling activity-alias components. + * + *

The launcher icon is always represented by an activity-alias (including + * the default icon) so that the running MainActivity component never has to + * be disabled. Disabling the currently running component would make Android + * force-stop/restart the app, so only aliases are toggled here. + * + * @param iconName Icon id (e.g. "midnight_circuit") or "default" to restore + * the original launcher icon. + * @param callback Callback invoked with the result. + */ + private void setAppIcon(String iconName, CallbackContext callback) { + try { + String packageName = context.getPackageName(); + PackageManager pm = context.getPackageManager(); + String key = iconName == null ? "default" : iconName.toLowerCase(); + + if (!APP_ICON_ALIASES.containsKey(key)) { + callback.error("Unknown app icon: " + iconName); + return; + } + + for (Map.Entry entry : APP_ICON_ALIASES.entrySet()) { + boolean enabled = entry.getKey().equals(key); + pm.setComponentEnabledSetting( + new ComponentName(packageName, packageName + "." + entry.getValue()), + enabled + ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED + : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP + ); + } + callback.success(); + } catch (Exception e) { + callback.error(e.toString()); + } + } + private void extractAsset( String assetName, String destinationPath, diff --git a/src/plugins/system/system.d.ts b/src/plugins/system/system.d.ts index aa2ef8bf7f..6131045068 100644 --- a/src/plugins/system/system.d.ts +++ b/src/plugins/system/system.d.ts @@ -295,6 +295,13 @@ interface System { onSuccess?: () => void, onFail?: OnFail, ): void; + /** + * Change the app icon at runtime. + * @param iconName Icon id, e.g. "midnight_circuit", or "default" to restore the original icon + * @param onSuccess + * @param onFail + */ + setAppIcon(iconName: string, onSuccess: OnSuccessBool, onFail: OnFail): void; } interface Window{ diff --git a/src/plugins/system/www/plugin.js b/src/plugins/system/www/plugin.js index 8bebd47efd..c8722e7e4a 100644 --- a/src/plugins/system/www/plugin.js +++ b/src/plugins/system/www/plugin.js @@ -231,6 +231,15 @@ module.exports = { [String(!!disabled)] ); }, + /** + * Change the app icon at runtime. + * @param iconName Icon id, e.g. "midnight_circuit", or "default" to restore the original icon + * @param onSuccess + * @param onFail + */ + setAppIcon: function (iconName, onSuccess, onFail) { + cordova.exec(onSuccess, onFail, 'System', 'set-app-icon', [iconName]); + }, getGlobalSetting: function (key, onSuccess, onFail) { cordova.exec(onSuccess, onFail, 'System', 'get-global-setting', [key]); }, diff --git a/www/icons/ic_acode_aurora_pulse.svg b/www/icons/ic_acode_aurora_pulse.svg new file mode 100644 index 0000000000..f188ae3dde --- /dev/null +++ b/www/icons/ic_acode_aurora_pulse.svg @@ -0,0 +1,37 @@ + + Acode Aurora Pulse app icon + White Acode mark floating over cyan, violet, and pink aurora ribbons. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_blueprint.svg b/www/icons/ic_acode_blueprint.svg new file mode 100644 index 0000000000..129975a8aa --- /dev/null +++ b/www/icons/ic_acode_blueprint.svg @@ -0,0 +1,38 @@ + + Acode Blueprint app icon + Technical blue Acode mark over a crisp drafting grid. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_midnight_circuit.svg b/www/icons/ic_acode_midnight_circuit.svg new file mode 100644 index 0000000000..772e82baf2 --- /dev/null +++ b/www/icons/ic_acode_midnight_circuit.svg @@ -0,0 +1,33 @@ + + Acode Midnight Circuit app icon + Electric blue Acode mark on a midnight circuit board. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_pixel_party.svg b/www/icons/ic_acode_pixel_party.svg new file mode 100644 index 0000000000..40e37b72aa --- /dev/null +++ b/www/icons/ic_acode_pixel_party.svg @@ -0,0 +1,29 @@ + + Acode Pixel Party app icon + White Acode mark with cyan and pink pixel offsets on deep purple. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_solar_flare.svg b/www/icons/ic_acode_solar_flare.svg new file mode 100644 index 0000000000..df2a783193 --- /dev/null +++ b/www/icons/ic_acode_solar_flare.svg @@ -0,0 +1,28 @@ + + Acode Solar Flare app icon + Warm white Acode mark over a vivid radial sunset. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_terminal_glow.svg b/www/icons/ic_acode_terminal_glow.svg new file mode 100644 index 0000000000..f5285aba12 --- /dev/null +++ b/www/icons/ic_acode_terminal_glow.svg @@ -0,0 +1,33 @@ + + Acode Terminal Glow app icon + Phosphor green Acode mark on a dark terminal grid. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 52092e2f08ae8551b90293263b37f5f69d05db5f Mon Sep 17 00:00:00 2001 From: Rohit Kushvaha Date: Thu, 13 Aug 2026 18:49:35 +0530 Subject: [PATCH 2/9] Update src/plugins/system/android/com/foxdebug/system/System.java Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- .../android/com/foxdebug/system/System.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/plugins/system/android/com/foxdebug/system/System.java b/src/plugins/system/android/com/foxdebug/system/System.java index 24e3342aa2..094c4eab6d 100644 --- a/src/plugins/system/android/com/foxdebug/system/System.java +++ b/src/plugins/system/android/com/foxdebug/system/System.java @@ -76,15 +76,19 @@ public class System extends CordovaPlugin { private static final String TAG = "SystemPlugin"; private CallbackContext requestPermissionCallback; - private static final Map APP_ICON_ALIASES = Map.of( - "default", "MainActivityIconDefault", - "midnight_circuit", "MainActivityIconMidnightCircuit", - "aurora_pulse", "MainActivityIconAuroraPulse", - "terminal_glow", "MainActivityIconTerminalGlow", - "solar_flare", "MainActivityIconSolarFlare", - "blueprint", "MainActivityIconBlueprint", - "pixel_party", "MainActivityIconPixelParty" - ); + private static final Map APP_ICON_ALIASES; + + static { + Map aliases = new HashMap<>(); + aliases.put("default", "MainActivityIconDefault"); + aliases.put("midnight_circuit", "MainActivityIconMidnightCircuit"); + aliases.put("aurora_pulse", "MainActivityIconAuroraPulse"); + aliases.put("terminal_glow", "MainActivityIconTerminalGlow"); + aliases.put("solar_flare", "MainActivityIconSolarFlare"); + aliases.put("blueprint", "MainActivityIconBlueprint"); + aliases.put("pixel_party", "MainActivityIconPixelParty"); + APP_ICON_ALIASES = Collections.unmodifiableMap(aliases); + } private Activity activity; private Context context; From 369d3b1a36160deeef746c7f5e97e6b27f9646bd Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Fri, 21 Aug 2026 16:10:07 +0530 Subject: [PATCH 3/9] feat: added frontend --- src/lang/en-us.json | 3 + src/lang/index.d.ts | 3 + src/lib/appIcons.js | 46 ++++++++++ src/lib/settings.js | 1 + src/pages/appIconSetting/appIconSetting.js | 94 ++++++++++++++++++++ src/pages/appIconSetting/appIconSetting.scss | 89 ++++++++++++++++++ src/pages/appIconSetting/index.js | 5 ++ src/settings/appSettings.js | 27 ++++++ tests/unit/appIcons.test.js | 36 ++++++++ 9 files changed, 304 insertions(+) create mode 100644 src/lib/appIcons.js create mode 100644 src/pages/appIconSetting/appIconSetting.js create mode 100644 src/pages/appIconSetting/appIconSetting.scss create mode 100644 src/pages/appIconSetting/index.js create mode 100644 tests/unit/appIcons.test.js diff --git a/src/lang/en-us.json b/src/lang/en-us.json index fa275a3766..95ddfa20fa 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -766,7 +766,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.", "save selected tabs": "Save selected tabs", "close selected tabs": "Close selected tabs", diff --git a/src/lang/index.d.ts b/src/lang/index.d.ts index 076f096961..ad4f4e7c91 100644 --- a/src/lang/index.d.ts +++ b/src/lang/index.d.ts @@ -769,7 +769,10 @@ declare type LangStrings = { "pinned tab": string; "unpin tab before closing": string; "app font": string; + "app icon": string; + "app icon changed": string; "settings-info-app-font-family": string; + "settings-info-app-icon": string; "unsaved selected tabs warning": string; "save selected tabs": string; "close selected tabs": string; diff --git a/src/lib/appIcons.js b/src/lib/appIcons.js new file mode 100644 index 0000000000..e0d814782d --- /dev/null +++ b/src/lib/appIcons.js @@ -0,0 +1,46 @@ +/** + * Available app icons that can be selected from the settings. + * The `id` matches the icon names accepted by `system.setAppIcon`. + * The `image` is a relative path (relative to the www root) to an SVG + * preview that is rendered inside the UI. + */ +export const APP_ICONS = [ + { id: "default", label: "Default", image: "logo.svg" }, + { + id: "midnight_circuit", + label: "Midnight Circuit", + image: "icons/ic_acode_midnight_circuit.svg", + }, + { + id: "aurora_pulse", + label: "Aurora Pulse", + image: "icons/ic_acode_aurora_pulse.svg", + }, + { + id: "terminal_glow", + label: "Terminal Glow", + image: "icons/ic_acode_terminal_glow.svg", + }, + { + id: "solar_flare", + label: "Solar Flare", + image: "icons/ic_acode_solar_flare.svg", + }, + { + id: "blueprint", + label: "Blueprint", + image: "icons/ic_acode_blueprint.svg", + }, + { + id: "pixel_party", + label: "Pixel Party", + image: "icons/ic_acode_pixel_party.svg", + }, +]; + +export const APP_ICON_IDS = APP_ICONS.map((icon) => icon.id); + +export function getAppIconLabel(id) { + const icon = APP_ICONS.find((item) => item.id === id); + return icon ? icon.label : APP_ICONS[0].label; +} diff --git a/src/lib/settings.js b/src/lib/settings.js index 7421f3d2cd..8827faadbc 100644 --- a/src/lib/settings.js +++ b/src/lib/settings.js @@ -217,6 +217,7 @@ class Settings { developerMode: false, shiftClickSelection: true, showShareButton: true, + appIcon: "default", }; this.value = structuredClone(this.#defaultSettings); } diff --git a/src/pages/appIconSetting/appIconSetting.js b/src/pages/appIconSetting/appIconSetting.js new file mode 100644 index 0000000000..f532a7b0d3 --- /dev/null +++ b/src/pages/appIconSetting/appIconSetting.js @@ -0,0 +1,94 @@ +import "./appIconSetting.scss"; +import Page from "components/page"; +import Ref from "html-tag-js/ref"; +import actionStack from "lib/actionStack"; +import { APP_ICONS, getAppIconLabel } from "lib/appIcons"; +import appSettings from "lib/settings"; +import helpers from "utils/helpers"; + +export default function appIconSetting() { + const title = strings["app icon"] || "App icon"; + const $page = Page(title); + const $list = Ref(); + let resolve; + $page.classList.add("app-icon-page"); + + actionStack.push({ + id: "appIcon", + action: () => { + $page.hide(); + $page.removeEventListener("click", clickHandler); + }, + }); + + $page.onhide = () => { + actionStack.remove("appIcon"); + resolve(); + }; + + $page.body =

; + + app.append($page); + renderIcons(); + helpers.showAd(); + + $page.addEventListener("click", clickHandler); + + return new Promise((res) => { + resolve = res; + }); + + function renderIcons() { + const current = appSettings.value.appIcon || "default"; + $list.el.content = APP_ICONS.map((icon) => { + const isCurrent = icon.id === current; + return ( + + ); + }); + } + + async function clickHandler(e) { + const $target = e.target.closest("[data-icon]"); + if (!$target) return; + const iconId = $target.dataset.icon; + await selectIcon(iconId); + } + + async function selectIcon(iconId) { + const current = appSettings.value.appIcon || "default"; + + if (iconId === current) return; + + try { + await new Promise((resolve, reject) => { + system.setAppIcon( + iconId, + async () => { + try { + await appSettings.update({ appIcon: iconId }); + renderIcons(); + resolve(); + } catch (error) { + reject(error); + } + }, + (error) => { + reject(error); + }, + ); + }); + } catch (error) { + helpers.error(error); + } + } +} diff --git a/src/pages/appIconSetting/appIconSetting.scss b/src/pages/appIconSetting/appIconSetting.scss new file mode 100644 index 0000000000..814f6d9e28 --- /dev/null +++ b/src/pages/appIconSetting/appIconSetting.scss @@ -0,0 +1,89 @@ +wc-page.app-icon-page { + background: var(--secondary-color); + + .app-icon-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(7rem, 1fr)); + gap: 0.9rem; + width: 100%; + max-width: 48rem; + margin: 0 auto; + padding: 1rem 1rem 5.5rem; + box-sizing: border-box; + } + + .app-icon-item { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + gap: 0.6rem; + margin: 0; + padding: 1rem 0.75rem; + border: none; + border-radius: 1rem; + background: transparent; + cursor: pointer; + font-family: inherit; + transition: background-color 140ms ease; + + &:focus, + &:active { + background: color-mix( + in srgb, + var(--secondary-color), + var(--popup-text-color) 4% + ); + } + + &.current { + background: color-mix(in srgb, var(--secondary-color), var(--active-color) 10%); + } + + &.current .app-icon-preview { + box-shadow: 0 0 0 2px var(--active-color); + } + } + + .app-icon-preview { + display: block; + width: 4.2rem; + height: 4.2rem; + border-radius: 0.9rem; + overflow: hidden; + background: var(--popup-background-color); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25); + + img { + display: block; + width: 100%; + height: 100%; + object-fit: contain; + } + } + + .app-icon-name { + display: block; + font-size: 0.85rem; + line-height: 1.3; + font-weight: 600; + color: var(--popup-text-color); + text-align: center; + word-break: break-word; + } + + .app-icon-check { + position: absolute; + top: 0.4rem; + right: 0.4rem; + display: flex; + align-items: center; + justify-content: center; + width: 1.2rem; + height: 1.2rem; + border-radius: 50%; + background: var(--active-color); + color: var(--button-text-color); + font-size: 0.8rem; + } +} diff --git a/src/pages/appIconSetting/index.js b/src/pages/appIconSetting/index.js new file mode 100644 index 0000000000..6718f0c619 --- /dev/null +++ b/src/pages/appIconSetting/index.js @@ -0,0 +1,5 @@ +export default function appIconSetting(...args) { + return import( + /* webpackChunkName: "appIconSetting" */ "./appIconSetting" + ).then((module) => module.default(...args)); +} diff --git a/src/settings/appSettings.js b/src/settings/appSettings.js index a7f912f74c..2817bb52ff 100644 --- a/src/settings/appSettings.js +++ b/src/settings/appSettings.js @@ -6,11 +6,13 @@ import loader from "dialogs/loader"; import select from "dialogs/select"; import actions from "handlers/quickTools"; import actionStack from "lib/actionStack"; +import { getAppIconLabel } from "lib/appIcons"; import config from "lib/config"; import fonts from "lib/fonts"; import lang from "lib/lang"; import openFile from "lib/openFile"; import appSettings from "lib/settings"; +import appIconSetting from "pages/appIconSetting"; import FontManager from "pages/fontManager"; import QuickToolsSettings from "pages/quickTools"; import encodings, { getEncoding } from "utils/encodings"; @@ -64,6 +66,17 @@ export default function otherSettings() { info: strings["settings-info-app-fullscreen"], category: categories.interface, }, + { + key: "appIcon", + text: strings["app icon"] || "App icon", + value: values.appIcon || "default", + valueText: (value) => getAppIconLabel(value), + info: + strings["settings-info-app-icon"] || + "Choose the app icon displayed on your device.", + category: categories.interface, + chevron: true, + }, { key: "uiZoom", text: strings["ui zoom"] || "UI zoom", @@ -391,6 +404,20 @@ export default function otherSettings() { FontManager(); return; + case "appIcon": + await appIconSetting(); + { + const item = items.find((i) => i.key === "appIcon"); + if (item) item.value = appSettings.value.appIcon || "default"; + const $value = this.get(".setting-trailing-value"); + if ($value) { + $value.textContent = getAppIconLabel( + appSettings.value.appIcon || "default", + ); + } + } + return; + case "appFont": await fonts.setAppFont(value); break; diff --git a/tests/unit/appIcons.test.js b/tests/unit/appIcons.test.js new file mode 100644 index 0000000000..35309e7dc7 --- /dev/null +++ b/tests/unit/appIcons.test.js @@ -0,0 +1,36 @@ +import { describe, expect, it } from "vitest"; +import { APP_ICONS, getAppIconLabel } from "lib/appIcons"; + +describe("appIcons", () => { + it("exposes the default icon first", () => { + expect(APP_ICONS[0].id).toBe("default"); + }); + + it("includes every runtime icon alias", () => { + expect(APP_ICONS.map((icon) => icon.id)).toEqual([ + "default", + "midnight_circuit", + "aurora_pulse", + "terminal_glow", + "solar_flare", + "blueprint", + "pixel_party", + ]); + }); + + it("references an svg preview for each icon", () => { + for (const icon of APP_ICONS) { + expect(icon.image).toMatch(/\.svg$/); + } + }); + + describe("getAppIconLabel", () => { + it("returns the label for a known icon", () => { + expect(getAppIconLabel("midnight_circuit")).toBe("Midnight Circuit"); + }); + + it("falls back to the default label for unknown icons", () => { + expect(getAppIconLabel("unknown_icon")).toBe("Default"); + }); + }); +}); From 144b2286d6e4bfb50715d98ae2090434f0fb99d1 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Fri, 21 Aug 2026 16:22:27 +0530 Subject: [PATCH 4/9] feat: added frontend --- src/lib/appIcons.js | 4 +- tests/unit/appIcons.test.js | 12 -- www/icons/ic_acode_default.svg | 227 +++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+), 13 deletions(-) create mode 100644 www/icons/ic_acode_default.svg diff --git a/src/lib/appIcons.js b/src/lib/appIcons.js index e0d814782d..44c3343815 100644 --- a/src/lib/appIcons.js +++ b/src/lib/appIcons.js @@ -4,8 +4,10 @@ * The `image` is a relative path (relative to the www root) to an SVG * preview that is rendered inside the UI. */ + +// Update system.java map too if this is updated export const APP_ICONS = [ - { id: "default", label: "Default", image: "logo.svg" }, + { id: "default", label: "Default", image: "icons/ic_acode_default.svg" }, { id: "midnight_circuit", label: "Midnight Circuit", diff --git a/tests/unit/appIcons.test.js b/tests/unit/appIcons.test.js index 35309e7dc7..77df9a0050 100644 --- a/tests/unit/appIcons.test.js +++ b/tests/unit/appIcons.test.js @@ -6,18 +6,6 @@ describe("appIcons", () => { expect(APP_ICONS[0].id).toBe("default"); }); - it("includes every runtime icon alias", () => { - expect(APP_ICONS.map((icon) => icon.id)).toEqual([ - "default", - "midnight_circuit", - "aurora_pulse", - "terminal_glow", - "solar_flare", - "blueprint", - "pixel_party", - ]); - }); - it("references an svg preview for each icon", () => { for (const icon of APP_ICONS) { expect(icon.image).toMatch(/\.svg$/); diff --git a/www/icons/ic_acode_default.svg b/www/icons/ic_acode_default.svg new file mode 100644 index 0000000000..751a762f59 --- /dev/null +++ b/www/icons/ic_acode_default.svg @@ -0,0 +1,227 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b2f3cc67b8a59a06efdfc9853a9cb3f3a597ca10 Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Fri, 21 Aug 2026 16:27:56 +0530 Subject: [PATCH 5/9] fix: add missing entries --- src/lang/ar-ye.json | 3 +++ src/lang/be-by.json | 3 +++ src/lang/bn-bd.json | 3 +++ src/lang/cs-cz.json | 3 +++ src/lang/de-de.json | 3 +++ src/lang/es-sv.json | 3 +++ src/lang/fr-fr.json | 3 +++ src/lang/he-il.json | 3 +++ src/lang/hi-in.json | 3 +++ src/lang/hu-hu.json | 3 +++ src/lang/id-id.json | 3 +++ src/lang/ir-fa.json | 3 +++ src/lang/it-it.json | 3 +++ src/lang/ja-jp.json | 3 +++ src/lang/ko-kr.json | 3 +++ src/lang/ml-in.json | 3 +++ src/lang/mm-unicode.json | 3 +++ src/lang/mm-zawgyi.json | 3 +++ src/lang/pl-pl.json | 3 +++ src/lang/pt-br.json | 3 +++ src/lang/pu-in.json | 3 +++ src/lang/ru-ru.json | 3 +++ src/lang/tl-ph.json | 3 +++ src/lang/tr-tr.json | 3 +++ src/lang/uk-ua.json | 3 +++ src/lang/uz-uz.json | 3 +++ src/lang/vi-vn.json | 3 +++ src/lang/zh-cn.json | 3 +++ src/lang/zh-hant.json | 3 +++ src/lang/zh-tw.json | 3 +++ 30 files changed, 90 insertions(+) diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json index 70ca153df6..473b04bcda 100644 --- a/src/lang/ar-ye.json +++ b/src/lang/ar-ye.json @@ -717,7 +717,10 @@ "pinned tab": "تبويب مثبت", "unpin tab before closing": "قم بإلغاء تثبيت التبويب قبل إغلاقه.", "app font": "خط التطبيق", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "اختيار الخط المستخدم في واجهة التطبيق.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (تشغيل أمر ثنائي)", "lsp-transport-method-websocket": "WebSocket (الاتصال عبر رابط ws/wss)", "lsp-websocket-url": "رابط WebSocket", diff --git a/src/lang/be-by.json b/src/lang/be-by.json index 98f392e34e..d66afe7c82 100644 --- a/src/lang/be-by.json +++ b/src/lang/be-by.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json index 36323c674a..43e6fb41d7 100644 --- a/src/lang/bn-bd.json +++ b/src/lang/bn-bd.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json index 52e5bbb078..4fd8d00241 100644 --- a/src/lang/cs-cz.json +++ b/src/lang/cs-cz.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/de-de.json b/src/lang/de-de.json index d1fb0ed422..caf309f716 100644 --- a/src/lang/de-de.json +++ b/src/lang/de-de.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json index 8c3108cb68..3b6b47ab87 100644 --- a/src/lang/es-sv.json +++ b/src/lang/es-sv.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json index f4edc7a62f..832f1e77b6 100644 --- a/src/lang/fr-fr.json +++ b/src/lang/fr-fr.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/he-il.json b/src/lang/he-il.json index 9d67df02ca..8c9e736a04 100644 --- a/src/lang/he-il.json +++ b/src/lang/he-il.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json index 794624bad6..f859aad689 100644 --- a/src/lang/hi-in.json +++ b/src/lang/hi-in.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json index 2a4d4ae4c4..5039b958ff 100644 --- a/src/lang/hu-hu.json +++ b/src/lang/hu-hu.json @@ -717,7 +717,10 @@ "pinned tab": "Rögzített lap", "unpin tab before closing": "Lap rögzítésének megszüntetése bezárás előtt.", "app font": "Alkalmazás betűtípusa", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Válassza ki az alkalmazás egész felületén használandó betűtípust.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (bináris parancs futtatása)", "lsp-transport-method-websocket": "WebSocket (kapcsolódás ws/wss webcímhez)", "lsp-websocket-url": "WebSocket webcím", diff --git a/src/lang/id-id.json b/src/lang/id-id.json index 4f2baf5c81..056e56d11e 100644 --- a/src/lang/id-id.json +++ b/src/lang/id-id.json @@ -717,7 +717,10 @@ "pinned tab": "Tab yang tersematkan", "unpin tab before closing": "Lepas sematan tab sebelum ditutup.", "app font": "Font Aplikasi", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Pilih font yang digunakan di seluruh antarmuka aplikasi.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (luncurkan perintah biner)", "lsp-transport-method-websocket": "WebSocket (hubungkan ke sebuah URL ws/wss)", "lsp-websocket-url": "URL WebSocket", diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json index b19d8c385d..6a2cd28e9f 100644 --- a/src/lang/ir-fa.json +++ b/src/lang/ir-fa.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/it-it.json b/src/lang/it-it.json index dbb883ce3c..773406b7f4 100644 --- a/src/lang/it-it.json +++ b/src/lang/it-it.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json index ddd1e5b633..e6cd76ce51 100644 --- a/src/lang/ja-jp.json +++ b/src/lang/ja-jp.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json index 20ae0a3146..59b042f120 100644 --- a/src/lang/ko-kr.json +++ b/src/lang/ko-kr.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/ml-in.json b/src/lang/ml-in.json index bcc5171dcf..cdb382f146 100644 --- a/src/lang/ml-in.json +++ b/src/lang/ml-in.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json index 00262a2a54..5d129f6a0d 100644 --- a/src/lang/mm-unicode.json +++ b/src/lang/mm-unicode.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json index 84cf0cfc9f..15a20628ff 100644 --- a/src/lang/mm-zawgyi.json +++ b/src/lang/mm-zawgyi.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json index 1634787b00..08c033ef7d 100644 --- a/src/lang/pl-pl.json +++ b/src/lang/pl-pl.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json index 9f6552f768..bfa58da503 100644 --- a/src/lang/pt-br.json +++ b/src/lang/pt-br.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json index 0cdbc0b314..fea22b68f2 100644 --- a/src/lang/pu-in.json +++ b/src/lang/pu-in.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json index 4095204dc4..032234b11a 100644 --- a/src/lang/ru-ru.json +++ b/src/lang/ru-ru.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json index 509640d0c0..cb4698d93b 100644 --- a/src/lang/tl-ph.json +++ b/src/lang/tl-ph.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json index 327b4556db..f0a5b2faa8 100644 --- a/src/lang/tr-tr.json +++ b/src/lang/tr-tr.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json index 1f14b264af..983a7630f7 100644 --- a/src/lang/uk-ua.json +++ b/src/lang/uk-ua.json @@ -717,7 +717,10 @@ "pinned tab": "Закріплена вкладка", "unpin tab before closing": "Відкріпіть вкладку перед її закриттям.", "app font": "Шрифт програми", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Виберіть шрифт, який буде використовуватися в інтерфейсі програми.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (запуск бінарної команди)", "lsp-transport-method-websocket": "WebSocket (підключення до URL-адреси ws/wss)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json index eec005214b..3d0e77b3c1 100644 --- a/src/lang/uz-uz.json +++ b/src/lang/uz-uz.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json index 4c992e2502..69a9fcc1ed 100644 --- a/src/lang/vi-vn.json +++ b/src/lang/vi-vn.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 377aa0f004..9e80d2ef52 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -717,7 +717,10 @@ "pinned tab": "已固定的标签页", "unpin tab before closing": "关闭前请先取消固定该标签页。", "app font": "应用字体", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "选择在应用界面中使用的字体。", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO(启动可执行命令)", "lsp-transport-method-websocket": "WebSocket(连接到 ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json index 2e450d79c3..f71439ad9f 100644 --- a/src/lang/zh-hant.json +++ b/src/lang/zh-hant.json @@ -717,7 +717,10 @@ "pinned tab": "已固定的標籤頁", "unpin tab before closing": "關閉前請先取消固定該標籤頁。", "app font": "應用字體", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "選擇在應用介面中使用的字體。", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO(啟動可執行命令)", "lsp-transport-method-websocket": "WebSocket(連線至 ws/wss URL)", "lsp-websocket-url": "WebSocket URL", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 734c10caf0..947f624e2e 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", From 90ef3aadf77cecbcc2cc1928d86d02984010a00f Mon Sep 17 00:00:00 2001 From: Ajit Kumar Date: Mon, 7 Sep 2026 18:55:50 +0530 Subject: [PATCH 6/9] fix: icons, new pro icon, icons for free version --- config.xml | 14 + hooks/post-process.js | 6 + package-lock.json | 96 ++--- .../ic_acode_aurora_pulse_background.xml | 6 +- .../ic_acode_aurora_pulse_foreground.xml | 4 +- .../ic_acode_blueprint_background.xml | 6 +- .../ic_acode_blueprint_foreground.xml | 4 +- .../ic_acode_midnight_circuit_background.xml | 6 +- .../ic_acode_midnight_circuit_foreground.xml | 4 +- res/android/drawable/ic_acode_monochrome.xml | 2 +- .../ic_acode_pixel_party_background.xml | 6 +- .../ic_acode_pixel_party_foreground.xml | 6 +- .../drawable/ic_acode_pro_background.xml | 14 + .../drawable/ic_acode_pro_foreground.xml | 47 +++ .../ic_acode_solar_flare_background.xml | 6 +- .../ic_acode_solar_flare_foreground.xml | 4 +- .../ic_acode_terminal_glow_background.xml | 6 +- .../ic_acode_terminal_glow_foreground.xml | 4 +- .../mipmap-anydpi-v26/ic_acode_pro.xml | 6 + .../mipmap-anydpi-v26/ic_acode_pro_round.xml | 6 + src/dialogs/confirm.js | 45 ++- src/handlers/purchase.js | 8 +- src/lang/ar-ye.json | 6 +- src/lang/be-by.json | 6 +- src/lang/bn-bd.json | 6 +- src/lang/cs-cz.json | 6 +- src/lang/de-de.json | 6 +- src/lang/en-us.json | 6 +- src/lang/es-sv.json | 6 +- src/lang/fr-fr.json | 6 +- src/lang/he-il.json | 6 +- src/lang/hi-in.json | 6 +- src/lang/hu-hu.json | 6 +- src/lang/id-id.json | 6 +- src/lang/index.d.ts | 4 + src/lang/ir-fa.json | 6 +- src/lang/it-it.json | 6 +- src/lang/ja-jp.json | 6 +- src/lang/ko-kr.json | 6 +- src/lang/ml-in.json | 6 +- src/lang/mm-unicode.json | 6 +- src/lang/mm-zawgyi.json | 6 +- src/lang/pl-pl.json | 6 +- src/lang/pt-br.json | 6 +- src/lang/pu-in.json | 6 +- src/lang/ru-ru.json | 6 +- src/lang/tl-ph.json | 6 +- src/lang/tr-tr.json | 6 +- src/lang/uk-ua.json | 6 +- src/lang/uz-uz.json | 6 +- src/lang/vi-vn.json | 6 +- src/lang/zh-cn.json | 6 +- src/lang/zh-hant.json | 6 +- src/lang/zh-tw.json | 6 +- src/lib/adRewards.js | 105 ++---- src/lib/appIconSelection.js | 61 ++++ src/lib/appIcons.js | 6 + src/lib/removeAds.js | 154 ++++++-- src/lib/rewardedAd.js | 120 ++++++ src/pages/appIconSetting/appIconSetting.js | 53 ++- .../admob/src/android/cordova/AdMob.kt | 9 + .../admob/src/android/cordova/Generated.kt | 1 + .../admob/src/android/cordova/ads/Rewarded.kt | 14 + src/plugins/admob/src/www/ads/base.ts | 21 +- src/plugins/admob/src/www/ads/rewarded.ts | 5 + src/plugins/admob/src/www/common.ts | 1 + src/plugins/admob/www/admob.js | 32 +- .../android/com/foxdebug/system/System.java | 1 + src/settings/mainSettings.js | 48 +-- tests/admob/adRewards.test.js | 73 ++++ tests/admob/rewardedAd.test.js | 342 ++++++++++++++++++ tests/unit/androidPrepare.test.js | 76 ++++ tests/unit/appIconSelection.test.js | 170 +++++++++ tests/unit/confirm.test.js | 117 ++++++ tests/unit/removeAds.test.js | 171 +++++++++ www/icons/ic_acode_aurora_pulse.svg | 4 +- www/icons/ic_acode_blueprint.svg | 4 +- www/icons/ic_acode_default.svg | 2 +- www/icons/ic_acode_midnight_circuit.svg | 4 +- www/icons/ic_acode_pixel_party.svg | 6 +- www/icons/ic_acode_pro.svg | 29 ++ www/icons/ic_acode_solar_flare.svg | 4 +- www/icons/ic_acode_terminal_glow.svg | 4 +- 83 files changed, 1797 insertions(+), 336 deletions(-) create mode 100644 res/android/drawable/ic_acode_pro_background.xml create mode 100644 res/android/drawable/ic_acode_pro_foreground.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_pro.xml create mode 100644 res/android/mipmap-anydpi-v26/ic_acode_pro_round.xml create mode 100644 src/lib/appIconSelection.js create mode 100644 src/lib/rewardedAd.js create mode 100644 tests/admob/adRewards.test.js create mode 100644 tests/admob/rewardedAd.test.js create mode 100644 tests/unit/androidPrepare.test.js create mode 100644 tests/unit/appIconSelection.test.js create mode 100644 tests/unit/confirm.test.js create mode 100644 tests/unit/removeAds.test.js create mode 100644 www/icons/ic_acode_pro.svg diff --git a/config.xml b/config.xml index d71d196c30..45838a5aa0 100644 --- a/config.xml +++ b/config.xml @@ -93,6 +93,20 @@ + + + + + + + =8.0.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -8830,42 +8815,6 @@ "node": ">=4" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -10678,17 +10627,17 @@ } }, "node_modules/minimizer-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.0.tgz", + "integrity": "sha512-2//60T4S0X1Ug/dqLDOgDaGlZsN1Lv8hf8oB0NOV/KIHSaXlPwXBBIbim79dE2Z7NEs52ES8YHoSv6Lmsk+XNg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.31", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" + "schema-utils": "^4.3.3", + "terser": "^5.51.0" }, "engines": { "node": ">= 10.13.0" @@ -10704,6 +10653,9 @@ "@minify-html/node": { "optional": true }, + "@napi-rs/image": { + "optional": true + }, "@swc/core": { "optional": true }, @@ -10728,12 +10680,21 @@ "html-minifier-terser": { "optional": true }, + "imagemin": { + "optional": true + }, "lightningcss": { "optional": true }, "postcss": { "optional": true }, + "sharp": { + "optional": true + }, + "svgo": { + "optional": true + }, "uglify-js": { "optional": true } @@ -13036,9 +12997,9 @@ } }, "node_modules/terser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.50.0.tgz", - "integrity": "sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==", + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", "dev": true, "license": "BSD-2-Clause", "peer": true, @@ -13699,9 +13660,9 @@ "license": "MIT" }, "node_modules/webpack": { - "version": "5.109.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", - "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", + "version": "5.110.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.110.3.tgz", + "integrity": "sha512-GuizBzRvo9YPpyoNMf3ag7AzxbaW85qrRSqTha345KyJbAFPt3/cMzBM0h+RWg7SK/7DdzRLINP3LvQ0hvr4hg==", "dev": true, "license": "MIT", "peer": true, @@ -13716,11 +13677,10 @@ "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.24.4", "es-module-lexer": "^2.1.0", - "eslint-scope": "5.1.1", "events": "^3.2.0", "graceful-fs": "^4.2.11", "mime-db": "^1.54.0", - "minimizer-webpack-plugin": "^5.6.1", + "minimizer-webpack-plugin": "^5.7.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", diff --git a/res/android/drawable/ic_acode_aurora_pulse_background.xml b/res/android/drawable/ic_acode_aurora_pulse_background.xml index ce30f7f4c3..8a22a85ce9 100644 --- a/res/android/drawable/ic_acode_aurora_pulse_background.xml +++ b/res/android/drawable/ic_acode_aurora_pulse_background.xml @@ -5,7 +5,10 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + + @@ -36,4 +39,5 @@ + diff --git a/res/android/drawable/ic_acode_aurora_pulse_foreground.xml b/res/android/drawable/ic_acode_aurora_pulse_foreground.xml index 99dbb87b8d..be024ec1ed 100644 --- a/res/android/drawable/ic_acode_aurora_pulse_foreground.xml +++ b/res/android/drawable/ic_acode_aurora_pulse_foreground.xml @@ -5,13 +5,13 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + - + diff --git a/res/android/drawable/ic_acode_blueprint_background.xml b/res/android/drawable/ic_acode_blueprint_background.xml index 11b508de04..a5d145a4f7 100644 --- a/res/android/drawable/ic_acode_blueprint_background.xml +++ b/res/android/drawable/ic_acode_blueprint_background.xml @@ -5,7 +5,10 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + + @@ -18,4 +21,5 @@ + diff --git a/res/android/drawable/ic_acode_blueprint_foreground.xml b/res/android/drawable/ic_acode_blueprint_foreground.xml index d48af39543..cadd5f8c44 100644 --- a/res/android/drawable/ic_acode_blueprint_foreground.xml +++ b/res/android/drawable/ic_acode_blueprint_foreground.xml @@ -5,13 +5,13 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + - + diff --git a/res/android/drawable/ic_acode_midnight_circuit_background.xml b/res/android/drawable/ic_acode_midnight_circuit_background.xml index 0ef755aa3b..523498c8a9 100644 --- a/res/android/drawable/ic_acode_midnight_circuit_background.xml +++ b/res/android/drawable/ic_acode_midnight_circuit_background.xml @@ -5,7 +5,10 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + + @@ -21,4 +24,5 @@ + diff --git a/res/android/drawable/ic_acode_midnight_circuit_foreground.xml b/res/android/drawable/ic_acode_midnight_circuit_foreground.xml index 42de5c1761..f5a20b48e5 100644 --- a/res/android/drawable/ic_acode_midnight_circuit_foreground.xml +++ b/res/android/drawable/ic_acode_midnight_circuit_foreground.xml @@ -5,13 +5,13 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + - + diff --git a/res/android/drawable/ic_acode_monochrome.xml b/res/android/drawable/ic_acode_monochrome.xml index 38536a8a9a..7efafe6edf 100644 --- a/res/android/drawable/ic_acode_monochrome.xml +++ b/res/android/drawable/ic_acode_monochrome.xml @@ -5,7 +5,7 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + diff --git a/res/android/drawable/ic_acode_pixel_party_background.xml b/res/android/drawable/ic_acode_pixel_party_background.xml index 2a5fc569c7..885b6071b2 100644 --- a/res/android/drawable/ic_acode_pixel_party_background.xml +++ b/res/android/drawable/ic_acode_pixel_party_background.xml @@ -5,7 +5,10 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + + @@ -18,4 +21,5 @@ + diff --git a/res/android/drawable/ic_acode_pixel_party_foreground.xml b/res/android/drawable/ic_acode_pixel_party_foreground.xml index 2898db06e5..e4de7dcaa6 100644 --- a/res/android/drawable/ic_acode_pixel_party_foreground.xml +++ b/res/android/drawable/ic_acode_pixel_party_foreground.xml @@ -5,19 +5,19 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + - + - + diff --git a/res/android/drawable/ic_acode_pro_background.xml b/res/android/drawable/ic_acode_pro_background.xml new file mode 100644 index 0000000000..17de912b4f --- /dev/null +++ b/res/android/drawable/ic_acode_pro_background.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_pro_foreground.xml b/res/android/drawable/ic_acode_pro_foreground.xml new file mode 100644 index 0000000000..0681f914bd --- /dev/null +++ b/res/android/drawable/ic_acode_pro_foreground.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_solar_flare_background.xml b/res/android/drawable/ic_acode_solar_flare_background.xml index 6f9589c538..d087b0ef40 100644 --- a/res/android/drawable/ic_acode_solar_flare_background.xml +++ b/res/android/drawable/ic_acode_solar_flare_background.xml @@ -5,7 +5,10 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + + @@ -18,4 +21,5 @@ + diff --git a/res/android/drawable/ic_acode_solar_flare_foreground.xml b/res/android/drawable/ic_acode_solar_flare_foreground.xml index 06eeca1ad2..f6dca5d8fe 100644 --- a/res/android/drawable/ic_acode_solar_flare_foreground.xml +++ b/res/android/drawable/ic_acode_solar_flare_foreground.xml @@ -5,13 +5,13 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + - + diff --git a/res/android/drawable/ic_acode_terminal_glow_background.xml b/res/android/drawable/ic_acode_terminal_glow_background.xml index afd79b72b2..36c8d69d38 100644 --- a/res/android/drawable/ic_acode_terminal_glow_background.xml +++ b/res/android/drawable/ic_acode_terminal_glow_background.xml @@ -5,7 +5,10 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + + @@ -18,4 +21,5 @@ + diff --git a/res/android/drawable/ic_acode_terminal_glow_foreground.xml b/res/android/drawable/ic_acode_terminal_glow_foreground.xml index ee65cf2ef5..ea4edbb646 100644 --- a/res/android/drawable/ic_acode_terminal_glow_foreground.xml +++ b/res/android/drawable/ic_acode_terminal_glow_foreground.xml @@ -5,13 +5,13 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + - + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pro.xml b/res/android/mipmap-anydpi-v26/ic_acode_pro.xml new file mode 100644 index 0000000000..0ba93a08ee --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pro.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pro_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_pro_round.xml new file mode 100644 index 0000000000..0ba93a08ee --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pro_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/dialogs/confirm.js b/src/dialogs/confirm.js index e42e360458..d9d187a0cf 100644 --- a/src/dialogs/confirm.js +++ b/src/dialogs/confirm.js @@ -3,16 +3,26 @@ import DOMPurify from "dompurify"; import actionStack from "lib/actionStack"; import restoreTheme from "lib/restoreTheme"; +let nextConfirmId = 0; + /** * Confirm dialog box * @param {string} titleText Title text * @param {string} [message] Alert message * @param {boolean} [isHTML] Whether the message is HTML - * @param {{checkboxText?: string, returnState?: boolean}} [options] + * @param {{checkboxText?: string, returnState?: boolean, signal?: AbortSignal}} [options] * @returns {Promise} */ function confirm(titleText, message, isHTML, options = {}) { return new Promise((resolve) => { + if (options.signal?.aborted) { + resolve( + options.returnState ? { confirmed: false, checked: false } : false, + ); + return; + } + const actionId = `confirm-${++nextConfirmId}`; + let closed = false; if (!message && titleText) { message = titleText; titleText = ""; @@ -42,17 +52,11 @@ function confirm(titleText, message, isHTML, options = {}) { }; const okBtn = tag("button", { textContent: strings.ok, - onclick: function () { - hide(); - resolve(getResponse(true)); - }, + onclick: () => close(true), }); const cancelBtn = tag("button", { textContent: strings.cancel, - onclick: function () { - hide(); - resolve(getResponse(false)); - }, + onclick: cancel, }); const confirmDiv = tag("div", { className: "prompt confirm", @@ -71,24 +75,37 @@ function confirm(titleText, message, isHTML, options = {}) { }); actionStack.push({ - id: "confirm", - action: hideAlert, + id: actionId, + action: cancel, }); app.append(confirmDiv, mask); restoreTheme(true); + options.signal?.addEventListener("abort", cancel, { once: true }); + + function cancel() { + close(false); + } + + function close(confirmed) { + if (closed) return; + closed = true; + options.signal?.removeEventListener("abort", cancel); + hide(); + resolve(getResponse(confirmed)); + } function hideAlert() { confirmDiv.classList.add("hide"); restoreTheme(); setTimeout(() => { - app.removeChild(confirmDiv); - app.removeChild(mask); + confirmDiv.remove(); + mask.remove(); }, 300); } function hide() { - actionStack.remove("confirm"); + actionStack.remove(actionId); hideAlert(); } }); diff --git a/src/handlers/purchase.js b/src/handlers/purchase.js index 394ab9eb6c..980258eba5 100644 --- a/src/handlers/purchase.js +++ b/src/handlers/purchase.js @@ -3,7 +3,11 @@ import helpers from "utils/helpers"; export default function purchaseListener(onpurchase, onerror) { return [ (purchases) => { - const [purchase] = purchases; + const purchase = purchases?.[0]; + if (!purchase) { + onerror?.(strings.failed); + return; + } if (purchase.purchaseState === iap.PURCHASE_STATE_PURCHASED) { if (!purchase.isAcknowledged) { iap.acknowledgePurchase( @@ -36,7 +40,7 @@ export default function purchaseListener(onpurchase, onerror) { } let message = - error === iap.USER_CANCELED ? strings.failed : strings.canceled; + error === iap.USER_CANCELED ? strings.canceled : strings.failed; if (typeof onerror === "function") onerror(message); }, diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json index 473b04bcda..e96e78e135 100644 --- a/src/lang/ar-ye.json +++ b/src/lang/ar-ye.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "هل تريد مشاهدة إعلان بمكافأة لتطبيق أيقونة التطبيق هذه؟", + "rewarded ad unavailable": "الإعلانات بمكافأة غير متاحة الآن. يُرجى المحاولة مرة أخرى.", + "rewarded ad failed": "تعذر إكمال الإعلان. يُرجى المحاولة مرة أخرى.", + "rewarded ad incomplete": "شاهد الإعلان حتى النهاية للحصول على المكافأة." } diff --git a/src/lang/be-by.json b/src/lang/be-by.json index d66afe7c82..6cddef6f07 100644 --- a/src/lang/be-by.json +++ b/src/lang/be-by.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Паглядзець рэкламу з узнагародай, каб ужыць гэты значок праграмы?", + "rewarded ad unavailable": "Рэклама з узнагародай зараз недаступная. Паспрабуйце яшчэ раз.", + "rewarded ad failed": "Не ўдалося завяршыць прагляд рэкламы. Паспрабуйце яшчэ раз.", + "rewarded ad incomplete": "Даглядзіце рэкламу да канца, каб атрымаць узнагароду." } diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json index 43e6fb41d7..166738aff1 100644 --- a/src/lang/bn-bd.json +++ b/src/lang/bn-bd.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "এই অ্যাপ আইকনটি প্রয়োগ করতে একটি পুরস্কারযুক্ত বিজ্ঞাপন দেখবেন?", + "rewarded ad unavailable": "পুরস্কারযুক্ত বিজ্ঞাপন এখন উপলভ্য নেই। অনুগ্রহ করে আবার চেষ্টা করুন।", + "rewarded ad failed": "বিজ্ঞাপনটি সম্পূর্ণ করা যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।", + "rewarded ad incomplete": "পুরস্কার পেতে বিজ্ঞাপনটি সম্পূর্ণ দেখুন।" } diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json index 4fd8d00241..69a1605a87 100644 --- a/src/lang/cs-cz.json +++ b/src/lang/cs-cz.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Chcete zhlédnout reklamu s odměnou a použít tuto ikonu aplikace?", + "rewarded ad unavailable": "Reklamy s odměnou nejsou nyní dostupné. Zkuste to znovu.", + "rewarded ad failed": "Reklamu se nepodařilo dokončit. Zkuste to znovu.", + "rewarded ad incomplete": "Pro získání odměny zhlédněte reklamu až do konce." } diff --git a/src/lang/de-de.json b/src/lang/de-de.json index caf309f716..1efd40fe58 100644 --- a/src/lang/de-de.json +++ b/src/lang/de-de.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Eine belohnte Anzeige ansehen, um dieses App-Symbol anzuwenden?", + "rewarded ad unavailable": "Belohnte Anzeigen sind derzeit nicht verfügbar. Bitte versuche es erneut.", + "rewarded ad failed": "Die Anzeige konnte nicht abgeschlossen werden. Bitte versuche es erneut.", + "rewarded ad incomplete": "Sieh dir die Anzeige bis zum Ende an, um die Belohnung zu erhalten." } diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 95ddfa20fa..53063bc74c 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -838,5 +838,9 @@ "managed": "Managed", "acode service": "Acode Service", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", + "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", + "rewarded ad failed": "The ad could not be completed. Please try again.", + "rewarded ad incomplete": "Finish watching the ad to earn the reward." } diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json index 3b6b47ab87..2147ba35fe 100644 --- a/src/lang/es-sv.json +++ b/src/lang/es-sv.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "¿Ver un anuncio con recompensa para aplicar este icono de la aplicación?", + "rewarded ad unavailable": "Los anuncios con recompensa no están disponibles en este momento. Inténtalo de nuevo.", + "rewarded ad failed": "No se pudo completar el anuncio. Inténtalo de nuevo.", + "rewarded ad incomplete": "Termina de ver el anuncio para obtener la recompensa." } diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json index 832f1e77b6..ac2403ef35 100644 --- a/src/lang/fr-fr.json +++ b/src/lang/fr-fr.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Regarder une publicité récompensée pour appliquer cette icône d’application ?", + "rewarded ad unavailable": "Les publicités récompensées sont indisponibles pour le moment. Réessayez.", + "rewarded ad failed": "La publicité n’a pas pu être terminée. Réessayez.", + "rewarded ad incomplete": "Regardez la publicité jusqu’à la fin pour obtenir la récompense." } diff --git a/src/lang/he-il.json b/src/lang/he-il.json index 8c9e736a04..56b2071a6e 100644 --- a/src/lang/he-il.json +++ b/src/lang/he-il.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "לצפות בפרסומת מתגמלת כדי להחיל את סמל האפליקציה הזה?", + "rewarded ad unavailable": "פרסומות מתגמלות אינן זמינות כרגע. יש לנסות שוב.", + "rewarded ad failed": "לא ניתן היה להשלים את הפרסומת. יש לנסות שוב.", + "rewarded ad incomplete": "יש לצפות בפרסומת עד הסוף כדי לקבל את התגמול." } diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json index bc5f49c45d..a26d5eaae9 100644 --- a/src/lang/hi-in.json +++ b/src/lang/hi-in.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "कॉपी करते टाइम एक्सक्लूज़न्स अप्लाई करें", "settings-info-app-use-file-operation-exclusions": "कॉपी और पेस्ट ऑपरेशन्स के दौरान एक्सक्लूज़न पैटर्न्स से मैच करने वाले फ़ाइल्स और फ़ोल्डर्स स्किप कर।", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "क्या इस ऐप आइकन को लागू करने के लिए इनाम वाला एक विज्ञापन देखना चाहते हैं?", + "rewarded ad unavailable": "इनाम वाले विज्ञापन अभी उपलब्ध नहीं हैं। कृपया फिर से कोशिश करें।", + "rewarded ad failed": "विज्ञापन पूरा नहीं हो सका। कृपया फिर से कोशिश करें।", + "rewarded ad incomplete": "इनाम पाने के लिए विज्ञापन पूरा देखें।" } diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json index 208bdb9148..086b82bb69 100644 --- a/src/lang/hu-hu.json +++ b/src/lang/hu-hu.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Kizárások használata másoláskor", "settings-info-app-use-file-operation-exclusions": "A kizárási mintáknak megfelelő fájlok és mappák kihagyása másoláskor és beillesztéskor.", "horizontal scroll margin": "Vízszintes görgetési margó", - "settings-info-horizontal-scroll-margin": "A leghosszabb sor után egy üres hely lesz hozzáadva a képernyő széléhez, ha a sorok tördelése ki van kapcsolva. Adjon meg egy nem negatív egész pixelértéket." + "settings-info-horizontal-scroll-margin": "A leghosszabb sor után egy üres hely lesz hozzáadva a képernyő széléhez, ha a sorok tördelése ki van kapcsolva. Adjon meg egy nem negatív egész pixelértéket.", + "confirm app icon reward": "Megnézel egy jutalmazott hirdetést az alkalmazásikon beállításához?", + "rewarded ad unavailable": "A jutalmazott hirdetések jelenleg nem érhetők el. Próbáld újra.", + "rewarded ad failed": "A hirdetést nem sikerült befejezni. Próbáld újra.", + "rewarded ad incomplete": "Nézd végig a hirdetést a jutalom megszerzéséhez." } diff --git a/src/lang/id-id.json b/src/lang/id-id.json index 056e56d11e..dd62d02bb0 100644 --- a/src/lang/id-id.json +++ b/src/lang/id-id.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Terapkan pengecualian saat menyalin", "settings-info-app-use-file-operation-exclusions": "Lewati file dan folder yang cocok dengan pola pengecualian selama operasi salin dan tempel.", "horizontal scroll margin": "Margin gulir horizontal", - "settings-info-horizontal-scroll-margin": "Menambahkan ruang kosong setelah baris terpanjang saat pembungkusan kata (word wrap) nonaktif. Masukkan nilai piksel utuh non-negatif apa pun." + "settings-info-horizontal-scroll-margin": "Menambahkan ruang kosong setelah baris terpanjang saat pembungkusan kata (word wrap) nonaktif. Masukkan nilai piksel utuh non-negatif apa pun.", + "confirm app icon reward": "Tonton satu iklan berhadiah untuk menerapkan ikon aplikasi ini?", + "rewarded ad unavailable": "Iklan berhadiah saat ini tidak tersedia. Silakan coba lagi.", + "rewarded ad failed": "Iklan tidak dapat diselesaikan. Silakan coba lagi.", + "rewarded ad incomplete": "Tonton iklan hingga selesai untuk mendapatkan hadiah." } diff --git a/src/lang/index.d.ts b/src/lang/index.d.ts index ad4f4e7c91..84a5387d7c 100644 --- a/src/lang/index.d.ts +++ b/src/lang/index.d.ts @@ -842,6 +842,10 @@ declare type LangStrings = { "acode service": string; "horizontal scroll margin": string; "settings-info-horizontal-scroll-margin": string; + "confirm app icon reward": string; + "rewarded ad unavailable": string; + "rewarded ad failed": string; + "rewarded ad incomplete": string; }; declare var strings: LangStrings; diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json index 6a2cd28e9f..c1ef78a612 100644 --- a/src/lang/ir-fa.json +++ b/src/lang/ir-fa.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "برای اعمال این نماد برنامه، یک تبلیغ پاداش‌دار تماشا می‌کنید؟", + "rewarded ad unavailable": "تبلیغات پاداش‌دار در حال حاضر در دسترس نیستند. لطفاً دوباره تلاش کنید.", + "rewarded ad failed": "تبلیغ کامل نشد. لطفاً دوباره تلاش کنید.", + "rewarded ad incomplete": "برای دریافت پاداش، تبلیغ را تا پایان تماشا کنید." } diff --git a/src/lang/it-it.json b/src/lang/it-it.json index 773406b7f4..775c346e91 100644 --- a/src/lang/it-it.json +++ b/src/lang/it-it.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Guardare un annuncio con ricompensa per applicare questa icona dell’app?", + "rewarded ad unavailable": "Gli annunci con ricompensa non sono disponibili al momento. Riprova.", + "rewarded ad failed": "Non è stato possibile completare l’annuncio. Riprova.", + "rewarded ad incomplete": "Guarda l’annuncio fino alla fine per ottenere la ricompensa." } diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json index e6cd76ce51..326b525fc2 100644 --- a/src/lang/ja-jp.json +++ b/src/lang/ja-jp.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "リワード広告を1本視聴して、このアプリアイコンを適用しますか?", + "rewarded ad unavailable": "現在リワード広告を利用できません。もう一度お試しください。", + "rewarded ad failed": "広告を完了できませんでした。もう一度お試しください。", + "rewarded ad incomplete": "報酬を獲得するには、広告を最後まで視聴してください。" } diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json index 59b042f120..b24526e9f9 100644 --- a/src/lang/ko-kr.json +++ b/src/lang/ko-kr.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "보상형 광고 한 편을 시청하고 이 앱 아이콘을 적용할까요?", + "rewarded ad unavailable": "현재 보상형 광고를 이용할 수 없습니다. 다시 시도해 주세요.", + "rewarded ad failed": "광고를 완료하지 못했습니다. 다시 시도해 주세요.", + "rewarded ad incomplete": "보상을 받으려면 광고를 끝까지 시청하세요." } diff --git a/src/lang/ml-in.json b/src/lang/ml-in.json index cdb382f146..cc44821d8f 100644 --- a/src/lang/ml-in.json +++ b/src/lang/ml-in.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ഈ ആപ്പ് ഐക്കൺ ഉപയോഗിക്കാൻ പ്രതിഫലമുള്ള ഒരു പരസ്യം കാണണോ?", + "rewarded ad unavailable": "പ്രതിഫലമുള്ള പരസ്യങ്ങൾ ഇപ്പോൾ ലഭ്യമല്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", + "rewarded ad failed": "പരസ്യം പൂർത്തിയാക്കാനായില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", + "rewarded ad incomplete": "പ്രതിഫലം ലഭിക്കാൻ പരസ്യം മുഴുവനായി കാണുക." } diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json index 5d129f6a0d..2c0ca208c0 100644 --- a/src/lang/mm-unicode.json +++ b/src/lang/mm-unicode.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ဤအက်ပ်အိုင်ကွန်ကို အသုံးပြုရန် ဆုရကြော်ငြာတစ်ခုကို ကြည့်မလား။", + "rewarded ad unavailable": "ဆုရကြော်ငြာများကို လောလောဆယ် မရနိုင်ပါ။ ထပ်မံကြိုးစားပါ။", + "rewarded ad failed": "ကြော်ငြာကို အဆုံးအထိ မပြသနိုင်ခဲ့ပါ။ ထပ်မံကြိုးစားပါ။", + "rewarded ad incomplete": "ဆုရရှိရန် ကြော်ငြာကို အဆုံးအထိ ကြည့်ပါ။" } diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json index 15a20628ff..0e9f1b919e 100644 --- a/src/lang/mm-zawgyi.json +++ b/src/lang/mm-zawgyi.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ဤအက္ပ္အိုင္ကြန္ကို အသုံးျပဳရန္ ဆုရေၾကာ္ျငာတစ္ခုကို ၾကည့္မလား။", + "rewarded ad unavailable": "ဆုရေၾကာ္ျငာမ်ားကို ေလာေလာဆယ္ မရႏိုင္ပါ။ ထပ္မံႀကိဳးစားပါ။", + "rewarded ad failed": "ေၾကာ္ျငာကို အဆုံးအထိ မျပသႏိုင္ခဲ့ပါ။ ထပ္မံႀကိဳးစားပါ။", + "rewarded ad incomplete": "ဆုရရွိရန္ ေၾကာ္ျငာကို အဆုံးအထိ ၾကည့္ပါ။" } diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json index 08c033ef7d..843821641a 100644 --- a/src/lang/pl-pl.json +++ b/src/lang/pl-pl.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Obejrzeć reklamę z nagrodą, aby zastosować tę ikonę aplikacji?", + "rewarded ad unavailable": "Reklamy z nagrodą są teraz niedostępne. Spróbuj ponownie.", + "rewarded ad failed": "Nie udało się ukończyć reklamy. Spróbuj ponownie.", + "rewarded ad incomplete": "Obejrzyj reklamę do końca, aby otrzymać nagrodę." } diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json index bfa58da503..6ac0faea49 100644 --- a/src/lang/pt-br.json +++ b/src/lang/pt-br.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Assistir a um anúncio com recompensa para aplicar este ícone do aplicativo?", + "rewarded ad unavailable": "Os anúncios com recompensa estão indisponíveis no momento. Tente novamente.", + "rewarded ad failed": "Não foi possível concluir o anúncio. Tente novamente.", + "rewarded ad incomplete": "Assista ao anúncio até o fim para receber a recompensa." } diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json index fea22b68f2..c0030f7bb2 100644 --- a/src/lang/pu-in.json +++ b/src/lang/pu-in.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ਕੀ ਇਸ ਐਪ ਆਈਕਨ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਇੱਕ ਇਨਾਮ ਵਾਲਾ ਇਸ਼ਤਿਹਾਰ ਦੇਖਣਾ ਹੈ?", + "rewarded ad unavailable": "ਇਨਾਮ ਵਾਲੇ ਇਸ਼ਤਿਹਾਰ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", + "rewarded ad failed": "ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਨਹੀਂ ਹੋ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", + "rewarded ad incomplete": "ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਦੇਖੋ।" } diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json index 032234b11a..3fa063c1db 100644 --- a/src/lang/ru-ru.json +++ b/src/lang/ru-ru.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Посмотреть рекламу с вознаграждением, чтобы применить этот значок приложения?", + "rewarded ad unavailable": "Реклама с вознаграждением сейчас недоступна. Повторите попытку.", + "rewarded ad failed": "Не удалось завершить просмотр рекламы. Повторите попытку.", + "rewarded ad incomplete": "Досмотрите рекламу до конца, чтобы получить награду." } diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json index cb4698d93b..2d9d72f94c 100644 --- a/src/lang/tl-ph.json +++ b/src/lang/tl-ph.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Manood ng isang ad na may gantimpala upang gamitin ang icon na ito ng app?", + "rewarded ad unavailable": "Hindi available ngayon ang mga ad na may gantimpala. Pakisubukang muli.", + "rewarded ad failed": "Hindi nakumpleto ang ad. Pakisubukang muli.", + "rewarded ad incomplete": "Tapusin ang panonood ng ad upang makuha ang gantimpala." } diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json index f0a5b2faa8..407ca5a8dc 100644 --- a/src/lang/tr-tr.json +++ b/src/lang/tr-tr.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Bu uygulama simgesini kullanmak için bir ödüllü reklam izlensin mi?", + "rewarded ad unavailable": "Ödüllü reklamlar şu anda kullanılamıyor. Lütfen tekrar deneyin.", + "rewarded ad failed": "Reklam tamamlanamadı. Lütfen tekrar deneyin.", + "rewarded ad incomplete": "Ödülü kazanmak için reklamı sonuna kadar izleyin." } diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json index 983a7630f7..d4817eb12a 100644 --- a/src/lang/uk-ua.json +++ b/src/lang/uk-ua.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Переглянути рекламу з винагородою, щоб застосувати цю піктограму застосунку?", + "rewarded ad unavailable": "Реклама з винагородою зараз недоступна. Спробуйте ще раз.", + "rewarded ad failed": "Не вдалося завершити перегляд реклами. Спробуйте ще раз.", + "rewarded ad incomplete": "Додивіться рекламу до кінця, щоб отримати винагороду." } diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json index 3d0e77b3c1..da3c2725e4 100644 --- a/src/lang/uz-uz.json +++ b/src/lang/uz-uz.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Ushbu ilova belgisini qo‘llash uchun bitta mukofotli reklamani ko‘rasizmi?", + "rewarded ad unavailable": "Mukofotli reklamalar hozir mavjud emas. Qayta urinib ko‘ring.", + "rewarded ad failed": "Reklamani yakunlab bo‘lmadi. Qayta urinib ko‘ring.", + "rewarded ad incomplete": "Mukofotni olish uchun reklamani oxirigacha tomosha qiling." } diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json index 69a9fcc1ed..69f567b7ac 100644 --- a/src/lang/vi-vn.json +++ b/src/lang/vi-vn.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Xem một quảng cáo có thưởng để áp dụng biểu tượng ứng dụng này?", + "rewarded ad unavailable": "Quảng cáo có thưởng hiện không khả dụng. Vui lòng thử lại.", + "rewarded ad failed": "Không thể hoàn tất quảng cáo. Vui lòng thử lại.", + "rewarded ad incomplete": "Xem hết quảng cáo để nhận phần thưởng." } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 9e80d2ef52..aaf2d0813f 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "复制时应用排除项", "settings-info-app-use-file-operation-exclusions": "在复制和粘贴操作期间,跳过符合排除规则的文件和文件夹。", "horizontal scroll margin": "水平滚动边距", - "settings-info-horizontal-scroll-margin": "在关闭自动换行时,为最长行的末尾添加空白区域。请输入任意非负整数的像素值。" + "settings-info-horizontal-scroll-margin": "在关闭自动换行时,为最长行的末尾添加空白区域。请输入任意非负整数的像素值。", + "confirm app icon reward": "观看一条激励广告以应用此应用图标?", + "rewarded ad unavailable": "激励广告暂时不可用,请重试。", + "rewarded ad failed": "广告未能完成,请重试。", + "rewarded ad incomplete": "请完整观看广告以获得奖励。" } diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json index f71439ad9f..bf2ac76f22 100644 --- a/src/lang/zh-hant.json +++ b/src/lang/zh-hant.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "複製時應用排除項", "settings-info-app-use-file-operation-exclusions": "在複製和粘貼操作期間,跳過符合排除規則的文件和文件夾。", "horizontal scroll margin": "水平滾動邊距", - "settings-info-horizontal-scroll-margin": "在關閉自動換行時,爲最長行的末尾添加空白區域。請輸入任意非負整數的像素值。" + "settings-info-horizontal-scroll-margin": "在關閉自動換行時,爲最長行的末尾添加空白區域。請輸入任意非負整數的像素值。", + "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", + "rewarded ad unavailable": "獎勵廣告暫時無法使用,請再試一次。", + "rewarded ad failed": "廣告未能完成,請再試一次。", + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 947f624e2e..1204930d69 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -838,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", + "rewarded ad unavailable": "獎勵廣告目前無法使用,請再試一次。", + "rewarded ad failed": "廣告未能完成,請再試一次。", + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" } diff --git a/src/lib/adRewards.js b/src/lib/adRewards.js index b5b0b22e48..459226dd79 100644 --- a/src/lib/adRewards.js +++ b/src/lib/adRewards.js @@ -3,13 +3,15 @@ import { createRewardStateLifecycle, isRewardPassActive, } from "./adRewardBannerPolicy.mjs"; -import auth from "./auth"; import config from "./config"; +import showRewardedAd, { + isRewardedAdSupported, + isWatchingRewardedAd, +} from "./rewardedAd"; import secureAdRewardState from "./secureAdRewardState"; -import { adUnitIdRewarded, setBannerSuppressed } from "./startAd"; +import { setBannerSuppressed } from "./startAd"; const ONE_HOUR = 60 * 60 * 1000; -const REWARDED_RESULT_TIMEOUT_MS = 90 * 1000; const OFFERS = [ { @@ -153,78 +155,19 @@ async function getRewardIdentity() { } } -async function createRewardedAd(offer, step, sessionId) { - if (!admob?.RewardedAd) { - throw new Error("Rewarded ads are not available in this build."); - } - - const userId = await getRewardIdentity(); - const customData = [ - `session=${sessionId}`, - `offer=${offer.id}`, - `step=${step}`, - `ads=${offer.adsRequired}`, - ].join("&"); - - return new admob.RewardedAd({ - adUnitId: adUnitIdRewarded, +async function showRewardedStep(offer, step, sessionId) { + const earned = await showRewardedAd({ serverSideVerification: { - userId, - customData, + userId: await getRewardIdentity(), + customData: [ + `session=${sessionId}`, + `offer=${offer.id}`, + `step=${step}`, + `ads=${offer.adsRequired}`, + ].join("&"), }, }); -} - -function waitForRewardedResult(ad) { - return new Promise((resolve, reject) => { - let earned = false; - let settled = false; - const timeoutId = setTimeout(() => { - fail( - new Error("Rewarded ad timed out before completion. Please try again."), - ); - }, REWARDED_RESULT_TIMEOUT_MS); - - const finish = (result) => { - if (settled) return; - settled = true; - clearTimeout(timeoutId); - resolve(result); - }; - - const fail = (error) => { - if (settled) return; - settled = true; - clearTimeout(timeoutId); - reject( - error instanceof Error - ? error - : new Error(error?.message || "Rewarded ad failed."), - ); - }; - - ad.on("reward", () => { - earned = true; - }); - - ad.on("dismiss", () => { - finish({ earned }); - }); - - ad.on("showfail", fail); - ad.on("loadfail", fail); - }); -} - -async function showRewardedStep(offer, step, sessionId) { - const rewardedAd = await createRewardedAd(offer, step, sessionId); - const resultPromise = waitForRewardedResult(rewardedAd); - await rewardedAd.load(); - await rewardedAd.show(); - const result = await resultPromise; - if (!result.earned) { - throw new Error("Reward not earned. The ad was closed before completion."); - } + if (!earned) throw new Error(strings["rewarded ad incomplete"]); } export default { @@ -285,13 +228,13 @@ export default { return Boolean(!config.HAS_PRO && !this.isAdFreeActive()); }, isRewardedSupported() { - return Boolean(!config.HAS_PRO && admob?.RewardedAd && adUnitIdRewarded); + return isRewardedAdSupported(); }, getRewardedUnavailableReason() { if (config.HAS_PRO) { return "Ads are already disabled on this build."; } - if (!admob?.RewardedAd) { + if (!isRewardedAdSupported()) { return "Rewarded ads are unavailable on this device."; } return ""; @@ -303,7 +246,7 @@ export default { }; }, isWatchingReward() { - return Boolean(activeWatchPromise); + return Boolean(activeWatchPromise) || isWatchingRewardedAd(); }, async watchOffer(offerId, { onStep } = {}) { if (activeWatchPromise) { @@ -318,18 +261,18 @@ export default { throw new Error(this.getRewardedUnavailableReason()); } - await rewardLifecycle.refresh({ notifyExpiry: false }); - const redemptionStatus = this.canRedeemNow(); - if (!redemptionStatus.ok) { - throw new Error(redemptionStatus.reason); - } - const sessionId = typeof crypto?.randomUUID === "function" ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`; activeWatchPromise = (async () => { + await rewardLifecycle.refresh({ notifyExpiry: false }); + const redemptionStatus = this.canRedeemNow(); + if (!redemptionStatus.ok) { + throw new Error(redemptionStatus.reason); + } + for (let step = 1; step <= offer.adsRequired; step += 1) { onStep?.({ step, diff --git a/src/lib/appIconSelection.js b/src/lib/appIconSelection.js new file mode 100644 index 0000000000..feced46132 --- /dev/null +++ b/src/lib/appIconSelection.js @@ -0,0 +1,61 @@ +import toast from "components/toast"; +import confirm from "dialogs/confirm"; +import helpers from "utils/helpers"; +import adRewards from "./adRewards"; +import { APP_ICONS } from "./appIcons"; +import config from "./config"; +import { requestProPurchase } from "./removeAds"; +import showRewardedAd from "./rewardedAd"; +import appSettings from "./settings"; + +// Also exclude a newly opened picker while an earlier native change is pending. +let selecting = false; + +export default function createAppIconSelection({ signal, onBusy, onChange }) { + return async function selectIcon(iconId) { + const icon = APP_ICONS.find(({ id }) => id === iconId); + if (!icon || selecting || signal.aborted) return; + if (iconId === (appSettings.value.appIcon || "default")) return; + + selecting = true; + onBusy(true); + try { + if (icon.requiresPro && !config.HAS_PRO) { + await requestProPurchase({ signal }); + return; + } + if (iconId !== "default" && adRewards.canShowAds()) { + const confirmed = await confirm( + strings["app icon"], + strings["confirm app icon reward"], + false, + { signal }, + ); + if (!confirmed || signal.aborted) return; + // Pro or a pass may have become active while confirmation was open. + if (adRewards.canShowAds()) { + const earned = await showRewardedAd({ signal }); + if (signal.aborted) return; + if (!earned) { + toast(strings["rewarded ad incomplete"]); + return; + } + } + } + if (signal.aborted || (icon.requiresPro && !config.HAS_PRO)) return; + await helpers.promisify(system.setAppIcon, iconId); + // Once Android has applied the change, keep persisted state in sync + // even if the picker closed while the native callback was in flight. + await appSettings.update({ appIcon: iconId }, false); + if (!signal.aborted) { + onChange(); + toast(strings["app icon changed"]); + } + } catch (error) { + if (!signal.aborted) helpers.error(error); + } finally { + selecting = false; + if (!signal.aborted) onBusy(false); + } + }; +} diff --git a/src/lib/appIcons.js b/src/lib/appIcons.js index 44c3343815..3ad3737683 100644 --- a/src/lib/appIcons.js +++ b/src/lib/appIcons.js @@ -8,6 +8,12 @@ // Update system.java map too if this is updated export const APP_ICONS = [ { id: "default", label: "Default", image: "icons/ic_acode_default.svg" }, + { + id: "pro", + label: "Acode Pro", + image: "icons/ic_acode_pro.svg", + requiresPro: true, + }, { id: "midnight_circuit", label: "Midnight Circuit", diff --git a/src/lib/removeAds.js b/src/lib/removeAds.js index b825b7aeb0..fcb0bcb3b9 100644 --- a/src/lib/removeAds.js +++ b/src/lib/removeAds.js @@ -1,36 +1,138 @@ +import toast from "components/toast"; +import confirm from "dialogs/confirm"; +import loader from "dialogs/loader"; import purchaseListener from "handlers/purchase"; -import config from "./config.js"; -import { BANNER_SUPPRESSION_REASON, setBannerSuppressed } from "./startAd.js"; +import helpers from "utils/helpers"; +import auth from "./auth"; +import config from "./config"; +import customTab from "./customTab"; +import { BANNER_SUPPRESSION_REASON, setBannerSuppressed } from "./startAd"; -/** - * Remove ads after purchase - * @returns {Promise} - */ -export default function removeAds() { - return new Promise((resolve, reject) => { - iap.getProducts(["acode_pro_new"], (products) => { - const [product] = products; +let activePurchase = null; +let activeRequest = null; - iap.setPurchaseUpdatedListener(...purchaseListener(onpurchase, reject)); +function enablePro() { + config.HAS_PRO = true; + setBannerSuppressed(BANNER_SUPPRESSION_REASON.PRO, true); +} - iap.purchase( - product.productId, - (code) => { - // ignore - }, - (err) => { - alert(strings.error, err); +/** Purchase Pro through Play billing. Resolves only after purchase confirmation. */ +export default function removeAds({ signal } = {}) { + if (signal?.aborted) return Promise.reject(strings.canceled); + if (activePurchase) return activePurchase; + activePurchase = new Promise((resolve, reject) => { + let settled = false; + let launched = false; + let purchased = false; + function cancel() { + if (!launched) fail(strings.canceled); + } + function fail(error) { + if (settled) return; + settled = true; + signal?.removeEventListener("abort", cancel); + reject(error); + } + function onpurchase() { + // A pending purchase can be confirmed after the caller has settled. + if (purchased) return; + purchased = true; + settled = true; + signal?.removeEventListener("abort", cancel); + enablePro(); + // The cache is reverified by the existing startup purchase checks. + try { + localStorage.setItem("acode_pro", "true"); + } catch (error) { + console.warn("Unable to cache Pro purchase", error); + } + toast(strings["thank you :)"]); + resolve(); + } + signal?.addEventListener("abort", cancel, { once: true }); + try { + iap.getProducts( + ["acode_pro_new"], + (products) => { + if (settled) return; + try { + const product = products?.find( + ({ productId }) => productId === "acode_pro_new", + ); + if (!product) return fail(strings["no-product-info"]); + iap.setPurchaseUpdatedListener( + ...purchaseListener(onpurchase, fail), + ); + launched = true; + iap.purchase(product.productId, () => {}, fail); + } catch (error) { + fail(error); + } }, + fail, ); - }); + } catch (error) { + fail(error); + } + }).finally(() => { + activePurchase = null; + }); + return activePurchase; +} - function onpurchase() { - resolve(null); - // For caching, later verified so no need to worry about - localStorage.setItem("acode_pro", "true"); - config.HAS_PRO = true; - setBannerSuppressed(BANNER_SUPPRESSION_REASON.PRO, true); - toast(strings["thank you :)"]); +/** Reuse the Remove ads entry point; external checkout completes via its intent. */ +export function requestProPurchase({ signal } = {}) { + if (signal?.aborted) return Promise.resolve(false); + if (config.HAS_PRO) return Promise.resolve(true); + if (activeRequest) return activeRequest; + activeRequest = (async () => { + if (!helpers.shouldAllowExternalPurchase()) { + try { + await removeAds({ signal }); + return config.HAS_PRO; + } catch (error) { + if ( + error === strings.canceled || + error === globalThis.iap?.USER_CANCELED + ) + return false; + throw error; + } + } + + loader.create(strings.login, strings["loading..."]); + try { + let user = await auth.getLoggedInUser(); + if (signal?.aborted) return false; + if (!user) { + // Dismiss the modal loader so Android Back can cancel confirmation. + loader.destroy(); + const confirmed = await confirm( + strings.confirm, + strings["confirm-login"], + false, + { signal }, + ); + if (!confirmed || signal?.aborted) return false; + loader.create(strings.login, strings["loading..."]); + await auth.login(); + if (signal?.aborted) return false; + user = await auth.getLoggedInUser(); + } + if (signal?.aborted) return false; + if (!user) throw new Error(strings.failed); + if (user.acode_pro) { + enablePro(); + return true; + } + } finally { + loader.destroy(); } + if (signal?.aborted) return false; + await customTab(`${config.BASE_URL}/pro?redirect=app`); + return config.HAS_PRO; + })().finally(() => { + activeRequest = null; }); + return activeRequest; } diff --git a/src/lib/rewardedAd.js b/src/lib/rewardedAd.js new file mode 100644 index 0000000000..fcb375b6e5 --- /dev/null +++ b/src/lib/rewardedAd.js @@ -0,0 +1,120 @@ +import config from "./config"; +import startAd, { + adUnitIdRewarded, + getPrivacyState, + initialized, +} from "./startAd"; + +const RESULT_TIMEOUT_MS = 90_000; +let active = false; +let nextId = 0; + +export function isRewardedAdSupported() { + return Boolean( + !config.HAS_PRO && + typeof admob !== "undefined" && + admob.RewardedAd && + window.ANDROID_SDK_INT >= 29 && + adUnitIdRewarded, + ); +} + +export function isWatchingRewardedAd() { + return active; +} + +/** Show one reward, without granting an ad-free pass or applying its reward. */ +export default function showRewardedAd({ + serverSideVerification, + signal, +} = {}) { + if (signal?.aborted) return Promise.resolve(false); + if (active || !isRewardedAdSupported()) { + return Promise.reject(new Error(strings["rewarded ad unavailable"])); + } + active = true; + return new Promise((resolve, reject) => { + let earned = false; + let settled = false; + let presenting = false; + let cleaned = false; + const unsubscribe = []; + const timeout = setTimeout( + () => finish(new Error(strings["rewarded ad failed"])), + RESULT_TIMEOUT_MS, + ); + + function cleanup() { + // A cancelled/timed-out caller must not allow another full-screen ad + // until the native ad actually dismisses (show() resolves on opening). + if (presenting || cleaned) return; + cleaned = true; + for (const off of unsubscribe.splice(0)) off(); + active = false; + } + + function finish(error, result = false) { + if (!settled) { + settled = true; + clearTimeout(timeout); + signal?.removeEventListener("abort", cancel); + if (error) reject(error); + else resolve(result); + } + cleanup(); + } + + function cancel() { + finish(null); + } + + signal?.addEventListener("abort", cancel, { once: true }); + void (async () => { + await startAd(); + if (settled) return; + if ( + !isRewardedAdSupported() || + !initialized || + !getPrivacyState().canRequestAds + ) { + throw new Error(strings["rewarded ad unavailable"]); + } + const ad = new admob.RewardedAd({ + id: `acode-reward-${++nextId}`, + adUnitId: adUnitIdRewarded, + ...(serverSideVerification ? { serverSideVerification } : {}), + }); + unsubscribe.push( + ad.on("reward", () => { + if (!settled) earned = true; + }), + ad.on("dismiss", () => { + presenting = false; + finish(null, earned && !signal?.aborted); + }), + ad.on("showfail", () => { + presenting = false; + finish(new Error(strings["rewarded ad failed"])); + }), + ad.on("loadfail", () => + finish(new Error(strings["rewarded ad failed"])), + ), + () => { + void ad.destroy().catch((error) => { + console.warn("Failed to destroy rewarded ad", error); + }); + }, + ); + await ad.load(); + if (settled) return; + presenting = true; + if ((await ad.show()) === false) { + presenting = false; + finish(new Error(strings["rewarded ad failed"])); + } + })().catch(() => { + presenting = false; + finish(new Error(strings["rewarded ad failed"])); + }); + }); +} diff --git a/src/pages/appIconSetting/appIconSetting.js b/src/pages/appIconSetting/appIconSetting.js index f532a7b0d3..1d4afadffd 100644 --- a/src/pages/appIconSetting/appIconSetting.js +++ b/src/pages/appIconSetting/appIconSetting.js @@ -1,8 +1,10 @@ import "./appIconSetting.scss"; import Page from "components/page"; +import loader from "dialogs/loader"; import Ref from "html-tag-js/ref"; import actionStack from "lib/actionStack"; -import { APP_ICONS, getAppIconLabel } from "lib/appIcons"; +import createAppIconSelection from "lib/appIconSelection"; +import { APP_ICONS } from "lib/appIcons"; import appSettings from "lib/settings"; import helpers from "utils/helpers"; @@ -10,6 +12,21 @@ export default function appIconSetting() { const title = strings["app icon"] || "App icon"; const $page = Page(title); const $list = Ref(); + const controller = new AbortController(); + let busy = false; + const selectIcon = createAppIconSelection({ + signal: controller.signal, + onBusy(value) { + busy = value; + if (value) loader.showTitleLoader(); + else loader.removeTitleLoader(); + $list.el.setAttribute("aria-busy", String(value)); + for (const button of $list.el.querySelectorAll("button")) { + button.disabled = value; + } + }, + onChange: renderIcons, + }); let resolve; $page.classList.add("app-icon-page"); @@ -17,11 +34,13 @@ export default function appIconSetting() { id: "appIcon", action: () => { $page.hide(); - $page.removeEventListener("click", clickHandler); }, }); $page.onhide = () => { + controller.abort(); + loader.removeTitleLoader(); + $page.removeEventListener("click", clickHandler); actionStack.remove("appIcon"); resolve(); }; @@ -47,6 +66,8 @@ export default function appIconSetting() { className={`app-icon-item ${isCurrent ? "current" : ""}`} data-icon={icon.id} type="button" + disabled={busy} + aria-pressed={String(isCurrent)} > {icon.label} @@ -63,32 +84,4 @@ export default function appIconSetting() { const iconId = $target.dataset.icon; await selectIcon(iconId); } - - async function selectIcon(iconId) { - const current = appSettings.value.appIcon || "default"; - - if (iconId === current) return; - - try { - await new Promise((resolve, reject) => { - system.setAppIcon( - iconId, - async () => { - try { - await appSettings.update({ appIcon: iconId }); - renderIcons(); - resolve(); - } catch (error) { - reject(error); - } - }, - (error) => { - reject(error); - }, - ); - }); - } catch (error) { - helpers.error(error); - } - } } diff --git a/src/plugins/admob/src/android/cordova/AdMob.kt b/src/plugins/admob/src/android/cordova/AdMob.kt index 52ecec35d8..b3f459b728 100644 --- a/src/plugins/admob/src/android/cordova/AdMob.kt +++ b/src/plugins/admob/src/android/cordova/AdMob.kt @@ -45,6 +45,7 @@ class AdMob : CordovaPlugin() { Actions.START to ::executeStart, Actions.CONFIGURE to ::executeConfigure, Actions.AD_CREATE to ::executeAdCreate, + Actions.AD_DESTROY to ::executeAdDestroy, Actions.AD_IS_LOADED to ::executeAdIsLoaded, Actions.AD_LOAD to ::executeAdLoad, Actions.AD_SHOW to ::executeAdShow, @@ -140,6 +141,14 @@ class AdMob : CordovaPlugin() { } ?: ctx.reject("ad cls is missing") } + private fun executeAdDestroy(ctx: ExecuteContext) { + val id = ctx.optId() ?: return ctx.reject("id is required") + cordova.activity.runOnUiThread { + ads[id]?.onDestroy() + ctx.resolve() + } + } + private fun executeAdIsLoaded(ctx: ExecuteContext) { cordova.activity.runOnUiThread { ctx.optAdOrReject()?.let { ad -> diff --git a/src/plugins/admob/src/android/cordova/Generated.kt b/src/plugins/admob/src/android/cordova/Generated.kt index 53b3e11bde..20db58553e 100644 --- a/src/plugins/admob/src/android/cordova/Generated.kt +++ b/src/plugins/admob/src/android/cordova/Generated.kt @@ -3,6 +3,7 @@ package admob.plus.cordova object Actions { const val AD_CREATE = "adCreate" + const val AD_DESTROY = "adDestroy" const val AD_HIDE = "adHide" const val AD_IS_LOADED = "adIsLoaded" const val AD_LOAD = "adLoad" diff --git a/src/plugins/admob/src/android/cordova/ads/Rewarded.kt b/src/plugins/admob/src/android/cordova/ads/Rewarded.kt index 89a7a9dce1..545c5240d6 100644 --- a/src/plugins/admob/src/android/cordova/ads/Rewarded.kt +++ b/src/plugins/admob/src/android/cordova/ads/Rewarded.kt @@ -26,21 +26,35 @@ fun buildServerSideVerificationOptions(opts: JSONObject): ServerSideVerification class Rewarded(ctx: ExecuteContext) : AdBase(ctx) { private var mAd: RewardedAd? = null + private var destroyed = false + private var pendingLoad: ExecuteContext? = null + override fun onDestroy() { + if (destroyed) return + destroyed = true + pendingLoad?.reject("Ad is destroyed") + pendingLoad = null clear() super.onDestroy() } override fun load(ctx: ExecuteContext) { + if (destroyed) return ctx.reject("Ad is destroyed") + pendingLoad?.reject("Ad load replaced") + pendingLoad = ctx clear() RewardedAd.load(plugin.activity, adUnitId, adRequest, object : RewardedAdLoadCallback() { override fun onAdFailedToLoad(loadAdError: LoadAdError) { + if (destroyed || pendingLoad !== ctx) return + pendingLoad = null mAd = null emit(Events.AD_LOAD_FAIL, loadAdError) ctx.reject(loadAdError.toString()) } override fun onAdLoaded(rewardedAd: RewardedAd) { + if (destroyed || pendingLoad !== ctx) return + pendingLoad = null mAd = rewardedAd rewardedAd.onPaidEventListener = paidEventListener("rewarded") { rewardedAd.responseInfo } diff --git a/src/plugins/admob/src/www/ads/base.ts b/src/plugins/admob/src/www/ads/base.ts index 35395e0697..b9fab64dc9 100644 --- a/src/plugins/admob/src/www/ads/base.ts +++ b/src/plugins/admob/src/www/ads/base.ts @@ -19,6 +19,8 @@ export class MobileAd { protected readonly opts: T; private _initPromise: ReturnType | undefined; + private _destroyPromise: Promise | undefined; + private _destroyed = false; constructor(opts: T) { this.opts = opts; @@ -79,13 +81,30 @@ export class MobileAd { return execAsync("adHide", [{ id: this.id }]); } + protected destroy(): Promise { + if (this._destroyPromise) return this._destroyPromise; + this._destroyed = true; + if (MobileAd.allAds[this.id] === this) delete MobileAd.allAds[this.id]; + this._destroyPromise = (async () => { + // Creation may already be in flight; dispose only after it settles. + if (this._initPromise) { + await this._initPromise; + await execAsync("adDestroy", [{ id: this.id }]); + } + })(); + return this._destroyPromise; + } + protected async init() { + if (this._destroyed) throw new Error("Ad is destroyed"); // biome-ignore lint/suspicious/noAssignInExpressions: - return (this._initPromise ??= this._init()); + await (this._initPromise ??= this._init()); + if (this._destroyed) throw new Error("Ad is destroyed"); } private async _init() { await admob.start(); + if (this._destroyed) return; const cls = (this.constructor as unknown as { cls?: string }).cls ?? diff --git a/src/plugins/admob/src/www/ads/rewarded.ts b/src/plugins/admob/src/www/ads/rewarded.ts index 9f1b853e0c..c26ac659ce 100644 --- a/src/plugins/admob/src/www/ads/rewarded.ts +++ b/src/plugins/admob/src/www/ads/rewarded.ts @@ -23,4 +23,9 @@ export class RewardedAd extends MobileAd { public show() { return super.show(); } + + /** Release an Android rewarded ad after dismissal or before presentation. */ + public destroy() { + return super.destroy(); + } } diff --git a/src/plugins/admob/src/www/common.ts b/src/plugins/admob/src/www/common.ts index bdd8ef81ae..a3c0f0e133 100644 --- a/src/plugins/admob/src/www/common.ts +++ b/src/plugins/admob/src/www/common.ts @@ -2,6 +2,7 @@ export const CordovaService = "AdMob"; export type CordovaAction = | "adCreate" + | "adDestroy" | "adHide" | "adIsLoaded" | "adLoad" diff --git a/src/plugins/admob/www/admob.js b/src/plugins/admob/www/admob.js index a586f5832a..3dc046dac2 100644 --- a/src/plugins/admob/www/admob.js +++ b/src/plugins/admob/www/admob.js @@ -81,6 +81,7 @@ function execAsync(action, args) { class MobileAd { constructor(opts) { var _a; + this._destroyed = false; this.opts = opts; this.id = (_a = opts.id) !== null && _a !== void 0 ? _a : opts.adUnitId; MobileAd.allAds[this.id] = this; @@ -137,17 +138,38 @@ class MobileAd { return execAsync("adHide", [{ id: this.id }]); }); } + destroy() { + if (this._destroyPromise) + return this._destroyPromise; + this._destroyed = true; + if (MobileAd.allAds[this.id] === this) + delete MobileAd.allAds[this.id]; + this._destroyPromise = (() => __awaiter(this, void 0, void 0, function* () { + // Creation may already be in flight; dispose only after it settles. + if (this._initPromise) { + yield this._initPromise; + yield execAsync("adDestroy", [{ id: this.id }]); + } + }))(); + return this._destroyPromise; + } init() { - var _a; return __awaiter(this, void 0, void 0, function* () { + var _a; + if (this._destroyed) + throw new Error("Ad is destroyed"); // biome-ignore lint/suspicious/noAssignInExpressions: - return ((_a = this._initPromise) !== null && _a !== void 0 ? _a : (this._initPromise = this._init())); + yield ((_a = this._initPromise) !== null && _a !== void 0 ? _a : (this._initPromise = this._init())); + if (this._destroyed) + throw new Error("Ad is destroyed"); }); } _init() { - var _a; return __awaiter(this, void 0, void 0, function* () { + var _a; yield admob.start(); + if (this._destroyed) + return; const cls = (_a = this.constructor.cls) !== null && _a !== void 0 ? _a : this.constructor.name; return execAsync("adCreate", [Object.assign(Object.assign({}, this.opts), { id: this.id, cls })]); }); @@ -318,6 +340,10 @@ class RewardedAd extends MobileAd { show() { return super.show(); } + /** Release an Android rewarded ad after dismissal or before presentation. */ + destroy() { + return super.destroy(); + } } RewardedAd.cls = "RewardedAd"; diff --git a/src/plugins/system/android/com/foxdebug/system/System.java b/src/plugins/system/android/com/foxdebug/system/System.java index 094c4eab6d..53e0f6a6e7 100644 --- a/src/plugins/system/android/com/foxdebug/system/System.java +++ b/src/plugins/system/android/com/foxdebug/system/System.java @@ -81,6 +81,7 @@ public class System extends CordovaPlugin { static { Map aliases = new HashMap<>(); aliases.put("default", "MainActivityIconDefault"); + aliases.put("pro", "MainActivityIconPro"); aliases.put("midnight_circuit", "MainActivityIconMidnightCircuit"); aliases.put("aurora_pulse", "MainActivityIconAuroraPulse"); aliases.put("terminal_glow", "MainActivityIconTerminalGlow"); diff --git a/src/settings/mainSettings.js b/src/settings/mainSettings.js index 2946f57c72..d43a866ca4 100644 --- a/src/settings/mainSettings.js +++ b/src/settings/mainSettings.js @@ -1,14 +1,11 @@ import settingsPage from "components/settingsPage"; import confirm from "dialogs/confirm"; -import loader from "dialogs/loader"; import rateBox from "dialogs/rateBox"; import actionStack from "lib/actionStack"; -import auth from "lib/auth"; import config from "lib/config"; -import customTab from "lib/customTab"; import openFile from "lib/openFile"; import { bindPrivacyChoices } from "lib/privacyChoicesController.mjs"; -import removeAds from "lib/removeAds"; +import { requestProPurchase } from "lib/removeAds"; import appSettings from "lib/settings"; import settings from "lib/settings"; import { showPrivacyOptions, subscribePrivacyState } from "lib/startAd"; @@ -289,48 +286,7 @@ export default function mainSettings() { case "removeads": try { - if (!helpers.shouldAllowExternalPurchase()) { - await removeAds(); - this.remove(); - break; - } - - loader.create(strings.login, strings["loading..."]); - - try { - let user = await auth.getLoggedInUser(); - if (!user) { - const confirmation = await confirm( - strings.confirm, - strings["confirm-login"], - ); - - if (!confirmation) { - return; - } - - loader.show(); - await auth.login(); - - user = await auth.getLoggedInUser(); - } - - if (!user) { - throw new Error("Unable to fetch user"); - } - - if (user.acode_pro) { - this.remove(); - return; - } - } catch (error) { - helpers.error(error); - return; - } finally { - loader.destroy(); - } - - customTab(`${config.BASE_URL}/pro?redirect=app`).catch(helpers.error); + if (await requestProPurchase()) this.remove(); } catch (error) { helpers.error(error); } diff --git a/tests/admob/adRewards.test.js b/tests/admob/adRewards.test.js new file mode 100644 index 0000000000..de4fb1ffa8 --- /dev/null +++ b/tests/admob/adRewards.test.js @@ -0,0 +1,73 @@ +import { afterEach, beforeEach, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + show: vi.fn(), + getStatus: vi.fn(), + redeem: vi.fn(), + suppress: vi.fn(), +})); +vi.mock("components/toast", () => ({ default: vi.fn() })); +vi.mock("lib/config", () => ({ default: { HAS_PRO: false } })); +vi.mock("lib/rewardedAd", () => ({ + default: mocks.show, + isRewardedAdSupported: () => true, + isWatchingRewardedAd: () => false, +})); +vi.mock("lib/startAd", () => ({ setBannerSuppressed: mocks.suppress })); +vi.mock("lib/secureAdRewardState", () => ({ + default: { getStatus: mocks.getStatus, redeem: mocks.redeem }, +})); +let adRewards; +beforeEach(async () => { + vi.resetModules(); + vi.useFakeTimers(); + vi.clearAllMocks(); + vi.stubGlobal("window", {}); + vi.stubGlobal("user", { id: "test-user" }); + vi.stubGlobal("strings", { "rewarded ad incomplete": "Incomplete" }); + mocks.getStatus.mockResolvedValue({ canRedeem: true }); + mocks.show.mockResolvedValue(true); + mocks.redeem.mockResolvedValue({ + canRedeem: true, + isActive: true, + adFreeUntil: Date.now() + 3_600_000, + appliedDurationMs: 3_600_000, + }); + ({ default: adRewards } = await import("lib/adRewards")); +}); +afterEach(() => { + vi.useRealTimers(); + vi.unstubAllGlobals(); +}); + +it("shares duplicate pass requests during status refresh and preserves step verification", async () => { + let refreshed; + mocks.getStatus.mockImplementationOnce( + () => + new Promise((resolve) => { + refreshed = resolve; + }), + ); + const first = adRewards.watchOffer("focus"); + const duplicate = adRewards.watchOffer("focus"); + refreshed({ canRedeem: true }); + await Promise.all([first, duplicate]); + expect(mocks.show).toHaveBeenCalledTimes(2); + const firstMetadata = mocks.show.mock.calls[0][0].serverSideVerification; + const secondMetadata = mocks.show.mock.calls[1][0].serverSideVerification; + expect(firstMetadata.userId).toBe("test-user"); + expect(firstMetadata.customData).toContain("&offer=focus&step=1&ads=2"); + expect(secondMetadata.customData).toBe( + firstMetadata.customData.replace("step=1", "step=2"), + ); + expect(mocks.redeem).toHaveBeenCalledExactlyOnceWith("focus"); + expect(adRewards.isAdFreeActive()).toBe(true); +}); +it("never grants a pass for an incomplete reward and permits retry", async () => { + mocks.show.mockResolvedValueOnce(false); + await expect(adRewards.watchOffer("quick")).rejects.toThrow("Incomplete"); + expect(mocks.redeem).not.toHaveBeenCalled(); + expect(adRewards.isWatchingReward()).toBe(false); + await adRewards.watchOffer("quick"); + expect(mocks.redeem).toHaveBeenCalledExactlyOnceWith("quick"); +}); diff --git a/tests/admob/rewardedAd.test.js b/tests/admob/rewardedAd.test.js new file mode 100644 index 0000000000..06a726e271 --- /dev/null +++ b/tests/admob/rewardedAd.test.js @@ -0,0 +1,342 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { RewardedAd } from "../../src/plugins/admob/src/www/ads/rewarded"; +const mocks = vi.hoisted(() => ({ + start: vi.fn(), + config: { HAS_PRO: false }, + ready: true, + allowed: true, +})); +vi.mock("lib/config", () => ({ default: mocks.config })); +vi.mock("lib/startAd", () => ({ + default: mocks.start, + adUnitIdRewarded: "test-unit", + get initialized() { + return mocks.ready; + }, + getPrivacyState: () => ({ canRequestAds: mocks.allowed }), +})); +let showRewardedAd; +let instances; +const flush = async () => { + for (let i = 0; i < 8; i++) await Promise.resolve(); +}; +class Ad { + constructor(options) { + this.options = options; + this.id = options.id; + this.listeners = new Map(); + instances.push(this); + } + on(name, listener) { + this.listeners.set(name, listener); + return () => this.listeners.delete(name); + } + emit(name) { + this.listeners.get(name)?.(); + } + load = vi.fn().mockResolvedValue(); + show = vi.fn().mockResolvedValue(); + destroy = vi.fn().mockResolvedValue(); +} +beforeEach(async () => { + vi.resetModules(); + vi.useFakeTimers(); + instances = []; + mocks.config.HAS_PRO = false; + mocks.ready = true; + mocks.allowed = true; + mocks.start.mockReset().mockResolvedValue(); + vi.stubGlobal("window", { ANDROID_SDK_INT: 36 }); + vi.stubGlobal("admob", { RewardedAd: Ad }); + vi.stubGlobal("strings", { + "rewarded ad unavailable": "Unavailable", + "rewarded ad failed": "Failed", + }); + ({ default: showRewardedAd } = await import("lib/rewardedAd")); +}); +afterEach(() => { + vi.restoreAllMocks(); + vi.useRealTimers(); + vi.unstubAllGlobals(); +}); + +describe("shared rewarded ad lifecycle", () => { + it("waits for reward AND dismissal, retaining verification metadata and cleaning listeners", async () => { + const verification = { userId: "guest", customData: "offer=quick&step=1" }; + const done = vi.fn(); + const result = showRewardedAd({ serverSideVerification: verification }); + result.then(done); + await flush(); + const ad = instances[0]; + expect(ad.options.serverSideVerification).toEqual(verification); + expect(ad.options.adUnitId).toBe("test-unit"); + ad.emit("reward"); + await flush(); + expect(done).not.toHaveBeenCalled(); + ad.emit("dismiss"); + await expect(result).resolves.toBe(true); + expect(ad.listeners.size).toBe(0); + expect(ad.destroy).toHaveBeenCalledOnce(); + expect(vi.getTimerCount()).toBe(0); + }); + it.each([ + "dismiss", + "loadfail", + "showfail", + "load rejection", + "show rejection", + "show false", + ])("settles and cleans up on %s", async (event) => { + if (event === "loadfail") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.load.mockImplementation(async () => { + this.emit("loadfail"); + throw new Error("network"); + }); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + if (event === "load rejection") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.load.mockRejectedValue(new Error("network")); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + if (event === "show rejection") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.show.mockRejectedValue(new Error("show")); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + if (event === "show false") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.show.mockResolvedValue(false); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + const result = showRewardedAd(); + const assertion = + event === "dismiss" + ? expect(result).resolves.toBe(false) + : expect(result).rejects.toThrow("Failed"); + await flush(); + instances[0].emit(event); + await assertion; + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + expect(vi.getTimerCount()).toBe(0); + const retry = showRewardedAd(); + await flush(); + instances[1].emit("reward"); + instances[1].emit("dismiss"); + await expect(retry).resolves.toBe(true); + vi.restoreAllMocks(); + }); + it.each([ + "paid", + "missing SDK", + "unsupported Android", + "no consent", + "not initialized", + ])("does not load ads for %s", async (reason) => { + if (reason === "paid") mocks.config.HAS_PRO = true; + if (reason === "missing SDK") vi.stubGlobal("admob", undefined); + if (reason === "unsupported Android") window.ANDROID_SDK_INT = 28; + if (reason === "no consent") mocks.allowed = false; + if (reason === "not initialized") mocks.ready = false; + await expect(showRewardedAd()).rejects.toThrow(); + expect(instances).toHaveLength(0); + }); + it("cancels loading and ignores late callbacks without unlocking a subsequent ad", async () => { + let finishInit; + mocks.start.mockImplementationOnce( + () => + new Promise((resolve) => { + finishInit = resolve; + }), + ); + const controller = new AbortController(); + const old = showRewardedAd({ signal: controller.signal }); + controller.abort(); + await expect(old).resolves.toBe(false); + const next = showRewardedAd(); + await flush(); + finishInit(); + await flush(); + expect(instances).toHaveLength(1); + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + instances[0].emit("dismiss"); + await next; + }); + it("holds the full-screen lock after cancellation until native dismissal", async () => { + const controller = new AbortController(); + const result = showRewardedAd({ signal: controller.signal }); + await flush(); + controller.abort(); + await expect(result).resolves.toBe(false); + expect(instances[0].destroy).not.toHaveBeenCalled(); + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + instances[0].emit("reward"); + instances[0].emit("dismiss"); + const next = showRewardedAd(); + await flush(); + instances[1].emit("dismiss"); + await next; + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + }); + it("ignores an abandoned load rejection while a newer ad is active", async () => { + let rejectLoad; + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.load.mockImplementation( + () => + new Promise((resolve, reject) => { + rejectLoad = reject; + }), + ); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + const controller = new AbortController(); + const old = showRewardedAd({ signal: controller.signal }); + await flush(); + controller.abort(); + await expect(old).resolves.toBe(false); + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + const next = showRewardedAd(); + await flush(); + rejectLoad(new Error("Late failure")); + await flush(); + expect(instances[0].show).not.toHaveBeenCalled(); + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + instances[1].emit("dismiss"); + await next; + vi.restoreAllMocks(); + }); + it("rejects a presentation timeout and ignores late reward and dismissal", async () => { + const result = showRewardedAd(); + const assertion = expect(result).rejects.toThrow("Failed"); + await flush(); + await vi.advanceTimersByTimeAsync(90_000); + await assertion; + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + expect(instances[0].destroy).not.toHaveBeenCalled(); + instances[0].emit("reward"); + instances[0].emit("dismiss"); + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + expect(vi.getTimerCount()).toBe(0); + }); + it("times out initialization and never presents a late ad", async () => { + let complete; + mocks.start.mockImplementation( + () => + new Promise((resolve) => { + complete = resolve; + }), + ); + const result = showRewardedAd(); + const assertion = expect(result).rejects.toThrow("Failed"); + await vi.advanceTimersByTimeAsync(90_000); + await assertion; + complete(); + await flush(); + expect(instances).toHaveLength(0); + expect(vi.getTimerCount()).toBe(0); + }); +}); + +describe("rewarded wrapper disposal", () => { + let calls; + beforeEach(() => { + calls = []; + admob.start = vi.fn().mockResolvedValue(); + vi.stubGlobal("cordova", { + exec: vi.fn((resolve, reject, service, action, args) => { + calls.push({ action, id: args[0].id, resolve, reject }); + if (action !== "adCreate" && action !== "adLoad") resolve(); + }), + }); + }); + it("disposes an unused ad once without creating native resources", async () => { + const ad = new RewardedAd({ id: "unused", adUnitId: "test" }); + expect(window.admobAds.unused).toBe(ad); + const disposed = ad.destroy(); + expect(ad.destroy()).toBe(disposed); + await disposed; + expect(window.admobAds.unused).toBeUndefined(); + expect(calls).toEqual([]); + await expect(ad.load()).rejects.toThrow("Ad is destroyed"); + }); + it.each(["SDK startup", "native creation"])( + "cancels during %s without issuing a late load or show", + async (phase) => { + let started; + if (phase === "SDK startup") { + admob.start.mockImplementation( + () => + new Promise((resolve) => { + started = resolve; + }), + ); + } + const ad = new RewardedAd({ id: "old", adUnitId: "test" }); + const loading = ad.load(); + const rejected = expect(loading).rejects.toThrow("Ad is destroyed"); + await flush(); + const disposed = ad.destroy(); + expect(ad.destroy()).toBe(disposed); + const next = new RewardedAd({ id: "next", adUnitId: "test" }); + if (started) started(); + else calls.find(({ action }) => action === "adCreate").resolve(); + await Promise.all([disposed, rejected]); + expect(calls.filter(({ action }) => action === "adLoad")).toEqual([]); + expect( + calls + .filter(({ action }) => action === "adDestroy") + .map(({ id }) => id), + ).toEqual(["old"]); + expect(window.admobAds.old).toBeUndefined(); + expect(window.admobAds.next).toBe(next); + await expect(ad.show()).rejects.toThrow("Ad is destroyed"); + await next.destroy(); + }, + ); + it("destroys a pending native load and ignores its late completion", async () => { + const ad = new RewardedAd({ id: "loading", adUnitId: "test" }); + const loading = ad.load(); + const rejected = expect(loading).rejects.toThrow("Ad is destroyed"); + await flush(); + calls[0].resolve(); + await flush(); + const load = calls.find(({ action }) => action === "adLoad"); + cordova.exec.mockImplementation( + (resolve, reject, service, action, args) => { + calls.push({ action, id: args[0].id }); + load.reject(new Error("Ad is destroyed")); + resolve(); + }, + ); + await ad.destroy(); + load.resolve(); + await rejected; + await ad.destroy(); + expect(calls.map(({ action }) => action)).toEqual([ + "adCreate", + "adLoad", + "adDestroy", + ]); + expect(window.admobAds.loading).toBeUndefined(); + }); +}); diff --git a/tests/unit/androidPrepare.test.js b/tests/unit/androidPrepare.test.js new file mode 100644 index 0000000000..8f29d5a15a --- /dev/null +++ b/tests/unit/androidPrepare.test.js @@ -0,0 +1,76 @@ +import fs from "node:fs"; +import { createRequire } from "node:module"; +import os from "node:os"; +import path from "node:path"; +import vm from "node:vm"; +import { expect, it } from "vitest"; + +const require = createRequire(import.meta.url); +const hook = fs.readFileSync( + new URL("../../hooks/post-process.js", import.meta.url), + "utf8", +); + +it("refreshes stale System plugin Java alongside icons on repeated Android prepares", () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), "acode-prepare-")); + const write = (file, content) => { + const target = path.join(root, file); + fs.mkdirSync(path.dirname(target), { recursive: true }); + fs.writeFileSync(target, content); + return target; + }; + try { + write("config.xml", ''); + write("build-extras.gradle", "// build configuration"); + write("res/android/drawable/ic_acode_pro.xml", ""); + const source = write( + "src/plugins/system/android/com/foxdebug/system/System.java", + 'aliases.put("pro", "MainActivityIconPro");', + ); + const generated = write( + "platforms/android/app/src/main/java/com/foxdebug/system/System.java", + 'aliases.put("default", "MainActivityIconDefault");', + ); + const unrelated = write( + "platforms/android/app/src/main/java/other/Plugin.java", + "// other plugin", + ); + const prepare = () => + vm.runInNewContext(hook, { + __dirname: path.join(root, "hooks"), + process: { env: { TMPDIR: root } }, + console: { log() {}, warn() {}, error() {} }, + require(id) { + if (id === "child_process") + return { + execSync(command) { + expect(command).toBe("npm prefix"); + return Buffer.from(root); + }, + }; + return require(id); + }, + }); + prepare(); + expect(fs.readFileSync(generated, "utf8")).toBe( + fs.readFileSync(source, "utf8"), + ); + fs.appendFileSync(source, "\n// subsequent native edit"); + prepare(); + expect(fs.readFileSync(generated, "utf8")).toBe( + fs.readFileSync(source, "utf8"), + ); + expect(fs.readFileSync(unrelated, "utf8")).toBe("// other plugin"); + expect( + fs.readFileSync( + path.join( + root, + "platforms/android/app/src/main/res/drawable/ic_acode_pro.xml", + ), + "utf8", + ), + ).toBe(""); + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +}); diff --git a/tests/unit/appIconSelection.test.js b/tests/unit/appIconSelection.test.js new file mode 100644 index 0000000000..fc78dfc5b0 --- /dev/null +++ b/tests/unit/appIconSelection.test.js @@ -0,0 +1,170 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + config: { HAS_PRO: false }, + settings: { value: { appIcon: "default" }, update: vi.fn() }, + confirm: vi.fn(), + reward: vi.fn(), + purchase: vi.fn(), + toast: vi.fn(), + error: vi.fn(), + pass: false, +})); +vi.mock("components/toast", () => ({ default: mocks.toast })); +vi.mock("dialogs/confirm", () => ({ default: mocks.confirm })); +vi.mock("lib/config", () => ({ default: mocks.config })); +vi.mock("lib/settings", () => ({ default: mocks.settings })); +vi.mock("lib/adRewards", () => ({ + default: { canShowAds: () => !mocks.config.HAS_PRO && !mocks.pass }, +})); +vi.mock("lib/rewardedAd", () => ({ default: mocks.reward })); +vi.mock("lib/removeAds", () => ({ requestProPurchase: mocks.purchase })); +vi.mock("utils/helpers", () => ({ + default: { + error: mocks.error, + promisify: (fn, ...args) => + new Promise((resolve, reject) => fn(...args, resolve, reject)), + }, +})); +import createAppIconSelection from "lib/appIconSelection"; + +function harness() { + const controller = new AbortController(); + const onBusy = vi.fn(); + const onChange = vi.fn(); + return { + controller, + onBusy, + onChange, + select: createAppIconSelection({ + signal: controller.signal, + onBusy, + onChange, + }), + }; +} +beforeEach(() => { + vi.clearAllMocks(); + mocks.config.HAS_PRO = false; + mocks.pass = false; + mocks.settings.value.appIcon = "default"; + mocks.settings.update.mockImplementation(async ({ appIcon }) => { + mocks.settings.value.appIcon = appIcon; + }); + mocks.confirm.mockResolvedValue(true); + mocks.reward.mockResolvedValue(true); + mocks.purchase.mockResolvedValue(false); + vi.stubGlobal("strings", { + "app icon": "App icon", + "confirm app icon reward": "Watch?", + "app icon changed": "Changed", + "rewarded ad incomplete": "Incomplete", + }); + vi.stubGlobal("system", { setAppIcon: vi.fn((id, success) => success()) }); +}); + +describe("icon selection", () => { + it("opens Pro purchase without watching an ad or applying the locked icon", async () => { + mocks.pass = true; + const h = harness(); + mocks.purchase.mockImplementation(async () => { + mocks.config.HAS_PRO = true; + }); + await h.select("pro"); + expect(mocks.purchase).toHaveBeenCalledOnce(); + expect(mocks.reward).not.toHaveBeenCalled(); + expect(system.setAppIcon).not.toHaveBeenCalled(); + await h.select("pro"); + expect(system.setAppIcon).toHaveBeenCalledWith( + "pro", + expect.any(Function), + expect.any(Function), + ); + }); + it.each([ + "default", + "paid", + "pass", + ])("skips rewarded ads for %s", async (kind) => { + mocks.settings.value.appIcon = "pixel_party"; + mocks.config.HAS_PRO = kind === "paid"; + mocks.pass = kind === "pass"; + await harness().select(kind === "default" ? "default" : "midnight_circuit"); + expect(mocks.confirm).not.toHaveBeenCalled(); + expect(mocks.reward).not.toHaveBeenCalled(); + expect(mocks.settings.update).toHaveBeenCalledOnce(); + expect(mocks.toast).toHaveBeenCalledWith("Changed"); + }); + it("ignores current/unknown icons and serializes confirmation and reward", async () => { + const h = harness(); + await h.select("default"); + await h.select("unknown"); + expect(h.onBusy).not.toHaveBeenCalled(); + let confirm; + mocks.confirm.mockImplementation( + () => + new Promise((resolve) => { + confirm = resolve; + }), + ); + const first = h.select("pixel_party"); + await h.select("solar_flare"); + expect(mocks.confirm).toHaveBeenCalledOnce(); + expect(mocks.reward).not.toHaveBeenCalled(); + confirm(true); + await first; + expect(system.setAppIcon.mock.calls[0][0]).toBe("pixel_party"); + expect(h.onBusy.mock.calls).toEqual([[true], [false]]); + expect(mocks.toast).toHaveBeenCalledTimes(1); + }); + it.each([ + "decline", + "incomplete", + "load failure", + "native failure", + ])("keeps the current selection on %s", async (kind) => { + if (kind === "decline") mocks.confirm.mockResolvedValue(false); + if (kind === "incomplete") mocks.reward.mockResolvedValue(false); + if (kind === "load failure") + mocks.reward.mockRejectedValue(new Error("Unavailable")); + if (kind === "native failure") + system.setAppIcon.mockImplementation((id, ok, fail) => + fail("Native failure"), + ); + const h = harness(); + await h.select("pixel_party"); + expect(mocks.settings.value.appIcon).toBe("default"); + expect(mocks.settings.update).not.toHaveBeenCalled(); + expect(mocks.toast).not.toHaveBeenCalledWith("Changed"); + expect(h.onBusy).toHaveBeenLastCalledWith(false); + if (kind === "decline") expect(mocks.reward).not.toHaveBeenCalled(); + }); + it("ignores a reward received after leaving the picker", async () => { + let finish; + mocks.reward.mockImplementation( + () => + new Promise((resolve) => { + finish = resolve; + }), + ); + const h = harness(); + const pending = h.select("pixel_party"); + await vi.waitFor(() => expect(finish).toBeTypeOf("function")); + h.controller.abort(); + finish(true); + await pending; + expect(system.setAppIcon).not.toHaveBeenCalled(); + expect(h.onChange).not.toHaveBeenCalled(); + expect(mocks.toast).not.toHaveBeenCalled(); + }); + it("does not apply after leaving during confirmation", async () => { + const h = harness(); + mocks.confirm.mockImplementation(async () => { + h.controller.abort(); + return true; + }); + await h.select("pixel_party"); + expect(mocks.reward).not.toHaveBeenCalled(); + expect(system.setAppIcon).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/unit/confirm.test.js b/tests/unit/confirm.test.js new file mode 100644 index 0000000000..0029941e48 --- /dev/null +++ b/tests/unit/confirm.test.js @@ -0,0 +1,117 @@ +import { Window } from "happy-dom"; +import { afterEach, beforeEach, expect, it, vi } from "vitest"; +vi.mock("lib/settings", () => ({ + default: { value: { confirmOnExit: false } }, +})); +vi.mock("lib/restoreTheme", () => ({ default: vi.fn() })); +vi.mock("components/checkbox", () => ({ + default: () => document.createElement("input"), +})); +import confirm from "dialogs/confirm"; +import actionStack from "lib/actionStack"; +let window; +beforeEach(() => { + vi.useFakeTimers(); + vi.clearAllMocks(); + actionStack.setMark(); + window = new Window(); + vi.stubGlobal("document", window.document); + vi.stubGlobal("app", window.document.body); + vi.stubGlobal("strings", { ok: "OK", cancel: "Cancel" }); + vi.stubGlobal("tag", (name, options) => { + const el = document.createElement(name); + for (const [key, value] of Object.entries(options)) { + if (key === "children") el.append(...value); + else if (value !== undefined) el[key] = value; + } + return el; + }); +}); +afterEach(() => { + actionStack.clearFromMark(); + vi.runAllTimers(); + vi.restoreAllMocks(); + vi.useRealTimers(); + vi.unstubAllGlobals(); + window.happyDOM.cancelAsync(); +}); +it.each([ + "back", + "cancel", + "abort", +])("settles %s as cancellation and cleans the dialog", async (method) => { + const controller = new AbortController(); + const result = confirm("Icon", "Watch?", false, { + signal: controller.signal, + }); + if (method === "back") await actionStack.pop(); + if (method === "cancel") document.querySelector("button").click(); + if (method === "abort") controller.abort(); + await expect(result).resolves.toBe(false); + vi.runAllTimers(); + expect(app.children.length).toBe(0); + expect(actionStack.length).toBe(0); +}); +it("preserves checkbox response and ignores subsequent dismissals", async () => { + const push = vi.spyOn(actionStack, "push"); + const remove = vi.spyOn(actionStack, "remove"); + const controller = new AbortController(); + const result = confirm("Icon", "Watch?", false, { + checkboxText: "Remember", + returnState: true, + signal: controller.signal, + }); + document.querySelector("input").checked = true; + document.querySelectorAll("button")[1].click(); + controller.abort(); + push.mock.calls[0][0].action(); + await expect(result).resolves.toEqual({ confirmed: true, checked: true }); + expect(remove).toHaveBeenCalledOnce(); + expect(actionStack.length).toBe(0); +}); + +it.each(["back", "cancel", "ok", "abort"])( + "preserves the lower confirmation's Back handler after %s dismisses the top", + async (method) => { + const firstClosed = vi.fn(); + confirm("First", "First confirmation").then(firstClosed); + const controller = new AbortController(); + const second = confirm("Second", "Second confirmation", false, { + signal: controller.signal, + }); + const top = document.querySelectorAll(".confirm")[1]; + if (method === "back") await actionStack.pop(); + if (method === "cancel") top.querySelector("button").click(); + if (method === "ok") top.querySelectorAll("button")[1].click(); + if (method === "abort") controller.abort(); + await expect(second).resolves.toBe(method === "ok"); + vi.runAllTimers(); + expect(document.querySelectorAll(".confirm")).toHaveLength(1); + expect(actionStack.length).toBe(1); + expect(firstClosed).not.toHaveBeenCalled(); + + await actionStack.pop(); + expect(firstClosed).toHaveBeenCalledExactlyOnceWith(false); + vi.runAllTimers(); + expect(app.children.length).toBe(0); + expect(actionStack.length).toBe(0); + }, +); + +it("preserves the top confirmation when the lower one is aborted", async () => { + const controller = new AbortController(); + const first = confirm("First", "First confirmation", false, { + signal: controller.signal, + }); + const secondClosed = vi.fn(); + confirm("Second", "Second confirmation").then(secondClosed); + controller.abort(); + await expect(first).resolves.toBe(false); + expect(actionStack.length).toBe(1); + expect(secondClosed).not.toHaveBeenCalled(); + await actionStack.pop(); + expect(secondClosed).toHaveBeenCalledExactlyOnceWith(false); + vi.runAllTimers(); + expect(app.children.length).toBe(0); + expect(actionStack.length).toBe(0); +}); diff --git a/tests/unit/removeAds.test.js b/tests/unit/removeAds.test.js new file mode 100644 index 0000000000..cb6fecc7a9 --- /dev/null +++ b/tests/unit/removeAds.test.js @@ -0,0 +1,171 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +const mocks = vi.hoisted(() => ({ + config: { HAS_PRO: false, BASE_URL: "https://acode.app" }, + toast: vi.fn(), + suppress: vi.fn(), + confirm: vi.fn(), + customTab: vi.fn(), + auth: { getLoggedInUser: vi.fn(), login: vi.fn() }, + loader: { create: vi.fn(), show: vi.fn(), destroy: vi.fn() }, + external: false, +})); +vi.mock("components/toast", () => ({ default: mocks.toast })); +vi.mock("dialogs/confirm", () => ({ default: mocks.confirm })); +vi.mock("dialogs/loader", () => ({ default: mocks.loader })); +vi.mock("utils/helpers", () => ({ + default: { + error: vi.fn(), + shouldAllowExternalPurchase: () => mocks.external, + }, +})); +vi.mock("lib/auth", () => ({ default: mocks.auth })); +vi.mock("lib/config", () => ({ default: mocks.config })); +vi.mock("lib/customTab", () => ({ default: mocks.customTab })); +vi.mock("lib/startAd", () => ({ + BANNER_SUPPRESSION_REASON: { PRO: "pro" }, + setBannerSuppressed: mocks.suppress, +})); +import removeAds, { requestProPurchase } from "lib/removeAds"; +let purchaseUpdated; +let purchaseError; +beforeEach(() => { + vi.clearAllMocks(); + mocks.config.HAS_PRO = false; + mocks.external = false; + mocks.auth.getLoggedInUser + .mockReset() + .mockResolvedValue({ acode_pro: false }); + mocks.auth.login.mockResolvedValue(); + mocks.confirm.mockResolvedValue(true); + mocks.customTab.mockResolvedValue(); + vi.stubGlobal("strings", { + "no-product-info": "No product", + "purchase pending": "Pending", + failed: "Failed", + canceled: "Cancelled", + "thank you :)": "Thanks", + "confirm-login": "Login?", + }); + vi.stubGlobal("localStorage", { setItem: vi.fn() }); + vi.stubGlobal("iap", { + USER_CANCELED: 1, + ITEM_ALREADY_OWNED: 7, + PURCHASE_STATE_PURCHASED: 1, + PURCHASE_STATE_PENDING: 2, + getProducts: vi.fn((ids, ok) => ok([{ productId: "acode_pro_new" }])), + setPurchaseUpdatedListener: vi.fn((ok, fail) => { + purchaseUpdated = ok; + purchaseError = fail; + }), + purchase: vi.fn(), + acknowledgePurchase: vi.fn((token, ok) => ok()), + }); +}); + +describe("shared Pro purchase flow", () => { + it.each([ + "empty products", + "product error", + "product exception", + "launch error", + "empty purchase", + "pending", + "cancel", + ])("settles %s without granting Pro", async (kind) => { + if (kind === "empty products") + iap.getProducts.mockImplementation((ids, ok) => ok([])); + if (kind === "product error") + iap.getProducts.mockImplementation((ids, ok, fail) => + fail("Products failed"), + ); + if (kind === "product exception") + iap.getProducts.mockImplementation(() => { + throw new Error("Billing unavailable"); + }); + if (kind === "launch error") + iap.purchase.mockImplementation((id, ok, fail) => fail("Launch failed")); + const pending = removeAds(); + const assertion = expect(pending).rejects.toBeDefined(); + if (kind === "empty purchase") purchaseUpdated([]); + if (kind === "pending") purchaseUpdated([{ purchaseState: 2 }]); + if (kind === "cancel") purchaseError(1); + await assertion; + expect(mocks.config.HAS_PRO).toBe(false); + expect(mocks.suppress).not.toHaveBeenCalled(); + }); + it("shares an active billing request and grants Pro once after acknowledgement", async () => { + const first = removeAds(); + const duplicate = removeAds(); + expect(duplicate).toBe(first); + const value = [ + { purchaseState: 1, isAcknowledged: false, purchaseToken: "test" }, + ]; + purchaseUpdated(value); + await first; + purchaseUpdated(value); + expect(iap.purchase).toHaveBeenCalledOnce(); + expect(mocks.config.HAS_PRO).toBe(true); + expect(mocks.toast).toHaveBeenCalledOnce(); + expect(mocks.suppress).toHaveBeenCalledWith("pro", true); + }); + it("treats cancelled billing as a cancelled request", async () => { + const result = requestProPurchase(); + purchaseError(1); + await expect(result).resolves.toBe(false); + }); + it("honors a later confirmed purchase after reporting its pending state", async () => { + const result = removeAds(); + const assertion = expect(result).rejects.toBe("Pending"); + purchaseUpdated([{ purchaseState: 2 }]); + await assertion; + expect(mocks.config.HAS_PRO).toBe(false); + purchaseUpdated([{ purchaseState: 1, isAcknowledged: true }]); + expect(mocks.config.HAS_PRO).toBe(true); + expect(mocks.toast).toHaveBeenCalledOnce(); + }); + it("cancels pending product lookup and ignores its late result", async () => { + let productsLoaded; + iap.getProducts.mockImplementation((ids, ok) => { + productsLoaded = ok; + }); + const controller = new AbortController(); + const result = requestProPurchase({ signal: controller.signal }); + controller.abort(); + await expect(result).resolves.toBe(false); + productsLoaded([{ productId: "acode_pro_new" }]); + expect(iap.purchase).not.toHaveBeenCalled(); + expect(mocks.config.HAS_PRO).toBe(false); + }); + it("uses the existing external checkout and does not grant Pro merely for opening it", async () => { + mocks.external = true; + await expect(requestProPurchase()).resolves.toBe(false); + expect(mocks.customTab).toHaveBeenCalledWith( + "https://acode.app/pro?redirect=app", + ); + expect(iap.purchase).not.toHaveBeenCalled(); + expect(mocks.loader.destroy).toHaveBeenCalledOnce(); + }); + it("refreshes confirmed account Pro without checkout", async () => { + mocks.external = true; + mocks.auth.getLoggedInUser.mockResolvedValue({ acode_pro: true }); + await expect(requestProPurchase()).resolves.toBe(true); + expect(mocks.config.HAS_PRO).toBe(true); + expect(mocks.customTab).not.toHaveBeenCalled(); + }); + it("honors login cancellation and page closure before checkout", async () => { + mocks.external = true; + mocks.auth.getLoggedInUser.mockResolvedValue(null); + mocks.confirm.mockResolvedValue(false); + await expect(requestProPurchase()).resolves.toBe(false); + expect(mocks.auth.login).not.toHaveBeenCalled(); + const controller = new AbortController(); + mocks.auth.getLoggedInUser.mockImplementation(async () => { + controller.abort(); + return { acode_pro: false }; + }); + await expect( + requestProPurchase({ signal: controller.signal }), + ).resolves.toBe(false); + expect(mocks.customTab).not.toHaveBeenCalled(); + }); +}); diff --git a/www/icons/ic_acode_aurora_pulse.svg b/www/icons/ic_acode_aurora_pulse.svg index f188ae3dde..a5341b80bf 100644 --- a/www/icons/ic_acode_aurora_pulse.svg +++ b/www/icons/ic_acode_aurora_pulse.svg @@ -31,7 +31,7 @@
- - + + diff --git a/www/icons/ic_acode_blueprint.svg b/www/icons/ic_acode_blueprint.svg index 129975a8aa..0c65026b46 100644 --- a/www/icons/ic_acode_blueprint.svg +++ b/www/icons/ic_acode_blueprint.svg @@ -32,7 +32,7 @@ - - + + diff --git a/www/icons/ic_acode_default.svg b/www/icons/ic_acode_default.svg index 751a762f59..8114270ea6 100644 --- a/www/icons/ic_acode_default.svg +++ b/www/icons/ic_acode_default.svg @@ -8,7 +8,7 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="eqleqe3ploak1" - viewBox="0 0 544.369200 452.626030" + viewBox="-57.73621212 -103.60620137 659.84242424 659.84242424" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" version="1.1" diff --git a/www/icons/ic_acode_midnight_circuit.svg b/www/icons/ic_acode_midnight_circuit.svg index 772e82baf2..7de6506f59 100644 --- a/www/icons/ic_acode_midnight_circuit.svg +++ b/www/icons/ic_acode_midnight_circuit.svg @@ -27,7 +27,7 @@ - - + + diff --git a/www/icons/ic_acode_pixel_party.svg b/www/icons/ic_acode_pixel_party.svg index 40e37b72aa..6c5981a6c1 100644 --- a/www/icons/ic_acode_pixel_party.svg +++ b/www/icons/ic_acode_pixel_party.svg @@ -22,8 +22,8 @@ - - - + + + diff --git a/www/icons/ic_acode_pro.svg b/www/icons/ic_acode_pro.svg new file mode 100644 index 0000000000..3eb809143b --- /dev/null +++ b/www/icons/ic_acode_pro.svg @@ -0,0 +1,29 @@ + + Acode Pro app icon + Golden Acode mark on a midnight gradient. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_solar_flare.svg b/www/icons/ic_acode_solar_flare.svg index df2a783193..a5c1b38899 100644 --- a/www/icons/ic_acode_solar_flare.svg +++ b/www/icons/ic_acode_solar_flare.svg @@ -22,7 +22,7 @@ - - + + diff --git a/www/icons/ic_acode_terminal_glow.svg b/www/icons/ic_acode_terminal_glow.svg index f5285aba12..1dbaa40f10 100644 --- a/www/icons/ic_acode_terminal_glow.svg +++ b/www/icons/ic_acode_terminal_glow.svg @@ -27,7 +27,7 @@ - - + + From b69fd4e67229aba72261ffe6b2a4c3faf18f77f3 Mon Sep 17 00:00:00 2001 From: Ajit Kumar Date: Tue, 8 Sep 2026 10:32:10 +0530 Subject: [PATCH 7/9] Merge upstream main and resolve app icon conflicts (#2) * fix: fall back to internal storage when external storage is unavailable (#2781) * fix: fall back to internal storage when external storage is unavailable The app used to pick the external data directory unconditionally and then create the plugins directory without guarding against failures. On devices where the external filesystem cannot be created (e.g. Android/data dir is not creatable), the unhandled rejection aborted startup, leaving users stuck on the splash screen with a misleading "Update Android System WebView or Chrome" message. - Probe external storage with fs.stat() and fall back to internal storage - Wrap plugins directory creation in try/catch and fall back to internal - Request storage permissions only on SDK < 33, guarded by hasPermission - Guard editorManager.hasUnsavedFiles() access in exitAppMessage - Show an honest "storage is unavailable" startup message for storage errors * fix: detect storage errors via FileError instanceof instead of numeric code range * fix(theme): prevent freeze when switching to system theme (#2790) * fix(sftp): cancel stalled connections and prevent delayed errors (#2791) * fix(sftp): cancel stalled connections and prevent delayed errors * fix race cases * fix: admob issues (#2800) * fix: admob issues * fix: restore Android build commands --------- Co-authored-by: Ajit Kumar * fix(android): avoid splash surface crash on realme Android 13 (#2805) * fix(session): restore picker documents and skip intent files tab (#2809) * fix(session): restore picker documents and skip intent files tab * feat(file-browser): expose document picker(icon) from nested folders * fix * feat(console): isolate execution and improve mobile REPL UX (#2808) * feat(console): isolate execution and improve mobile REPL UX - run console JavaScript in a cancellable Web Worker - protect the app from infinite loops and recursion - preserve history with variable-height virtualization - restore the inline REPL layout - fix mobile keyboard resizing and viewport gaps - add clear and stop controls * fix(console): address execution context and bottom pinning * address the pinning regression * remove stop, run btn * feat(console): follow active Acode theme (#2814) * feat(console): follow active Acode theme * fix * fix * chore: update deps * Enhanced: Indonesian (id) language translations (#2798) * update deps * fix: preserve MIME type for plugin icons on plugin details page (#2818) * fix: preserve MIME type for plugin icons on plugin details page * fix * fix(console): run JavaScript files in isolated worker (#2819) * fix(console): run JavaScript files in isolated worker * fix * feat: plugin review (#2826) * feat: plugin commit Allow logged in user to review plugins from the app. * fix: api url --------- Co-authored-by: Ajit Kumar * Improve selection menu UX and plugin action overflow (#2813) * feat(editor): improve mobile selection menu overflow UX * fix(editor): prevent selection actions during overflow scrolling * fix(editor): validate pointer displacement on release * fix(search): include restored files in global search (#2830) * fix(search): include restored files in global search * fix * chore: v1.13.2 * refactor(file-browser): Convert directory cache to `Map` instance (#2831) Replace the plain object container used for cached directories with an ES6 `Map` to improve key management semantics. Update cached directory data structure (`src/pages/fileBrowser/fileBrowser.js`): - Re-initialize `cachedDir` variable as a `Map` - Replace object property lookups with `Map.prototype.has()` and `Map.prototype.get()` - Update cache writes to use `Map.prototype.set()` - Update directory deletion calls to use `Map.prototype.delete()` (AI generated commit message) * fix(editor): stabilize selection menu sizing and transitions (#2833) * fix(editor): keep fullscreen controls above bottom pane tabs (#2834) * chore(community-release-notifier): Change sed parsing - TG release notes (#2832) * chore(community-release-notifier): Change sed parsing - TG release notes This commit fixes Release notes not being sed escaped properly leading towards Telegram notifier failing for Stable Releases as they were auto-generated by git. * Disable markdown format in community release notifier Commented out the markdown format option in the Telegram notifier. * fix(editor): restore cursor state and prevent tab-switch flash (#2835) * fix(editor): restore cursor state and prevent tab-switch flash * fix * feat(lsp): improve actions, navigation, and position handling (#2837) - advertise code action resolve support - clamp LSP positions beyond document bounds - support LocationLink and multiple navigation results - add LSP operations to the selection menu - fix navigation scrolling after switching files - use shared position and location normalization helpers * fix(editor): highlight all visible search matches (#2838) * Translation: Update hu-hu.json (#2828) * Translation: Update hu-hu.json Fixing AI-translated strings * Translation: Update hu-hu.json Fix typos * chore(deps): bump actions/setup-java from 5 to 6 (#2821) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5 to 6. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-java dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: improved pluginContext (#2806) * feat: improved pluginContext * Update src/lib/pluginContext.js Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * format * fix: holes * format * . --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * fix(webview): retain instance when destroy fails (#2836) * fix(webview): retain instance when destroy fails * test(webview): cover destroy failure lifecycle * fix(webview): serialize concurrent destruction * test(webview): cover concurrent destruction * fix(sftp): recover from failed profile migration (#2840) * fix(sftp): recover from failed profile migration * fix(sftp): migrate folder-state URL keys * fix * fix * chore: v1.13.3 * fix: typo * fix: prevent Cordova exec startup race (#2851) * fix(editor): improve selection contrast on active lines (#2852) * fix(editor): treat missing write capability as editable (#2853) * fix(editor): treat missing write capability as editable * fix * fix: race condition when moving to exact line/col (#2856) * fix: race condition when moving to exact line/col * fix(search): cancel obsolete result navigation * fix(search): preserve loader during concurrent file opens * Add GitHub Actions workflow for congratulating Community PRs (#2855) * Shortcut For Opening Welcome Tab (#2773) * Update keyBindings.js * Fix formatting of welcomeTab key binding * Added new shortcut to open welcome window * Shortcut For Opening Welcome Tab * Update keyBindings.js * Modify welcomeTab key binding description Updated the description for the welcomeTab key binding. * Fix changes * Rename welcomeTab to acode:showWelcome fix cmd description and rename the command name to "acode:showWelcome" so that it matches the existing command and adds the keybind to it instead of a possibly new command. --------- Co-authored-by: Emmanuel Lobo <76094069+UnschooledGamer@users.noreply.github.com> * chore: Add Lingala (ln) translation (#2775) * Update Lingala translation * Add Lingala translation * Complete Lingala translation strings * chore: update Lingala translations * chore: update more Lingala translations * Complete Lingala translations * Update Lingala translation * Translate remaining strings to Lingala * Fix French strings in Lingala translation * Fix French strings in Lingala translation * Improve Lingala translation --------- Signed-off-by: dependabot[bot] Co-authored-by: Amr Ayman <48989143+ulite-Amr@users.noreply.github.com> Co-authored-by: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com> Co-authored-by: Ajit Kumar Co-authored-by: TM Co-authored-by: AuDevTist1C <114492072+AuDevTist1C@users.noreply.github.com> Co-authored-by: Emmanuel Lobo <76094069+UnschooledGamer@users.noreply.github.com> Co-authored-by: summoner Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rohit Kushvaha Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: azamkassim Co-authored-by: Game-Dev-Shubham Co-authored-by: Degrace --- .../workflows/community-release-notifier.yml | 12 +- .github/workflows/congrats.yml | 77 + .github/workflows/nightly-build.yml | 2 +- CHANGELOG.md | 39 + _typos.toml | 1 + bun.lock | 1328 +++-------------- config.xml | 4 +- hooks/post-process.js | 74 + package-lock.json | 1101 +++++++------- package.json | 74 +- readme.md | 2 + rspack.config.js | 1 + src/cm/commandRegistry.js | 10 +- src/cm/lsp/clientManager.ts | 17 +- src/cm/lsp/codeActions.ts | 31 +- src/cm/lsp/definition.ts | 147 ++ src/cm/lsp/diagnostics.ts | 9 +- src/cm/lsp/documentColors.ts | 5 +- src/cm/lsp/index.ts | 10 + src/cm/lsp/inlayHints.ts | 3 +- src/cm/lsp/locationUtils.ts | 26 + src/cm/lsp/positionUtils.ts | 16 + src/cm/lsp/references.ts | 4 +- src/cm/lsp/rename.ts | 47 +- src/cm/lsp/serverLauncher.ts | 2 +- src/cm/lsp/servers/luau.ts | 2 +- src/cm/lsp/tooltipExtensions.ts | 19 +- src/cm/lsp/types.ts | 7 +- src/cm/mainEditorExtensions.ts | 5 +- src/cm/searchMatchHighlighter.ts | 140 ++ src/cm/selectionMenuUtils.ts | 91 ++ src/cm/themes/catppuccin.js | 3 +- src/cm/themes/tokyoNight.js | 3 +- src/cm/themes/tomorrowNight.js | 3 +- src/cm/themes/tomorrowNightBright.js | 3 +- src/cm/themes/vscodeDark.js | 3 +- src/cm/touchSelectionMenu.js | 461 +++++- src/components/referencesPanel/utils.js | 29 +- src/components/settingsPage.scss | 5 + src/components/virtualList/index.js | 2 + src/components/virtualList/style.scss | 10 + src/components/virtualList/variable.js | 411 +++++ src/dialogs/confirm.js | 5 +- src/dialogs/loader.js | 34 +- src/dialogs/style.scss | 8 + src/fileSystem/sftp.js | 17 + src/handlers/intent.js | 23 +- src/lang/ar-ye.json | 34 +- src/lang/be-by.json | 34 +- src/lang/bn-bd.json | 34 +- src/lang/cs-cz.json | 34 +- src/lang/de-de.json | 34 +- src/lang/en-us.json | 34 +- src/lang/es-sv.json | 34 +- src/lang/fr-fr.json | 34 +- src/lang/he-il.json | 34 +- src/lang/hi-in.json | 34 +- src/lang/hu-hu.json | 34 +- src/lang/id-id.json | 290 ++-- src/lang/index.d.ts | 32 + src/lang/ir-fa.json | 34 +- src/lang/it-it.json | 34 +- src/lang/ja-jp.json | 34 +- src/lang/ko-kr.json | 34 +- src/lang/ln-ln.json | 846 +++++++++++ src/lang/ml-in.json | 34 +- src/lang/mm-unicode.json | 34 +- src/lang/mm-zawgyi.json | 34 +- src/lang/pl-pl.json | 34 +- src/lang/pt-br.json | 34 +- src/lang/pu-in.json | 34 +- src/lang/ru-ru.json | 34 +- src/lang/tl-ph.json | 34 +- src/lang/tr-tr.json | 34 +- src/lang/uk-ua.json | 34 +- src/lang/uz-uz.json | 34 +- src/lang/vi-vn.json | 34 +- src/lang/zh-cn.json | 34 +- src/lang/zh-hant.json | 34 +- src/lang/zh-tw.json | 34 +- src/lib/acode.js | 2 +- src/lib/adConsentCoordinator.mjs | 10 +- src/lib/bannerVisibilityController.mjs | 99 +- src/lib/console.js | 311 +++- src/lib/consoleRuntime.js | 217 +++ src/lib/consoleWorker.js | 168 +++ src/lib/editorFile.js | 80 +- src/lib/editorManager.js | 67 +- src/lib/fileSessionPersistence.js | 13 + src/lib/keyBindings.js | 6 + src/lib/lang.js | 34 + src/lib/loadPlugin.js | 10 +- src/lib/openFile.js | 66 +- src/lib/pluginContext.js | 165 ++ src/lib/remoteStorage.js | 16 +- src/lib/restoreFiles.js | 47 +- src/lib/run.js | 45 +- src/lib/saveState.js | 15 +- src/lib/selectionMenu.js | 139 +- src/lib/sftpProfiles.js | 198 ++- src/lib/startAd.js | 4 +- src/lib/webview.js | 21 +- src/main.js | 124 +- src/main.scss | 152 +- src/pages/fileBrowser/fileBrowser.js | 85 +- src/pages/fileBrowser/index.js | 7 +- src/pages/plugin/plugin.js | 5 +- src/pages/plugin/plugin.scss | 504 ++++++- src/pages/plugin/plugin.view.js | 792 +++++++++- src/pages/plugin/reviewUtils.js | 180 +++ .../admob/src/android/cordova/Privacy.kt | 24 +- .../com/foxdebug/browser/BrowserActivity.java | 38 +- src/plugins/pluginContext/plugin.xml | 5 - .../pluginContext/src/android/Tee.java | 160 +- .../pluginContext/www/PluginContext.js | 90 -- src/plugins/sdcard/index.d.ts | 1 + src/plugins/sdcard/src/android/SDcard.java | 36 +- src/plugins/sftp/index.d.ts | 4 + .../sftp/src/com/foxdebug/sftp/Sftp.java | 259 +++- src/plugins/sftp/www/sftp.js | 6 + src/settings/mainSettings.js | 11 +- src/sidebarApps/extensions/index.js | 21 +- src/sidebarApps/searchInFiles/index.js | 48 +- .../searchInFiles/navigateToResult.js | 59 + src/styles/console.m.scss | 496 +++--- src/styles/page.scss | 45 - src/theme/list.js | 14 +- src/theme/preInstalled.js | 5 +- src/views/console.hbs | 29 +- tests/admob/adConsentCoordinator.test.js | 73 +- .../admob/bannerVisibilityController.test.js | 202 ++- tests/unit/confirm.test.js | 36 +- tests/unit/consoleExecutionContext.test.js | 111 ++ tests/unit/consoleExecutor.test.js | 134 ++ tests/unit/consoleViewport.test.js | 41 + tests/unit/editorThemes.test.js | 12 + .../lspExternalWebSocketLifecycle.test.js | 18 + tests/unit/lspLocationUtils.test.ts | 38 + tests/unit/lspPositionUtils.test.ts | 28 + tests/unit/openFileCancellation.test.js | 223 +++ tests/unit/pluginContext.test.js | 27 + tests/unit/pluginReview.test.js | 183 +++ tests/unit/restoreFiles.test.js | 70 + tests/unit/searchMatchHighlighter.test.ts | 161 ++ tests/unit/searchResultNavigation.test.js | 229 +++ tests/unit/selectionMenuButton.test.ts | 89 ++ tests/unit/selectionMenuUtils.test.ts | 34 +- tests/unit/sessionPersistence.test.js | 198 +++ tests/unit/sftpProfiles.test.js | 172 ++- tests/unit/variableVirtualList.test.js | 194 +++ tests/unit/webview.test.js | 71 + webpack.config.js | 1 + www/index.html | 25 +- 153 files changed, 10949 insertions(+), 2868 deletions(-) create mode 100644 .github/workflows/congrats.yml create mode 100644 src/cm/lsp/definition.ts create mode 100644 src/cm/lsp/locationUtils.ts create mode 100644 src/cm/lsp/positionUtils.ts create mode 100644 src/cm/searchMatchHighlighter.ts create mode 100644 src/components/virtualList/variable.js create mode 100644 src/lang/ln-ln.json create mode 100644 src/lib/consoleRuntime.js create mode 100644 src/lib/consoleWorker.js create mode 100644 src/lib/fileSessionPersistence.js create mode 100644 src/lib/pluginContext.js create mode 100644 src/pages/plugin/reviewUtils.js delete mode 100644 src/plugins/pluginContext/www/PluginContext.js create mode 100644 src/sidebarApps/searchInFiles/navigateToResult.js create mode 100644 tests/unit/consoleExecutionContext.test.js create mode 100644 tests/unit/consoleExecutor.test.js create mode 100644 tests/unit/consoleViewport.test.js create mode 100644 tests/unit/lspLocationUtils.test.ts create mode 100644 tests/unit/lspPositionUtils.test.ts create mode 100644 tests/unit/openFileCancellation.test.js create mode 100644 tests/unit/pluginContext.test.js create mode 100644 tests/unit/pluginReview.test.js create mode 100644 tests/unit/restoreFiles.test.js create mode 100644 tests/unit/searchMatchHighlighter.test.ts create mode 100644 tests/unit/searchResultNavigation.test.js create mode 100644 tests/unit/selectionMenuButton.test.ts create mode 100644 tests/unit/sessionPersistence.test.js create mode 100644 tests/unit/variableVirtualList.test.js create mode 100644 tests/unit/webview.test.js diff --git a/.github/workflows/community-release-notifier.yml b/.github/workflows/community-release-notifier.yml index 1b08d7bee3..5dc9daa458 100644 --- a/.github/workflows/community-release-notifier.yml +++ b/.github/workflows/community-release-notifier.yml @@ -56,7 +56,7 @@ jobs: id: vars env: INPUT_TAG: ${{ github.event.release.tag_name || inputs.tag_name }} - INPUT_URL: ${{ github.event.release.url || inputs.url }} + INPUT_URL: ${{ github.event.release.html_url || inputs.url }} INPUT_BODY: ${{ github.event.release.body || inputs.body }} run: | TAG="$INPUT_TAG" @@ -68,7 +68,12 @@ jobs: # Escape problematic characters for MarkdownV2 (very conservative escaping) # We escape: _ * [ ] ( ) ~ ` > # + - = | { } . ! \ BODY_SAFE=$(printf '%s' "$INPUT_BODY" | \ - sed 's/[_*[\]()~`>#+=|{}.!\\-]/\\&/g') + sed -E \ + -e 's/^[[:space:]]*##[[:space:]]*//' \ + -e 's/^[[:space:]]*\*[[:space:]]+/- /' \ + -e 's/\*\*([^*]*)\*\*/\*\1\*/g' \ + -e 's/\\!/!/g' \ + -e 's/@([A-Za-z0-9-]+)/@\1/g') TAG_SAFE=$(printf '%s' "$TAG" | sed 's/[_*[\]()~`>#+=|{}.!\\-]/\\&/g') if [[ "$TAG" == *"-nightly"* ]]; then @@ -140,7 +145,8 @@ jobs: ${{ steps.vars.outputs.announce }} ${{ steps.vars.outputs.body_safe }} - format: markdown + # disabled for time being see https://github.com/Acode-Foundation/Acode/pull/2832#discussion_r3887130617 + #format: markdown disable_web_page_preview: true # Only needed for topic-enabled supergroups/channels message_thread_id: ${{ secrets.TELEGRAM_MESSAGE_THREAD_ID }} diff --git a/.github/workflows/congrats.yml b/.github/workflows/congrats.yml new file mode 100644 index 0000000000..0ba154b32c --- /dev/null +++ b/.github/workflows/congrats.yml @@ -0,0 +1,77 @@ +name: Congrats + +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + check-author: + runs-on: ubuntu-latest + if: github.repository_owner == 'acode-foundation' && github.event.head_commit.message != '' + outputs: + should_congratulate: ${{ steps.check.outputs.should_congratulate }} + steps: + - name: Check PR author + id: check + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + with: + github-token: ${{ secrets.CONGRATSBOT_GITHUB_TOKEN }} + script: | + const { owner, repo } = context.repo; + const sha = context.sha; + + // Find the merged PR associated with this push commit + const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({ + owner, + repo, + commit_sha: sha, + }); + + const mergedPr = prs.find(pr => pr.merged_at !== null); + + if (!mergedPr) { + core.info('No merged PR found for this push.'); + core.setOutput('should_congratulate', 'false'); + return; + } + + const author = mergedPr.user; + + // Skip bots + if (author.type === 'Bot') { + core.info(`Skipping bot user: ${author.login}`); + core.setOutput('should_congratulate', 'false'); + return; + } + + // Check organization membership in team slug 'acode' + try { + await github.rest.teams.getMembershipForUserInOrg({ + org: owner, + team_slug: 'acode', + username: author.login, + }); + + core.info(`User ${author.login} is a member of team 'acode'. Skipping congrats.`); + core.setOutput('should_congratulate', 'false'); + } catch (error) { + if (error.status === 404) { + core.info(`User ${author.login} is not a member of team 'acode'. Sending congrats.`); + core.setOutput('should_congratulate', 'true'); + } else { + core.setFailed(`Error checking team membership: ${error.message}`); + } + } + + congrats: + needs: check-author + if: needs.check-author.outputs.should_congratulate == 'true' + uses: UnschooledGamer/automation/.github/workflows/congratsbot.yml@patch-1 # patch-1 for now + with: + EMOJIS: 🎉,🎊,🧑‍🚀,🥳,🙌,🚀,🦀,🔥,🚢 + secrets: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_CONGRATS }} diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index b7812b4341..4323996a06 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -106,7 +106,7 @@ jobs: allow-unsafe-pr-checkout: ${{ !!(inputs.is_PR && inputs.PR_NUMBER && github.event.pull_request.head.sha) }} - name: Setup Java - uses: actions/setup-java@v5 + uses: actions/setup-java@v6 with: distribution: temurin java-version: "21" diff --git a/CHANGELOG.md b/CHANGELOG.md index 60ee76afad..e824b1f7aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,44 @@ # Change Log +## v1.13.3 + +* refactor(file-browser): Replace plain object directory cache with `Map` by @AuDevTist1C in https://github.com/Acode-Foundation/Acode/pull/2831 +* fix(editor): stabilize selection menu sizing and transitions by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2833 +* fix(editor): keep fullscreen controls above bottom pane tabs by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2834 +* chore(community-release-notifier): Change sed parsing - TG release notes by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/2832 +* fix(editor): restore cursor state and prevent tab-switch flash by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2835 +* feat(lsp): improve actions, navigation, and position handling by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2837 +* fix(editor): highlight all visible search matches by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2838 +* Translation: Update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/2828 +* chore(deps): bump actions/setup-java from 5 to 6 by @dependabot[bot] in https://github.com/Acode-Foundation/Acode/pull/2821 +* feat: improved pluginContext by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/2806 +* fix(webview): retain instance when destroy fails by @azamkassim in https://github.com/Acode-Foundation/Acode/pull/2836 +* fix(sftp): recover from failed profile migration by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2840 + +## v1.13.2 + +* feat: stabilize SFTP and add secure SSH terminal integration by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2694 +* fix(lsp): correct workspace and document color capabilities and add tailwind lsp by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2736 +* refactor: Standardize DOM element dataset attributes across file browser component by @AuDevTist1C in https://github.com/Acode-Foundation/Acode/pull/2543 +* fix(lsp): preserve websocket clients across tab switches by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2764 +* feat(plugins): expose static CodeMirror highlighter by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2769 +* refactor(loader): Extract `tailSpin` SVG component and dynamic gradient logic by @AuDevTist1C in https://github.com/Acode-Foundation/Acode/pull/2776 +* fix(quick-tools): prevent scrollbars during editor gestures by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2777 +* fix: fall back to internal storage when external storage is unavailable by @ulite-Amr in https://github.com/Acode-Foundation/Acode/pull/2781 +* fix(theme): prevent freeze when switching to system theme by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2790 +* fix(sftp): cancel stalled connections and prevent delayed errors by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2791 +* fix: admob issues by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/2800 +* fix(android): avoid splash surface crash on realme Android 13 by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2805 +* fix(session): restore picker documents and skip intent files tab by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2809 +* feat(console): isolate execution and improve mobile REPL UX by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2808 +* feat(console): follow active Acode theme by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2814 +* chore: improve Indonesian (id) language translations by @MatrixTM26 in https://github.com/Acode-Foundation/Acode/pull/2798 +* fix: preserve MIME type for plugin icons on plugin details page by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2818 +* fix(console): run JavaScript files in isolated worker by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2819 +* feat: plugin review by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/2826 +* Improve selection menu UX and plugin action overflow by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2813 +* fix(search): include restored files in global search by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2830 + ## v1.12.9 * fix(admob): remove the policy-prohibited interstitial shown while exiting the app diff --git a/_typos.toml b/_typos.toml index 0b501dc4c1..8bc0f2fa3f 100644 --- a/_typos.toml +++ b/_typos.toml @@ -26,6 +26,7 @@ extend-exclude = [ "src/lang/it-it.json", "src/lang/ja-jp.json", "src/lang/ko-kr.json", + "src/lang/ln-ln.json", "src/lang/ml-in.json", "src/lang/mm-unicode.json", "src/lang/mm-zawgyi.json", diff --git a/bun.lock b/bun.lock index 33528b9faf..308c5a1031 100644 --- a/bun.lock +++ b/bun.lock @@ -6,19 +6,19 @@ "name": "com.foxdebug.acode", "dependencies": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", + "@codemirror/commands": "^6.11.0", "@codemirror/lang-angular": "^0.1.4", "@codemirror/lang-cpp": "^6.0.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-go": "^6.0.1", - "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-java": "^6.0.2", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-jinja": "^6.0.1", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-less": "^6.0.2", "@codemirror/lang-liquid": "^6.3.2", - "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-markdown": "^6.5.2", "@codemirror/lang-php": "^6.0.2", "@codemirror/lang-python": "^6.2.1", "@codemirror/lang-rust": "^6.0.2", @@ -28,15 +28,15 @@ "@codemirror/lang-wast": "^6.0.2", "@codemirror/lang-xml": "^6.1.0", "@codemirror/lang-yaml": "^6.1.3", - "@codemirror/language": "^6.12.3", + "@codemirror/language": "^6.12.4", "@codemirror/language-data": "^6.5.2", "@codemirror/legacy-modes": "^6.5.3", "@codemirror/lint": "^6.9.7", "@codemirror/lsp-client": "github:Acode-Foundation/codemirror-lsp-client#db6930c2b6db67e14978f08ae8f5aeb149d29468", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.1", "@codemirror/theme-one-dark": "^6.1.3", - "@codemirror/view": "^6.43.4", + "@codemirror/view": "^6.43.9", "@deadlyjack/ajax": "^1.2.6", "@emmetio/codemirror6-plugin": "^0.4.1", "@lezer/common": "^1.5.0", @@ -51,57 +51,57 @@ "@xterm/addon-web-links": "^0.12.0", "@xterm/addon-webgl": "^0.19.0", "@xterm/xterm": "^6.0.0", - "acorn": "^8.16.0", + "acorn": "^8.18.0", "autosize": "^6.0.1", "codemirror": "^6.0.2", "cordova": "13.0.0", - "core-js": "^3.49.0", - "dayjs": "^1.11.20", - "dompurify": "^3.4.11", + "core-js": "^3.50.0", + "dayjs": "^1.11.23", + "dompurify": "^3.4.14", "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", - "filesize": "^11.0.17", + "filesize": "^11.0.22", "html-tag-js": "^2.4.16", "jszip": "^3.10.1", - "katex": "^0.16.45", - "markdown-it": "^14.2.0", - "markdown-it-anchor": "^9.2.0", - "markdown-it-emoji": "^3.0.0", + "katex": "^0.16.47", + "markdown-it": "^14.3.0", + "markdown-it-anchor": "^9.2.1", + "markdown-it-emoji": "^3.1.0", "markdown-it-footnote": "^4.0.0", "markdown-it-github-alerts": "^1.0.1", "markdown-it-task-lists": "^2.1.1", "markdown-it-texmath": "^1.0.0", "mermaid": "^11.14.0", "mime-types": "^3.0.2", - "motion": "^12.42.0", + "motion": "^12.43.0", "mustache": "^4.2.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.7", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", "vscode-css-languageservice": "6.3.10", "vscode-html-languageservice": "5.6.2", "vscode-json-languageservice": "5.7.2", "vscode-languageserver-textdocument": "1.0.12", - "yargs": "^18.0.0", + "yargs": "^18.1.0", }, "devDependencies": { "@babel/core": "^8.0.1", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.3", + "@babel/generator": "^7.29.8", + "@babel/parser": "^7.29.8", "@babel/plugin-transform-runtime": "^8.0.1", - "@babel/preset-env": "^8.0.1", + "@babel/preset-env": "^8.0.2", "@babel/preset-typescript": "^8.0.1", - "@babel/runtime": "^7.29.2", - "@babel/runtime-corejs3": "^7.29.2", - "@babel/traverse": "^7.29.0", + "@babel/runtime": "^7.29.7", + "@babel/runtime-corejs3": "^7.29.7", + "@babel/traverse": "^7.29.8", "@biomejs/biome": "2.4.11", "@lezer/generator": "^1.8.0", - "@rspack/cli": "^2.0.0", - "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.2.0", + "@rspack/core": "^2.2.0", "@types/ace": "^0.0.52", "@types/cordova": "^11.0.3", "@types/url-parse": "^1.4.11", - "autoprefixer": "^10.5.0", + "autoprefixer": "^10.5.4", "babel-loader": "^10.1.1", "chokidar": "^4.0.3", "com.foxdebug.acode.rk.auth": "file:src/plugins/auth", @@ -126,33 +126,33 @@ "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", "css-loader": "^7.1.4", - "happy-dom": "^20.11.1", + "happy-dom": "^20.11.6", "mini-css-extract-plugin": "^2.10.2", "path-browserify": "^1.0.1", "postcss-loader": "^8.2.1", "prettier": "^3.8.3", "prettier-plugin-java": "^2.8.1", "raw-loader": "^4.0.2", - "sass": "^1.99.0", + "sass": "^1.103.1", "sass-loader": "^16.0.8", "style-loader": "^4.0.0", "terminal": "^0.1.4", - "ts-loader": "^9.5.7", + "ts-loader": "^9.6.2", "typescript": "^5.9.3", - "vitest": "^4.1.10", + "vitest": "^4.1.11", "vscode-languageserver-types": "^3.17.5", - "ws": "^8.21.0", + "ws": "^8.21.3", }, }, }, "overrides": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", - "@codemirror/language": "^6.12.3", + "@codemirror/commands": "^6.11.0", + "@codemirror/language": "^6.12.4", "@codemirror/lint": "^6.9.7", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.43.4", + "@codemirror/state": "^6.7.1", + "@codemirror/view": "^6.43.9", "tar": "^7.5.22", }, "packages": { @@ -164,7 +164,7 @@ "@babel/core": ["@babel/core@8.0.1", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-compilation-targets": "^8.0.0", "@babel/helpers": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/traverse": "^8.0.0", "@babel/types": "^8.0.0", "@types/gensync": "^1.0.5", "convert-source-map": "^2.0.0", "empathic": "^2.0.1", "gensync": "^1.0.0-beta.2", "import-meta-resolve": "^4.2.0", "json5": "^2.2.3", "obug": "^2.1.1", "semver": "^7.7.3" } }, "sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw=="], - "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], + "@babel/generator": ["@babel/generator@7.29.8", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" } }, "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw=="], @@ -176,7 +176,7 @@ "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@1.0.0", "", { "dependencies": { "@babel/helper-compilation-targets": "^8.0.0", "@babel/helper-plugin-utils": "^8.0.0", "lodash.debounce": "^4.0.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0" } }, "sha512-9jzVaTeZyXRDKTgUnNzcPQMO8y0ga3o+Z4fKjNet9Fcx7slgKa83qRbz0EwROSd6qO6CoEe/HQszqSPKb5lhkw=="], - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@8.0.0", "", { "dependencies": { "@babel/traverse": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ=="], @@ -204,7 +204,7 @@ "@babel/helpers": ["@babel/helpers@8.0.0", "", { "dependencies": { "@babel/template": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg=="], - "@babel/parser": ["@babel/parser@7.29.3", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA=="], + "@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@8.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^8.0.1" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-Ytgjjne4RnG3Oig7ik+NfY4ebRY30BPptVkkyu1f72eINJXRM3/bkU++tIc5aPvyLmo4KH20avq0xJ2o+9aEnw=="], @@ -332,13 +332,13 @@ "@babel/preset-typescript": ["@babel/preset-typescript@8.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-validator-option": "^8.0.0", "@babel/plugin-transform-modules-commonjs": "^8.0.1", "@babel/plugin-transform-typescript": "^8.0.1" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-qrPhQIN1NLrPmzgazF9XKQqXrOcp/WJly+K+6ReFonn24FZqRJO7clxOJo6Ni75L+2vAqI3cHVU2OJLBxoPp5A=="], - "@babel/runtime": ["@babel/runtime@7.29.2", "", {}, "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="], + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], - "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.29.2", "", { "dependencies": { "core-js-pure": "^3.48.0" } }, "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw=="], + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.29.7", "", { "dependencies": { "core-js-pure": "^3.48.0" } }, "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ=="], "@babel/template": ["@babel/template@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ=="], - "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + "@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="], "@babel/types": ["@babel/types@8.0.0", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.0" } }, "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw=="], @@ -374,7 +374,7 @@ "@codemirror/autocomplete": ["@codemirror/autocomplete@6.20.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g=="], - "@codemirror/commands": ["@codemirror/commands@6.10.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.6.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q=="], + "@codemirror/commands": ["@codemirror/commands@6.11.0", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.7.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA=="], "@codemirror/lang-angular": ["@codemirror/lang-angular@0.1.4", "", { "dependencies": { "@codemirror/lang-html": "^6.0.0", "@codemirror/lang-javascript": "^6.1.2", "@codemirror/language": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.3.3" } }, "sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g=="], @@ -384,7 +384,7 @@ "@codemirror/lang-go": ["@codemirror/lang-go@6.0.1", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/go": "^1.0.0" } }, "sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg=="], - "@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + "@codemirror/lang-html": ["@codemirror/lang-html@6.4.12", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w=="], "@codemirror/lang-java": ["@codemirror/lang-java@6.0.2", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@lezer/java": "^1.0.0" } }, "sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ=="], @@ -398,7 +398,7 @@ "@codemirror/lang-liquid": ["@codemirror/lang-liquid@6.3.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.3.1" } }, "sha512-6PDVU3ZnfeYyz1at1E/ttorErZvZFXXt1OPhtfe1EZJ2V2iDFa0CwPqPgG5F7NXN0yONGoBogKmFAafKTqlwIw=="], - "@codemirror/lang-markdown": ["@codemirror/lang-markdown@6.5.0", "", { "dependencies": { "@codemirror/autocomplete": "^6.7.1", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.3.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.2.1", "@lezer/markdown": "^1.0.0" } }, "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw=="], + "@codemirror/lang-markdown": ["@codemirror/lang-markdown@6.5.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.7.1", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.3.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.2.1", "@lezer/markdown": "^1.0.0" } }, "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw=="], "@codemirror/lang-php": ["@codemirror/lang-php@6.0.2", "", { "dependencies": { "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/php": "^1.0.0" } }, "sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA=="], @@ -418,7 +418,7 @@ "@codemirror/lang-yaml": ["@codemirror/lang-yaml@6.1.3", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.0.0", "@lezer/yaml": "^1.0.0" } }, "sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ=="], - "@codemirror/language": ["@codemirror/language@6.12.3", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA=="], + "@codemirror/language": ["@codemirror/language@6.12.4", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A=="], "@codemirror/language-data": ["@codemirror/language-data@6.5.2", "", { "dependencies": { "@codemirror/lang-angular": "^0.1.0", "@codemirror/lang-cpp": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-go": "^6.0.0", "@codemirror/lang-html": "^6.0.0", "@codemirror/lang-java": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/lang-jinja": "^6.0.0", "@codemirror/lang-json": "^6.0.0", "@codemirror/lang-less": "^6.0.0", "@codemirror/lang-liquid": "^6.0.0", "@codemirror/lang-markdown": "^6.0.0", "@codemirror/lang-php": "^6.0.0", "@codemirror/lang-python": "^6.0.0", "@codemirror/lang-rust": "^6.0.0", "@codemirror/lang-sass": "^6.0.0", "@codemirror/lang-sql": "^6.0.0", "@codemirror/lang-vue": "^0.1.1", "@codemirror/lang-wast": "^6.0.0", "@codemirror/lang-xml": "^6.0.0", "@codemirror/lang-yaml": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/legacy-modes": "^6.4.0" } }, "sha512-CPkWBKrNS8stYbEU5kwBwTf3JB1kghlbh4FSAwzGW2TEscdeHHH4FGysREW86Mqnj3Qn09s0/6Ea/TutmoTobg=="], @@ -426,15 +426,15 @@ "@codemirror/lint": ["@codemirror/lint@6.9.7", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.42.0", "crelt": "^1.0.5" } }, "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg=="], - "@codemirror/lsp-client": ["@codemirror/lsp-client@github:Acode-Foundation/codemirror-lsp-client#db6930c", { "dependencies": { "@codemirror/autocomplete": "^6.20.0", "@codemirror/language": "^6.11.0", "@codemirror/lint": "^6.8.5", "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.37.0", "@lezer/highlight": "^1.2.1", "marked": "^15.0.12", "vscode-languageserver-protocol": "^3.17.5" } }, "Acode-Foundation-codemirror-lsp-client-db6930c"], + "@codemirror/lsp-client": ["@codemirror/lsp-client@github:Acode-Foundation/codemirror-lsp-client#db6930c", { "dependencies": { "@codemirror/autocomplete": "^6.20.0", "@codemirror/language": "^6.11.0", "@codemirror/lint": "^6.8.5", "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.37.0", "@lezer/highlight": "^1.2.1", "marked": "^15.0.12", "vscode-languageserver-protocol": "^3.17.5" } }, "Acode-Foundation-codemirror-lsp-client-db6930c", "sha512-yENf3NqsXGERWcvUL98FziXbUgkB1R4jU2kTQGYxwcZ6HwTP8+uwebs/j+HDRD7VbxRyemYJClvMNU8n0p8UPg=="], "@codemirror/search": ["@codemirror/search@6.7.1", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.37.0", "crelt": "^1.0.5" } }, "sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA=="], - "@codemirror/state": ["@codemirror/state@6.6.0", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ=="], + "@codemirror/state": ["@codemirror/state@6.7.1", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A=="], "@codemirror/theme-one-dark": ["@codemirror/theme-one-dark@6.1.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/highlight": "^1.0.0" } }, "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA=="], - "@codemirror/view": ["@codemirror/view@6.43.4", "", { "dependencies": { "@codemirror/state": "^6.7.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-YImu23iyKfncJzT7sRy+rEqEhSc8RhOHqDxwy4WzXRKJwYm6iwf/9OJk5ctCAdZ6yi2ZqaGEvmf55fSVqMDrgg=="], + "@codemirror/view": ["@codemirror/view@6.43.9", "", { "dependencies": { "@codemirror/state": "^6.7.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw=="], "@deadlyjack/ajax": ["@deadlyjack/ajax@1.2.6", "", {}, "sha512-VwZU8YUflO2/V/dl3dluu+3jg8Ghz/W5fwxD5Z21OZXKeV73d+vStKVBe4wi+Av2KbTR35K7Z+5Q3iIpjB41MA=="], @@ -448,16 +448,14 @@ "@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="], - "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + "@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], - "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], "@gar/promise-retry": ["@gar/promise-retry@1.0.3", "", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="], - "@gar/promisify": ["@gar/promisify@1.1.3", "", {}, "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="], - "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="], @@ -514,9 +512,9 @@ "@marijn/find-cluster-break": ["@marijn/find-cluster-break@1.0.2", "", {}, "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g=="], - "@mermaid-js/parser": ["@mermaid-js/parser@1.1.1", "", { "dependencies": { "@chevrotain/types": "~11.1.1" } }, "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw=="], + "@mermaid-js/parser": ["@mermaid-js/parser@1.2.1", "", { "dependencies": { "@chevrotain/types": "~11.1.2" } }, "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], "@netflix/nerror": ["@netflix/nerror@1.1.3", "", { "dependencies": { "assert-plus": "^1.0.0", "extsprintf": "^1.4.0", "lodash": "^4.17.15" } }, "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg=="], @@ -540,8 +538,6 @@ "@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@9.0.3", "", { "dependencies": { "cacache": "^20.0.0", "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5" } }, "sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg=="], - "@npmcli/move-file": ["@npmcli/move-file@1.1.2", "", { "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg=="], - "@npmcli/name-from-folder": ["@npmcli/name-from-folder@4.0.0", "", {}, "sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg=="], "@npmcli/node-gyp": ["@npmcli/node-gyp@5.0.0", "", {}, "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ=="], @@ -618,31 +614,39 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@rspack/binding": ["@rspack/binding@2.0.2", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "2.0.2", "@rspack/binding-darwin-x64": "2.0.2", "@rspack/binding-linux-arm64-gnu": "2.0.2", "@rspack/binding-linux-arm64-musl": "2.0.2", "@rspack/binding-linux-x64-gnu": "2.0.2", "@rspack/binding-linux-x64-musl": "2.0.2", "@rspack/binding-wasm32-wasi": "2.0.2", "@rspack/binding-win32-arm64-msvc": "2.0.2", "@rspack/binding-win32-ia32-msvc": "2.0.2", "@rspack/binding-win32-x64-msvc": "2.0.2" } }, "sha512-0kZPplW9GWx8mfC6DfsaRY3QBIYPuUs42JfmSM6aSb8tMHZAXQeLeMB8M+h8i4SeI+aFtCgO6UuYGtyWf7+L+A=="], + "@rspack/binding": ["@rspack/binding@2.2.0", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "2.2.0", "@rspack/binding-darwin-x64": "2.2.0", "@rspack/binding-linux-arm64-gnu": "2.2.0", "@rspack/binding-linux-arm64-musl": "2.2.0", "@rspack/binding-linux-ppc64-gnu": "2.2.0", "@rspack/binding-linux-riscv64-gnu": "2.2.0", "@rspack/binding-linux-riscv64-musl": "2.2.0", "@rspack/binding-linux-s390x-gnu": "2.2.0", "@rspack/binding-linux-x64-gnu": "2.2.0", "@rspack/binding-linux-x64-musl": "2.2.0", "@rspack/binding-wasm32-wasi": "2.2.0", "@rspack/binding-win32-arm64-msvc": "2.2.0", "@rspack/binding-win32-ia32-msvc": "2.2.0", "@rspack/binding-win32-x64-msvc": "2.2.0" } }, "sha512-nxZzJqqB0EmEKp6qjzFNkBb/SgGt0k0DSENrLvAJgvVvrm3waVsubD0cfxtPlZY/rd5SzadzxWGEHRyFcds5nA=="], + + "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@2.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-KAVVT7hp3NBjtc/RY2UtOjzzc8i+s4pIhW1p52UV+Aev6ywQCu3dXwkHTonpPvJO3hqLXc4zIMH5l4HbMqBm4g=="], + + "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@2.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-rzyJCX99aFwl540trsVMNZOgK4+IFm2d5+YeP+RdNo9Uprxloz8vHz0J4dYtaq6MRiCAyM60dAwEa3wJMwqWAQ=="], - "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@2.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0o7lbgBBsDlICWdjIH0q3e0BsSco4GRiImHWVfZSVEG+q2+ykZJvSvYCVhPM1Co375Z0S3VMPa/8SjcY1FHwlw=="], + "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0t8QOiOMcBV7RvPSsTJ5DQ4QCK6FIyUZy77qbxnS6asGTOXPZZn7V5cL26IxEv/wuHdQ6tQOXheau1fi+gGyBQ=="], - "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@2.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-tOwxZpoPlTlRs/w6UyUinXJ4TYRVHMlR7+eQxO1R3muKpixvhXQjtvoaY16HuFyTVky5F0IfOoWr3x9FEsgdLg=="], + "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-BAvCukqcuHxUdE294ITCohvhVkEklW8RbkKkR36Uo0WyIiMPGrnvPjARPn0/4Q4xMAz7lUmC60sZrvJHlAOKMw=="], - "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@2.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-1ZD4YFhG1rmgqj+W8hfwHyKV8xDxGsc/3KgU0FwmiVEX7JfzhCkgBO/xlCG79kRKSrzuVzt4icO/G3cCKn0pag=="], + "@rspack/binding-linux-ppc64-gnu": ["@rspack/binding-linux-ppc64-gnu@2.2.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nCHqZLv/E8nm2ccGkb00F5DQtXxzGy3W3X73ArA+N0+zXJUnzRcSRSwr7AE8pVgP/FYfX4yMFgUXy0g0YxYGRA=="], - "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@2.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-/PtTkM/DsDLjeuXTmeJeRfbjCDbcL9jvoVgZrgxYFZ28y2cdLvbChbW9uigOzs5dQEs1CIBQXMTTj7KhdBTuQg=="], + "@rspack/binding-linux-riscv64-gnu": ["@rspack/binding-linux-riscv64-gnu@2.2.0", "", { "os": "linux", "cpu": "none" }, "sha512-CA3WEqKFDI6FAZTnCho2n9pmdPWZYAW/S8mqgxd0cx2Jix43at3VyLxhCC7ED5A9WBSFn/AdHaIbVtgoQHVhWA=="], - "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@2.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-bBjsZxMHRaPo6X9SokApm6ucs+UhXtAJFyJJyuk2BH4XJsLeCU9Dz1vMwioeohFbJUUeTASVPm6/BL+RhSaunw=="], + "@rspack/binding-linux-riscv64-musl": ["@rspack/binding-linux-riscv64-musl@2.2.0", "", { "os": "linux", "cpu": "none" }, "sha512-kHB960oClkoPRPZ6sdkhRvqbdRIlbpIMYd/Tbxfmn3DWQahiCk1pkUFJbOtFq3EgESxZISV4THl442W2Y57HvQ=="], - "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@2.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-HjlpInqzabDNkhVsUJpsHPqa9QYVWBViJoyWNjzXCAW0vKMDvwaphyUvokSinX8FGTlZi/sr5UEaHJo6XtQ35g=="], + "@rspack/binding-linux-s390x-gnu": ["@rspack/binding-linux-s390x-gnu@2.2.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-lVBdiffVo1jq0P0jT36jNou2suLB4ueQI4aWUs+HM+h67YPBtVKWu/mo5Wh59+8nowgcZmYaFM5hdH69963I9w=="], - "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@2.0.2", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "1.1.4" }, "cpu": "none" }, "sha512-YaRYNFLJRpkGfYjSWR7n9f+nQKtrlmrrffpAn/blc2geHcRvXoBc5SCs1idPtsLhj7H9qWWhs7ucjyHy4csWFg=="], + "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-M49UaWspE0YJ3268DsquD8idEQTfjBDMvO/I8qccV/Z5T+Q98FJ+kIs5liUaTWb48OIbDEK+8ZKx5QzLbfVN6g=="], - "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@2.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-d/3kTEKq+asLjRFPO96t+wfWiM7DLN76VQEPDD9bc1kdsZXlVJBuvyXfsgK8bbEvKplWXYcSsokhmEnuXrLOpg=="], + "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-YYbs0wmey+5blhEQDE4Dax3TwJtqfGwe2QBm3OLphlBHo/fcZVvimzKkMV0/pVrZTLy2z5ZAwNhGMY64bNr77w=="], - "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@2.0.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-161cWineq3RW+Jdm1FAfSpXeUtYWvhB3kAbm46vNT9h/YYz+spwsFMvveAZ1nsVSVL0IC5lDBGUte7yUAY8K2g=="], + "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@2.2.0", "", { "dependencies": { "@emnapi/core": "1.11.3", "@emnapi/runtime": "1.11.3", "@napi-rs/wasm-runtime": "1.1.6" }, "cpu": "none" }, "sha512-rerLPTN/HD4EvLNWs3O2N+Eb37eGvLRIP3dXXc3n+UzTebOepAsahNn44vXeRBsE4m/pHkpDJjwgWTytgQ2gBw=="], - "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@2.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-y7Q0S1FE+OlkL5GMqLG0PwxrPw6E1r892KhGrGKE1Vdufe5YTEx6xTPxzZ+b7N2KPD7s9G1/iJmWHQxb1+Bjkg=="], + "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@2.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-JUAmnbOQYGTRyX28vls/MOMonZWcmcCi5YtEq6YMc8Xqh3Qx0HUwaLM/I1xr/N9BX3b8CV0dQDOpNuBc2ei+CA=="], - "@rspack/cli": ["@rspack/cli@2.0.2", "", { "peerDependencies": { "@rspack/core": "^2.0.0-0", "@rspack/dev-server": "^2.0.0-0" }, "optionalPeers": ["@rspack/dev-server"], "bin": { "rspack": "bin/rspack.js" } }, "sha512-rwuzo/V59ck/ChNkxMEEjuXLFs8nPJ37K0PMuUeIMmzFJNdUcPLxSV3qaV9azDLGcyq4XwcyQvexH3okWbfUfQ=="], + "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@2.2.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-wOmQRUaOG0eWH/fnfslA9yK9xKfaq9X+3Xa1TdTJnTqlo0ARJYs6A+Lzjbs7cxdY/o1f12Xe00BG3nQozReUOg=="], - "@rspack/core": ["@rspack/core@2.0.2", "", { "dependencies": { "@rspack/binding": "2.0.2" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", "@swc/helpers": ">=0.5.1" }, "optionalPeers": ["@module-federation/runtime-tools", "@swc/helpers"] }, "sha512-VM3UHOo26uC+4QSqY5tU1ybI7KuXY5rTof8nhFOaBY9SYau0Smvr+hMSAPmrmHwknB6dXT8yaNVxrj7I+qxE1Q=="], + "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-v6/3bFr9+i7hRpgulL9b5qCvZL0VgR4vQGQNqOWezUzZmPUj9LYpvB0L9xZIVwDQ2ug/xBiA58bfg5IbESgoyw=="], + + "@rspack/cli": ["@rspack/cli@2.2.0", "", { "peerDependencies": { "@rspack/core": "^2.0.0-0", "@rspack/dev-server": "^2.0.0-0" }, "optionalPeers": ["@rspack/dev-server"], "bin": { "rspack": "./bin/rspack.js" } }, "sha512-GSiQPG5v5tN8vYJdUMYX44sPiwVVG8H25fq3LWRydVB4WswDAD/N3qNgWZtFVliQdLH3ZWzFdFUoCyZmea0TMA=="], + + "@rspack/core": ["@rspack/core@2.2.0", "", { "dependencies": { "@rspack/binding": "2.2.0" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", "@swc/helpers": "^0.5.23" }, "optionalPeers": ["@module-federation/runtime-tools", "@swc/helpers"] }, "sha512-3W7oX0BAHbK4VlknH3lfyfRvupzxdZtyEa+DfKmdjzmIAcqYtHnFd0nLqp5dzitDPyDI1TIKkDhpB0AZJn0pVg=="], "@sigstore/bundle": ["@sigstore/bundle@4.0.0", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A=="], @@ -656,21 +660,15 @@ "@sigstore/verify": ["@sigstore/verify@3.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag=="], - "@sindresorhus/is": ["@sindresorhus/is@0.14.0", "", {}, "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="], - "@sphinxxxx/color-conversion": ["@sphinxxxx/color-conversion@2.2.2", "", {}, "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw=="], "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@szmarczak/http-timer": ["@szmarczak/http-timer@1.1.2", "", { "dependencies": { "defer-to-connect": "^1.0.1" } }, "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA=="], - - "@tootallnate/once": ["@tootallnate/once@1.1.2", "", {}, "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="], - "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="], "@tufjs/models": ["@tufjs/models@4.1.0", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" } }, "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@types/ace": ["@types/ace@0.0.52", "", {}, "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ=="], @@ -778,19 +776,19 @@ "@upsetjs/venn.js": ["@upsetjs/venn.js@2.0.0", "", { "optionalDependencies": { "d3-selection": "^3.0.0", "d3-transition": "^3.0.1" } }, "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw=="], - "@vitest/expect": ["@vitest/expect@4.1.10", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA=="], + "@vitest/expect": ["@vitest/expect@4.1.11", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.11", "@vitest/utils": "4.1.11", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw=="], - "@vitest/mocker": ["@vitest/mocker@4.1.10", "", { "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow=="], + "@vitest/mocker": ["@vitest/mocker@4.1.11", "", { "dependencies": { "@vitest/spy": "4.1.11", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ=="], - "@vitest/pretty-format": ["@vitest/pretty-format@4.1.10", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q=="], + "@vitest/pretty-format": ["@vitest/pretty-format@4.1.11", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw=="], - "@vitest/runner": ["@vitest/runner@4.1.10", "", { "dependencies": { "@vitest/utils": "4.1.10", "pathe": "^2.0.3" } }, "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg=="], + "@vitest/runner": ["@vitest/runner@4.1.11", "", { "dependencies": { "@vitest/utils": "4.1.11", "pathe": "^2.0.3" } }, "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw=="], - "@vitest/snapshot": ["@vitest/snapshot@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "@vitest/utils": "4.1.10", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw=="], + "@vitest/snapshot": ["@vitest/snapshot@4.1.11", "", { "dependencies": { "@vitest/pretty-format": "4.1.11", "@vitest/utils": "4.1.11", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog=="], - "@vitest/spy": ["@vitest/spy@4.1.10", "", {}, "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw=="], + "@vitest/spy": ["@vitest/spy@4.1.11", "", {}, "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA=="], - "@vitest/utils": ["@vitest/utils@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA=="], + "@vitest/utils": ["@vitest/utils@4.1.11", "", { "dependencies": { "@vitest/pretty-format": "4.1.11", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ=="], "@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="], @@ -848,18 +846,12 @@ "abbrev": ["abbrev@4.0.0", "", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="], - "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - - "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - - "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], - "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], @@ -870,56 +862,26 @@ "ansi": ["ansi@0.3.1", "", {}, "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A=="], - "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], - "ansi-colors": ["ansi-colors@4.1.1", "", {}, "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="], - "ansi-escapes": ["ansi-escapes@3.2.0", "", {}, "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="], - "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], - - "archiver": ["archiver@3.1.1", "", { "dependencies": { "archiver-utils": "^2.1.0", "async": "^2.6.3", "buffer-crc32": "^0.2.1", "glob": "^7.1.4", "readable-stream": "^3.4.0", "tar-stream": "^2.1.0", "zip-stream": "^2.1.2" } }, "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg=="], - - "archiver-utils": ["archiver-utils@2.1.0", "", { "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" } }, "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw=="], - - "are-we-there-yet": ["are-we-there-yet@1.1.7", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g=="], - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "array-find-index": ["array-find-index@1.0.2", "", {}, "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw=="], - - "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], - "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], - "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], "assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], - "async": ["async@2.6.4", "", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="], - - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - - "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], - - "atomically": ["atomically@1.7.0", "", {}, "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w=="], - - "autoprefixer": ["autoprefixer@10.5.0", "", { "dependencies": { "browserslist": "^4.28.2", "caniuse-lite": "^1.0.30001787", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong=="], + "autoprefixer": ["autoprefixer@10.5.4", "", { "dependencies": { "browserslist": "^4.28.6", "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA=="], "autosize": ["autosize@6.0.1", "", {}, "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ=="], - "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], - - "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], - "babel-loader": ["babel-loader@10.1.1", "", { "dependencies": { "find-up": "^5.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0 || ^8.0.0-beta.1", "@rspack/core": "^1.0.0 || ^2.0.0-0", "webpack": ">=5.61.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg=="], "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@1.0.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^1.0.0", "core-js-compat": "^3.48.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0" } }, "sha512-yIkslVjbmml2Xjb6XhFW7lISXHsqk6cesxTdDsXoMom4Lnb99DbD3OQbSOoM5Z+ASh8YXYaLAsRQrU2Jeh3Qig=="], @@ -928,9 +890,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="], - - "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw=="], "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], @@ -940,12 +900,6 @@ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], - - "body-parser": ["body-parser@1.20.5", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA=="], - - "boxen": ["boxen@5.1.2", "", { "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" } }, "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ=="], - "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], @@ -954,42 +908,24 @@ "browser-stdout": ["browser-stdout@1.3.1", "", {}, "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="], - "browserslist": ["browserslist@4.28.2", "", { "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" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], - - "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - - "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], "buffer-image-size": ["buffer-image-size@0.6.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ=="], - "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], - - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "cacache": ["cacache@20.0.4", "", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0" } }, "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA=="], - "cacheable-request": ["cacheable-request@6.1.0", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^3.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^4.1.0", "responselike": "^1.0.2" } }, "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="], - - "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "chai": ["chai@4.3.6", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } }, "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], - "check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="], @@ -998,30 +934,16 @@ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], - "ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], - - "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], - "cli": ["cli@1.0.1", "", { "dependencies": { "exit": "0.1.2", "glob": "^7.1.1" } }, "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg=="], - "cli-boxes": ["cli-boxes@2.2.1", "", {}, "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="], - - "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], - - "cli-width": ["cli-width@2.2.1", "", {}, "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="], - "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], - "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], - "cmd-shim": ["cmd-shim@8.0.0", "", {}, "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="], - "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], - "codemirror": ["codemirror@6.0.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -1040,40 +962,20 @@ "com.foxdebug.acode.rk.plugin.plugincontext": ["com.foxdebug.acode.rk.plugin.plugincontext@file:src/plugins/pluginContext", {}], - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], "common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="], - "compress-commons": ["compress-commons@2.1.1", "", { "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^3.0.1", "normalize-path": "^3.0.0", "readable-stream": "^2.3.6" } }, "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q=="], - - "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], - - "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "conf": ["conf@10.2.0", "", { "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", "atomically": "^1.7.0", "debounce-fn": "^4.0.0", "dot-prop": "^6.0.1", "env-paths": "^2.2.1", "json-schema-typed": "^7.0.3", "onetime": "^5.1.2", "pkg-up": "^3.1.0", "semver": "^7.3.5" } }, "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg=="], - "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "configstore": ["configstore@5.0.1", "", { "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" } }, "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA=="], "console-browserify": ["console-browserify@1.1.0", "", { "dependencies": { "date-now": "^0.1.4" } }, "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg=="], - "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], - - "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], - - "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - - "cookie-signature": ["cookie-signature@1.0.7", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="], - "cordova": ["cordova@13.0.0", "", { "dependencies": { "configstore": "^5.0.1", "cordova-common": "^6.0.0", "cordova-create": "^6.0.0", "cordova-lib": "^13.0.0", "editor": "^1.0.0", "execa": "^5.1.1", "nopt": "^9.0.0", "semver": "^7.7.3", "systeminformation": "^5.27.11" }, "bin": { "cordova": "bin/cordova" } }, "sha512-QAIMwmYLL0jHo4vauWSnRd2fr9l+wajG+F5aUkrC6e4ZQGSTv0wAiRmpqQUkIc1ZdELisKDQws/BjHz5nP/sLw=="], "cordova-android": ["cordova-android@15.1.0", "", { "dependencies": { "android-versions": "^2.1.1", "cordova-common": "^6.0.0", "dedent": "^1.7.1", "execa": "^5.1.1", "fast-glob": "^3.3.3", "is-path-inside": "^3.0.3", "nopt": "^9.0.0", "properties-parser": "^0.6.0", "semver": "^7.7.4", "string-argv": "^0.3.2", "untildify": "^4.0.0", "which": "^6.0.1" } }, "sha512-mnOnOisYUVhyrLCPVlHJBKh4ro+X6nZA7nPqBrpVnyTpiiDiakNCfbBJjSs1MTBUJZ6dcmhhvNKZWPT9w6aGPA=="], @@ -1092,7 +994,7 @@ "cordova-plugin-acode-webview": ["cordova-plugin-acode-webview@file:src/plugins/webview", {}], - "cordova-plugin-advanced-http": ["cordova-plugin-advanced-http@file:src/plugins/cordova-plugin-advanced-http", { "devDependencies": { "chai": "4.3.6", "colors": "1.4.0", "cordova": "11.0.0", "mocha": "9.2.2", "umd-tough-cookie": "3.0.0", "wd": "1.14.0", "xml2js": "0.4.23" } }], + "cordova-plugin-advanced-http": ["cordova-plugin-advanced-http@file:src/plugins/cordova-plugin-advanced-http", { "devDependencies": { "chai": "4.3.6", "colors": "1.4.0", "cordova": "13.0.0", "mocha": "9.2.2", "umd-tough-cookie": "3.0.0", "xml2js": "0.4.23" } }], "cordova-plugin-browser": ["cordova-plugin-browser@file:src/plugins/browser", {}], @@ -1118,9 +1020,7 @@ "cordova-plugin-websocket": ["cordova-plugin-websocket@file:src/plugins/websocket", {}], - "cordova-serve": ["cordova-serve@4.0.1", "", { "dependencies": { "chalk": "^3.0.0", "compression": "^1.7.4", "express": "^4.17.1", "open": "^7.0.3", "which": "^2.0.2" } }, "sha512-YbfXaZ60yr5dkqmDFQgrU7TSKnzCqYsxHgIUzDeX8RggZb6mz1F9jMfUBbaYyaU7JjcuJ0aoRPYLvwSGQVhGkw=="], - - "core-js": ["core-js@3.49.0", "", {}, "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg=="], + "core-js": ["core-js@3.50.0", "", {}, "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw=="], "core-js-compat": ["core-js-compat@3.49.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA=="], @@ -1132,10 +1032,6 @@ "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], - "crc": ["crc@3.8.0", "", { "dependencies": { "buffer": "^5.1.0" } }, "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ=="], - - "crc32-stream": ["crc32-stream@3.0.1", "", { "dependencies": { "crc": "^3.4.4", "readable-stream": "^3.4.0" } }, "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w=="], - "crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -1146,9 +1042,7 @@ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - "currently-unhandled": ["currently-unhandled@0.4.1", "", { "dependencies": { "array-find-index": "^1.0.1" } }, "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng=="], - - "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="], + "cytoscape": ["cytoscape@3.34.2", "", {}, "sha512-Cm2jaj1X/PBNlzV9yH8zcfGOxO7U+CJ/+mxSBVPSchLaugdp4jtlGx5qaHtPRZ6tgiZ5P+o1XoRfJA+ba6KM3g=="], "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="], @@ -1220,40 +1114,20 @@ "dagre-d3-es": ["dagre-d3-es@7.0.14", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg=="], - "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], - "date-now": ["date-now@0.1.4", "", {}, "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw=="], - "dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="], - - "debounce-fn": ["debounce-fn@4.0.0", "", { "dependencies": { "mimic-fn": "^3.0.0" } }, "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ=="], + "dayjs": ["dayjs@1.11.23", "", {}, "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decamelize": ["decamelize@4.0.0", "", {}, "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="], - "decompress-response": ["decompress-response@3.3.0", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA=="], - "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], "deep-eql": ["deep-eql@3.0.1", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw=="], - "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], - - "defer-to-connect": ["defer-to-connect@1.1.3", "", {}, "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="], - "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - - "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], - - "dep-graph": ["dep-graph@1.1.0", "", { "dependencies": { "underscore": "1.2.1" } }, "sha512-/6yUWlSH0Uevjj6HWvO86rDeFzuYfzbaKDqifTEemwfwEPyBrODTb3ox/jFzqmc2+UmgJ3IDMS88BKEBh1Nm2Q=="], - - "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], - - "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], - "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], @@ -1270,23 +1144,15 @@ "domhandler": ["domhandler@2.3.0", "", { "dependencies": { "domelementtype": "1" } }, "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ=="], - "dompurify": ["dompurify@3.4.11", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw=="], + "dompurify": ["dompurify@3.4.14", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg=="], "domutils": ["domutils@1.5.1", "", { "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw=="], "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - - "duplexer3": ["duplexer3@0.1.5", "", {}, "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA=="], - - "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], - "editor": ["editor@1.0.0", "", {}, "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw=="], - "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.353", "", {}, "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="], + "electron-to-chromium": ["electron-to-chromium@1.5.415", "", {}, "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg=="], "elementtree": ["elementtree@0.1.7", "", { "dependencies": { "sax": "1.1.4" } }, "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg=="], @@ -1298,12 +1164,6 @@ "empathic": ["empathic@2.0.1", "", {}, "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q=="], - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - - "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], - - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - "endent": ["endent@2.1.0", "", { "dependencies": { "dedent": "^0.7.0", "fast-json-parse": "^1.0.3", "objectorarray": "^1.0.5" } }, "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w=="], "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="], @@ -1312,26 +1172,14 @@ "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], - "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], - "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], - - "es-toolkit": ["es-toolkit@1.46.1", "", {}, "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ=="], + "es-toolkit": ["es-toolkit@1.51.0", "", {}, "sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "escape-goat": ["escape-goat@2.1.1", "", {}, "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="], - - "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], @@ -1346,8 +1194,6 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], @@ -1358,12 +1204,6 @@ "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], - "express": ["express@4.22.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q=="], - - "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - - "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], - "extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -1380,33 +1220,17 @@ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA=="], - - "filesize": ["filesize@11.0.17", "", {}, "sha512-oHLTvMLw6imZUl1se/RBQrFlyy50nXce4sU7yGR6Qc0JgCwqnfiFsAnEwotdGmfKLD7SArGUk2/5STU0k8LOBQ=="], + "filesize": ["filesize@11.0.22", "", {}, "sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "finalhandler": ["finalhandler@1.3.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], - "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], - - "form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], - - "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], - "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], - "framer-motion": ["framer-motion@12.42.0", "", { "dependencies": { "motion-dom": "^12.42.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA=="], - - "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], - - "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], - - "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + "framer-motion": ["framer-motion@12.43.0", "", { "dependencies": { "motion-dom": "^12.43.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g=="], "fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], @@ -1416,58 +1240,34 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "gauge": ["gauge@2.7.4", "", { "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg=="], - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], "get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="], - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], - "glob": ["glob@7.2.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q=="], "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="], - "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - - "got": ["got@9.6.0", "", { "dependencies": { "@sindresorhus/is": "^0.14.0", "@szmarczak/http-timer": "^1.1.2", "cacheable-request": "^6.0.0", "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", "get-stream": "^4.1.0", "lowercase-keys": "^1.0.1", "mimic-response": "^1.0.1", "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" } }, "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q=="], - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "growl": ["growl@1.10.5", "", {}, "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="], "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], - "happy-dom": ["happy-dom@20.11.1", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-XSt8tMzbW9ymE7687xztkO1ckR7qJNQ3LywY9vlYGhGi3zXrGBHuUo2Cl1ztZaICW+1eAGdkLbj6iwVqDT33kg=="], - - "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], - - "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], + "happy-dom": ["happy-dom@20.11.6", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], - - "has-yarn": ["has-yarn@2.1.0", "", {}, "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], @@ -1480,24 +1280,16 @@ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], - "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - "http-proxy-agent": ["http-proxy-agent@4.0.1", "", { "dependencies": { "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } }, "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg=="], - - "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], - - "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], - "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="], - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "ignore-walk": ["ignore-walk@8.0.0", "", { "dependencies": { "minimatch": "^10.0.3" } }, "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A=="], @@ -1508,56 +1300,32 @@ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "import-lazy": ["import-lazy@2.1.0", "", {}, "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A=="], - "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], - - "infer-owner": ["infer-owner@1.0.4", "", {}, "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="], - "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], - - "init-package-json": ["init-package-json@2.0.5", "", { "dependencies": { "npm-package-arg": "^8.1.5", "promzard": "^0.3.0", "read": "~1.0.1", "read-package-json": "^4.1.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA=="], - - "inquirer": ["inquirer@6.5.2", "", { "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" } }, "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ=="], - - "insight": ["insight@0.11.1", "", { "dependencies": { "async": "^2.6.2", "chalk": "^4.1.1", "conf": "^10.0.1", "inquirer": "^6.3.1", "lodash.debounce": "^4.0.8", "os-name": "^4.0.1", "request": "^2.88.0", "tough-cookie": "^4.0.0", "uuid": "^8.3.2" } }, "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw=="], + "ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], "internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], - "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - "is-ci": ["is-ci@2.0.0", "", { "dependencies": { "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="], - - "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], - - "is-npm": ["is-npm@5.0.0", "", {}, "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="], - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], @@ -1572,18 +1340,12 @@ "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - - "is-yarn-global": ["is-yarn-global@0.3.0", "", {}, "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="], - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], "isobject": ["isobject@4.0.0", "", {}, "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA=="], - "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], - "java-parser": ["java-parser@3.0.1", "", { "dependencies": { "chevrotain": "11.0.3", "chevrotain-allstar": "0.3.1", "lodash": "4.17.21" } }, "sha512-sDIR7u9b7O2JViNUxiZRhnRz7URII/eE7g2B+BmGxDeS6Ex3OYAcCyz5oh0H4LQ+hL/BS8OJTz8apMy9xtGmrQ=="], "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], @@ -1594,54 +1356,34 @@ "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "jshint": ["jshint@2.13.6", "", { "dependencies": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", "lodash": "~4.17.21", "minimatch": "~3.0.2", "strip-json-comments": "1.0.x" }, "bin": { "jshint": "bin/jshint" } }, "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ=="], - "json-buffer": ["json-buffer@3.0.0", "", {}, "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "json-schema-typed": ["json-schema-typed@7.0.3", "", {}, "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A=="], - "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="], - "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], - "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], - "jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], - "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], - "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], - "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], "just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="], "just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="], - "katex": ["katex@0.16.45", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA=="], - - "keyv": ["keyv@3.1.0", "", { "dependencies": { "json-buffer": "3.0.0" } }, "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA=="], + "katex": ["katex@0.16.47", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg=="], "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], - "latest-version": ["latest-version@5.1.0", "", { "dependencies": { "package-json": "^6.3.0" } }, "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA=="], - "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], - "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], - "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], @@ -1670,7 +1412,7 @@ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "linkify-it": ["linkify-it@5.0.1", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg=="], + "linkify-it": ["linkify-it@5.0.2", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q=="], "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="], @@ -1684,39 +1426,23 @@ "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], - "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], - - "lodash.difference": ["lodash.difference@4.5.0", "", {}, "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA=="], - - "lodash.flatten": ["lodash.flatten@4.4.0", "", {}, "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="], - - "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], - - "lodash.union": ["lodash.union@4.6.0", "", {}, "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw=="], - "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], - "loud-rejection": ["loud-rejection@2.2.0", "", { "dependencies": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.2" } }, "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ=="], - "loupe": ["loupe@2.3.7", "", { "dependencies": { "get-func-name": "^2.0.1" } }, "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="], - "lowercase-keys": ["lowercase-keys@1.0.1", "", {}, "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="], - "lru-cache": ["lru-cache@11.3.6", "", {}, "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A=="], - "macos-release": ["macos-release@2.5.1", "", {}, "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A=="], - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], "make-fetch-happen": ["make-fetch-happen@15.0.5", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "ssri": "^13.0.0" } }, "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg=="], - "markdown-it": ["markdown-it@14.2.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.1", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ=="], + "markdown-it": ["markdown-it@14.3.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.5.0", "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw=="], - "markdown-it-anchor": ["markdown-it-anchor@9.2.0", "", { "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg=="], + "markdown-it-anchor": ["markdown-it-anchor@9.2.1", "", { "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, "sha512-p6APiLJDFAW2GEvaavDvhIBn7jrX2jLv77NkBGgNacFTurbORYc4pyYySg/mI6mpR6cHQuAtzKtmqgQr4K8dsQ=="], - "markdown-it-emoji": ["markdown-it-emoji@3.0.0", "", {}, "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg=="], + "markdown-it-emoji": ["markdown-it-emoji@3.1.0", "", {}, "sha512-NhmMEH2ywduD4Nty1E8uB5NqfLhAT1VR0dyvoJyStKOqCzbZmVdn/+8wj7zpDsb/fLBikpCPsWwxqKlvMmbz4g=="], "markdown-it-footnote": ["markdown-it-footnote@4.0.0", "", {}, "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ=="], @@ -1728,42 +1454,26 @@ "marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="], - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - - "md5-file": ["md5-file@5.0.0", "", { "bin": { "md5-file": "cli.js" } }, "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw=="], - "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="], - "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], - - "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], "mermaid": ["mermaid@11.15.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.2", "@mermaid-js/parser": "^1.1.1", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", "cytoscape": "^3.33.1", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", "dayjs": "^1.11.19", "dompurify": "^3.3.1", "es-toolkit": "^1.45.1", "katex": "^0.16.25", "khroma": "^2.1.0", "marked": "^16.3.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" } }, "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw=="], - "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], - "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], - "mini-css-extract-plugin": ["mini-css-extract-plugin@2.10.2", "", { "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg=="], "minimatch": ["minimatch@4.2.1", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g=="], - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="], @@ -1772,23 +1482,19 @@ "minipass-flush": ["minipass-flush@1.0.7", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA=="], - "minipass-json-stream": ["minipass-json-stream@1.0.2", "", { "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" } }, "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg=="], - "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], "minipass-sized": ["minipass-sized@2.0.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA=="], "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], - "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], - "mlly": ["mlly@1.8.1", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ=="], "mocha": ["mocha@9.2.2", "", { "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "4.2.1", "ms": "2.1.3", "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "mocha": "bin/mocha", "_mocha": "bin/_mocha" } }, "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g=="], - "motion": ["motion@12.42.0", "", { "dependencies": { "framer-motion": "^12.42.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA=="], + "motion": ["motion@12.43.0", "", { "dependencies": { "framer-motion": "^12.43.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ=="], - "motion-dom": ["motion-dom@12.42.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w=="], + "motion-dom": ["motion-dom@12.43.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag=="], "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], @@ -1796,11 +1502,9 @@ "mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="], - "mute-stream": ["mute-stream@0.0.7", "", {}, "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], - "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], @@ -1808,21 +1512,17 @@ "node-gyp": ["node-gyp@12.3.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg=="], - "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], + "node-releases": ["node-releases@2.0.53", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="], "nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="], - "normalize-package-data": ["normalize-package-data@3.0.3", "", { "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA=="], - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "normalize-url": ["normalize-url@4.5.1", "", {}, "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="], - "npm-bundled": ["npm-bundled@5.0.0", "", { "dependencies": { "npm-normalize-package-bin": "^5.0.0" } }, "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw=="], "npm-install-checks": ["npm-install-checks@8.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA=="], - "npm-normalize-package-bin": ["npm-normalize-package-bin@1.0.1", "", {}, "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="], + "npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], "npm-package-arg": ["npm-package-arg@13.0.2", "", { "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^7.0.0" } }, "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA=="], @@ -1834,48 +1534,20 @@ "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], - "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], - - "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], - - "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], - - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - "objectorarray": ["objectorarray@1.0.5", "", {}, "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg=="], "obug": ["obug@2.1.3", "", {}, "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], - - "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], - - "os-name": ["os-name@4.0.1", "", { "dependencies": { "macos-release": "^2.5.0", "windows-release": "^4.0.0" } }, "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw=="], - - "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], - - "p-cancelable": ["p-cancelable@1.1.0", "", {}, "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="], - - "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="], - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], - - "package-json": ["package-json@6.5.0", "", { "dependencies": { "got": "^9.6.0", "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" } }, "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ=="], - "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], "pacote": ["pacote@21.5.0", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ=="], @@ -1888,8 +1560,6 @@ "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], - "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], @@ -1906,33 +1576,25 @@ "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], - "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "pify": ["pify@5.0.0", "", {}, "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], - "pkg-up": ["pkg-up@3.1.0", "", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="], - "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "postcss": ["postcss@8.5.25", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw=="], "postcss-loader": ["postcss-loader@8.2.1", "", { "dependencies": { "cosmiconfig": "^9.0.0", "jiti": "^2.5.1", "semver": "^7.6.2" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow=="], @@ -1948,8 +1610,6 @@ "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - "prepend-http": ["prepend-http@2.0.0", "", {}, "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA=="], - "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], "prettier-plugin-java": ["prettier-plugin-java@2.8.1", "", { "dependencies": { "java-parser": "3.0.1" }, "peerDependencies": { "prettier": "^3.0.0" } }, "sha512-tkteH5OSCEb0E7wKnhhUSitr1pGUCUt9M//CwerSNhoalL/qv0jXTeSVBPZ36KC+kZl3nbq4dxh144NuGchACg=="], @@ -1964,54 +1624,22 @@ "promise-call-limit": ["promise-call-limit@3.0.2", "", {}, "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw=="], - "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], - - "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], - - "promzard": ["promzard@0.3.0", "", { "dependencies": { "read": "1" } }, "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw=="], - "properties-parser": ["properties-parser@0.6.0", "", {}, "sha512-qvr2cSmoA0dln0MARAKwBzPkkXn7FqwX+RVVNpMdMJc7rt9mqO2cXwluxtux9fHrLhjnPFaQkS8BM0kFrTCnSw=="], - "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - - "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], - - "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], - "pupa": ["pupa@2.1.1", "", { "dependencies": { "escape-goat": "^2.0.0" } }, "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A=="], - - "q": ["q@1.5.1", "", {}, "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="], - - "qs": ["qs@6.5.5", "", {}, "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ=="], - "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], - - "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], - "raw-loader": ["raw-loader@4.0.2", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA=="], - "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], - - "read": ["read@1.0.7", "", { "dependencies": { "mute-stream": "~0.0.4" } }, "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ=="], - - "read-chunk": ["read-chunk@3.2.0", "", { "dependencies": { "pify": "^4.0.1", "with-open-file": "^0.1.6" } }, "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ=="], - "read-cmd-shim": ["read-cmd-shim@6.0.0", "", {}, "sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A=="], - "read-package-json": ["read-package-json@4.1.2", "", { "dependencies": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", "normalize-package-data": "^3.0.0", "npm-normalize-package-bin": "^1.0.0" } }, "sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ=="], - - "read-package-json-fast": ["read-package-json-fast@2.0.3", "", { "dependencies": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" } }, "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ=="], - "readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], @@ -2022,16 +1650,10 @@ "regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="], - "registry-auth-token": ["registry-auth-token@4.2.2", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg=="], - - "registry-url": ["registry-url@5.1.0", "", { "dependencies": { "rc": "^1.2.8" } }, "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw=="], - "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], - "request": ["request@2.88.0", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -2042,35 +1664,23 @@ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "responselike": ["responselike@1.0.2", "", { "dependencies": { "lowercase-keys": "^1.0.0" } }, "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ=="], - - "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], - - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], "rolldown": ["rolldown@1.2.1", "", { "dependencies": { "@oxc-project/types": "=0.142.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.2.1", "@rolldown/binding-darwin-arm64": "1.2.1", "@rolldown/binding-darwin-x64": "1.2.1", "@rolldown/binding-freebsd-x64": "1.2.1", "@rolldown/binding-linux-arm-gnueabihf": "1.2.1", "@rolldown/binding-linux-arm64-gnu": "1.2.1", "@rolldown/binding-linux-arm64-musl": "1.2.1", "@rolldown/binding-linux-ppc64-gnu": "1.2.1", "@rolldown/binding-linux-s390x-gnu": "1.2.1", "@rolldown/binding-linux-x64-gnu": "1.2.1", "@rolldown/binding-linux-x64-musl": "1.2.1", "@rolldown/binding-openharmony-arm64": "1.2.1", "@rolldown/binding-wasm32-wasi": "1.2.1", "@rolldown/binding-win32-arm64-msvc": "1.2.1", "@rolldown/binding-win32-x64-msvc": "1.2.1" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw=="], "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], - "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], - "rxjs": ["rxjs@6.6.7", "", { "dependencies": { "tslib": "^1.9.0" } }, "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="], - "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "sass": ["sass@1.99.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q=="], + "sass": ["sass@1.103.1", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw=="], "sass-loader": ["sass-loader@16.0.8", "", { "dependencies": { "neo-async": "^2.6.2" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "node-sass", "sass", "sass-embedded", "webpack"] }, "sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA=="], @@ -2080,32 +1690,14 @@ "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "semver-diff": ["semver-diff@3.1.1", "", { "dependencies": { "semver": "^6.3.0" } }, "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg=="], - - "send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], - "serialize-javascript": ["serialize-javascript@6.0.0", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag=="], - "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], - - "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], - "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], - - "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], @@ -2118,7 +1710,7 @@ "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], - "socks-proxy-agent": ["socks-proxy-agent@6.2.1", "", { "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" } }, "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ=="], + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], @@ -2126,29 +1718,23 @@ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], - "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], - "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], "sprintf": ["sprintf@0.1.5", "", {}, "sha512-4X5KsuXFQ7f+d7Y+bi4qSb6eI+YoifDTGr0MQJXRoYO7BO7evfRCjds6kk3z7l5CiJYxgDN1x5Er4WiyCt+zTQ=="], - "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], - "ssri": ["ssri@13.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ=="], "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - "std-env": ["std-env@4.2.0", "", {}, "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw=="], "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], - "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -2156,8 +1742,6 @@ "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], @@ -2178,54 +1762,36 @@ "tar": ["tar@7.5.22", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA=="], - "tar-stream": ["tar-stream@2.2.0", "", { "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" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - "terminal": ["terminal@0.1.4", "", { "dependencies": { "sprintf": ">= 0.1.1" } }, "sha512-w6OAFpUO+TimZUdQ46dK3fYYOCCBIsS2QUfIEkzX21oJ8tvJOJvJkcmrbleLH5KG02SNohYFDj81bL3VPaULsQ=="], "terser": ["terser@5.44.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw=="], "terser-webpack-plugin": ["terser-webpack-plugin@5.3.16", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q=="], - "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], "tinyexec": ["tinyexec@1.0.4", "", {}, "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw=="], - "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "tinyrainbow": ["tinyrainbow@3.1.1", "", {}, "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw=="], "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="], - "to-readable-stream": ["to-readable-stream@1.0.0", "", {}, "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="], - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - - "tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], - "treeverse": ["treeverse@3.0.0", "", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="], "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], - "ts-loader": ["ts-loader@9.5.7", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4", "source-map": "^0.7.4" }, "peerDependencies": { "typescript": "*", "webpack": "^5.0.0" } }, "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg=="], + "ts-loader": ["ts-loader@9.6.2", "", { "dependencies": { "chalk": "^4.1.0", "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "peerDependencies": { "loader-utils": "*", "typescript": "*", "webpack": "^4.0.0 || ^5.0.0" }, "optionalPeers": ["loader-utils"] }, "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tuf-js": ["tuf-js@4.1.0", "", { "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", "make-fetch-happen": "^15.0.1" } }, "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ=="], - "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - - "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], - "type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="], - "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - - "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], - "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], @@ -2236,8 +1802,6 @@ "umd-tough-cookie": ["umd-tough-cookie@3.0.0", "", {}, "sha512-LgVV1jgzEPgC/zOj6T9OIDBTj7YCGEJkgoxV2gHYv1Crlst1X95lRIF48hFleGgv4v01Z86LxyyLyvl++M2Srg=="], - "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="], - "undici": ["undici@6.25.0", "", {}, "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], @@ -2250,51 +1814,29 @@ "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], - "unique-filename": ["unique-filename@1.1.1", "", { "dependencies": { "unique-slug": "^2.0.0" } }, "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="], - - "unique-slug": ["unique-slug@2.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="], - "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], - "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "untildify": ["untildify@4.0.0", "", {}, "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="], - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - - "update-notifier": ["update-notifier@5.1.0", "", { "dependencies": { "boxen": "^5.0.0", "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", "is-installed-globally": "^0.4.0", "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.1.0", "pupa": "^2.1.1", "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" } }, "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw=="], + "update-browserslist-db": ["update-browserslist-db@1.3.1", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], - "url-parse-lax": ["url-parse-lax@3.0.0", "", { "dependencies": { "prepend-http": "^2.0.0" } }, "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ=="], - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], "valid-identifier": ["valid-identifier@0.0.2", "", {}, "sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g=="], - "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], - "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], "vanilla-picker": ["vanilla-picker@2.12.3", "", { "dependencies": { "@sphinxxxx/color-conversion": "^2.2.2" } }, "sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ=="], - "vargs": ["vargs@0.1.0", "", {}, "sha512-d/j1kMUt0YjLCQPAI+VMZ7IKwNGjk8dSHMCrHq9txFOCcCIDoe8ck9FmPvABJgxIaZO1tabXmNojQG6mBkLLCw=="], - - "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - - "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], - "vite": ["vite@8.2.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.23", "rolldown": "~1.2.0", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ=="], - "vitest": ["vitest@4.1.10", "", { "dependencies": { "@vitest/expect": "4.1.10", "@vitest/mocker": "4.1.10", "@vitest/pretty-format": "4.1.10", "@vitest/runner": "4.1.10", "@vitest/snapshot": "4.1.10", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.10", "@vitest/browser-preview": "4.1.10", "@vitest/browser-webdriverio": "4.1.10", "@vitest/coverage-istanbul": "4.1.10", "@vitest/coverage-v8": "4.1.10", "@vitest/ui": "4.1.10", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw=="], + "vitest": ["vitest@4.1.11", "", { "dependencies": { "@vitest/expect": "4.1.11", "@vitest/mocker": "4.1.11", "@vitest/pretty-format": "4.1.11", "@vitest/runner": "4.1.11", "@vitest/snapshot": "4.1.11", "@vitest/spy": "4.1.11", "@vitest/utils": "4.1.11", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.11", "@vitest/browser-preview": "4.1.11", "@vitest/browser-webdriverio": "4.1.11", "@vitest/coverage-istanbul": "4.1.11", "@vitest/coverage-v8": "4.1.11", "@vitest/ui": "4.1.11", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw=="], "vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="], @@ -2318,8 +1860,6 @@ "watchpack": ["watchpack@2.5.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg=="], - "wd": ["wd@1.14.0", "", { "dependencies": { "archiver": "^3.0.0", "async": "^2.0.0", "lodash": "^4.0.0", "mkdirp": "^0.5.1", "q": "^1.5.1", "request": "2.88.0", "vargs": "^0.1.0" }, "bin": { "wd": "lib/bin.js" } }, "sha512-X7ZfGHHYlQ5zYpRlgP16LUsvYti+Al/6fz3T/ClVyivVCpCZQpESTDdz6zbK910O5OIvujO23Ym2DBBo3XsQlA=="], - "webpack": ["webpack@5.105.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.19.0", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.5.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw=="], "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], @@ -2330,14 +1870,6 @@ "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], - - "widest-line": ["widest-line@3.1.0", "", { "dependencies": { "string-width": "^4.0.0" } }, "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="], - - "windows-release": ["windows-release@4.0.0", "", { "dependencies": { "execa": "^4.0.2" } }, "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg=="], - - "with-open-file": ["with-open-file@0.1.7", "", { "dependencies": { "p-finally": "^1.0.0", "p-try": "^2.1.0", "pify": "^4.0.1" } }, "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA=="], - "workerpool": ["workerpool@6.2.0", "", {}, "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A=="], "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], @@ -2346,7 +1878,7 @@ "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], - "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + "ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], "xdg-basedir": ["xdg-basedir@4.0.0", "", {}, "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="], @@ -2358,7 +1890,7 @@ "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], - "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], + "yargs": ["yargs@18.1.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg=="], "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], @@ -2366,15 +1898,15 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zip-stream": ["zip-stream@2.1.3", "", { "dependencies": { "archiver-utils": "^2.1.0", "compress-commons": "^2.1.1", "readable-stream": "^3.4.0" } }, "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q=="], - "@babel/core/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], "@babel/core/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], "@babel/core/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], - "@babel/generator/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@babel/generator/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/helper-compilation-targets/browserslist": ["browserslist@4.28.2", "", { "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" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "@babel/helper-create-class-features-plugin/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], @@ -2392,7 +1924,7 @@ "@babel/helper-wrap-function/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], - "@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@babel/parser/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@babel/plugin-transform-async-generator-functions/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], @@ -2402,11 +1934,11 @@ "@babel/template/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], - "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], - "@babel/traverse/@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + "@babel/traverse/@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], - "@babel/traverse/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@babel/traverse/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@chevrotain/cst-dts-gen/@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], @@ -2416,46 +1948,46 @@ "@chevrotain/gast/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "@codemirror/lang-angular/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + "@codemirror/lang-angular/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], - "@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + "@codemirror/lang-jinja/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + + "@codemirror/lang-liquid/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + + "@codemirror/lang-markdown/@lezer/common": ["@lezer/common@1.5.2", "", {}, "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ=="], + + "@codemirror/lang-php/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + + "@codemirror/lang-vue/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], "@codemirror/lang-vue/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + "@codemirror/language-data/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + "@codemirror/language-data/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], "@codemirror/language-data/@codemirror/lang-jinja": ["@codemirror/lang-jinja@6.0.0", "", { "dependencies": { "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.4.0" } }, "sha512-47MFmRcR8UAxd8DReVgj7WJN1WSAMT7OJnewwugZM4XiHWkOjgJQqvEM1NpMj9ALMPyxmlziEI1opH9IaEvmaw=="], "@codemirror/language-data/@codemirror/lang-liquid": ["@codemirror/lang-liquid@6.3.1", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.3.1" } }, "sha512-S/jE/D7iij2Pu70AC65ME6AYWxOOcX20cSJvaPgY5w7m2sfxsArAcUAuUgm/CZCVmqoi9KiOlS7gj/gyLipABw=="], - "@codemirror/language-data/@codemirror/lang-yaml": ["@codemirror/lang-yaml@6.1.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.0.0", "@lezer/yaml": "^1.0.0" } }, "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw=="], - - "@npmcli/agent/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + "@codemirror/language-data/@codemirror/lang-markdown": ["@codemirror/lang-markdown@6.5.0", "", { "dependencies": { "@codemirror/autocomplete": "^6.7.1", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.3.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.2.1", "@lezer/markdown": "^1.0.0" } }, "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw=="], - "@npmcli/agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "@npmcli/agent/socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + "@codemirror/language-data/@codemirror/lang-yaml": ["@codemirror/lang-yaml@6.1.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.0.0", "@lezer/yaml": "^1.0.0" } }, "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw=="], "@npmcli/arborist/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], - "@npmcli/git/ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], - - "@npmcli/installed-package-contents/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - "@npmcli/map-workspaces/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "@npmcli/map-workspaces/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@npmcli/metavuln-calculator/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="], - "@npmcli/move-file/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - "@npmcli/package-json/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "@npmcli/package-json/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="], - "@npmcli/package-json/spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], - "@rolldown/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@2.0.0-alpha.3", "", { "dependencies": { "@emnapi/wasi-threads": "2.0.1", "tslib": "^2.4.0" } }, "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g=="], "@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@2.0.0-alpha.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA=="], @@ -2468,76 +2000,34 @@ "@vitest/expect/chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - "accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - - "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "archiver/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "archiver/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "archiver-utils/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "bin-links/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - "bin-links/write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="], - "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - - "body-parser/qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], - - "boxen/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "boxen/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "cacache/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], - - "cacheable-request/lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], - "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "chevrotain/@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], "chevrotain/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], - "chevrotain-allstar/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], - "cli/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "compression/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "conf/dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], - - "content-disposition/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "cordova-fetch/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], "cordova-lib/write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="], - "cordova-plugin-advanced-http/cordova": ["cordova@11.0.0", "", { "dependencies": { "configstore": "^5.0.1", "cordova-common": "^4.0.2", "cordova-create": "^4.0.0", "cordova-lib": "^11.0.0", "editor": "^1.0.0", "execa": "^5.1.1", "fs-extra": "^10.0.0", "insight": "^0.11.1", "loud-rejection": "^2.2.0", "nopt": "^5.0.0", "semver": "^7.3.5", "systeminformation": "^5.9.17", "update-notifier": "^5.1.0" }, "bin": { "cordova": "bin/cordova" } }, "sha512-Hu2YeT0naeP/1sEm/xfJYUsXN48XV6zagxbi1+4q0Ei9c5TKsIq8v4EWukvSHF4UO2pnh+9ViaDlGMcS1Wrnfg=="], - - "cordova-serve/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], - - "cordova-serve/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "core-js-compat/browserslist": ["browserslist@4.28.2", "", { "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" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "cosmiconfig/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - "crc32-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "css-loader/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], @@ -2546,10 +2036,6 @@ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], - "debounce-fn/mimic-fn": ["mimic-fn@3.1.0", "", {}, "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ=="], - - "dep-graph/underscore": ["underscore@1.2.1", "", {}, "sha512-HRhh6FYh5I5/zTt7L9MnHRA/nlSFPiwymMCXEremmzT7tHR+8CNP0FXHPaUpafAPwvAlNrvZiH91kQwoo/CqUA=="], - "dom-serializer/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], "dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], @@ -2558,70 +2044,24 @@ "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "express/qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], - - "express/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "external-editor/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - - "external-editor/tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], - - "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "gauge/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], - - "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], - "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "got/get-stream": ["get-stream@4.1.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="], - - "har-validator/ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - "htmlparser2/entities": ["entities@1.0.0", "", {}, "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ=="], "htmlparser2/readable-stream": ["readable-stream@1.1.14", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ=="], - "http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - - "https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - "ignore-walk/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], - "init-package-json/npm-package-arg": ["npm-package-arg@8.1.5", "", { "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q=="], - - "init-package-json/validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], - - "inquirer/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "inquirer/string-width": ["string-width@2.1.1", "", { "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="], - - "inquirer/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], - - "insight/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - "jshint/minimatch": ["minimatch@3.0.8", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q=="], "jshint/strip-json-comments": ["strip-json-comments@1.0.4", "", { "bin": { "strip-json-comments": "cli.js" } }, "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg=="], - "jsprim/extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], - "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "make-fetch-happen/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "mermaid/dompurify": ["dompurify@3.4.2", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA=="], - "mermaid/marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -2630,10 +2070,10 @@ "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "minipass-json-stream/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "mlly/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "mocha/chokidar": ["chokidar@3.5.3", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="], "mocha/debug": ["debug@4.3.3", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="], @@ -2648,99 +2088,55 @@ "mocha/yargs-parser": ["yargs-parser@20.2.4", "", {}, "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="], - "normalize-package-data/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "npm-bundled/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - - "npm-pick-manifest/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - - "package-json/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "node-gyp/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], "parse-conflict-json/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="], "parse-json/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "pkg-up/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "raw-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], - "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - - "read-chunk/pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], - - "read-package-json/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "request/tough-cookie": ["tough-cookie@2.4.3", "", { "dependencies": { "psl": "^1.1.24", "punycode": "^1.4.1" } }, "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ=="], - - "request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "restore-cursor/onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], - - "rimraf/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "rxjs/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - - "semver-diff/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "socks-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + "sass/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], - - "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "terser/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], "terser-webpack-plugin/serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], - "tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], - - "type-is/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + "tinyglobby/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], "vite/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], - "vite/postcss": ["postcss@8.5.25", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw=="], - - "vite/tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], - "webpack/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "webpack/browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], "webpack/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "wide-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "widest-line/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "windows-release/execa": ["execa@4.1.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA=="], + "@babel/core/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], - "with-open-file/pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], + "@babel/generator/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "@babel/generator/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "zip-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="], - "@babel/core/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], + "@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="], + + "@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.353", "", {}, "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="], - "@babel/generator/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], - "@babel/generator/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/helper-compilation-targets/browserslist/update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], @@ -2790,9 +2186,9 @@ "@babel/helper-wrap-function/@babel/traverse/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], - "@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], - "@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], "@babel/plugin-transform-async-generator-functions/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], @@ -2804,13 +2200,19 @@ "@babel/plugin-transform-classes/@babel/traverse/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], - "@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], "@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@codemirror/lang-jinja/@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], - "@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@codemirror/lang-liquid/@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + + "@codemirror/lang-php/@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], "@npmcli/arborist/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], @@ -2820,94 +2222,46 @@ "@rolldown/binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@2.0.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ=="], - "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], - "@tufjs/models/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "archiver-utils/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "archiver/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "bin-links/write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "boxen/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "boxen/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "boxen/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "cacache/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "cli/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "cliui/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], "cordova-fetch/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], "cordova-lib/write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "cordova-plugin-advanced-http/cordova/cordova-common": ["cordova-common@4.1.0", "", { "dependencies": { "@netflix/nerror": "^1.1.3", "ansi": "^0.3.1", "bplist-parser": "^0.2.0", "cross-spawn": "^7.0.1", "elementtree": "^0.1.7", "endent": "^1.4.1", "fast-glob": "^3.2.2", "fs-extra": "^9.0.0", "glob": "^7.1.6", "plist": "^3.0.1", "q": "^1.5.1", "read-chunk": "^3.2.0", "strip-bom": "^4.0.0", "underscore": "^1.9.2" } }, "sha512-sYfOSfpYGQOmUDlsARUbpT/EvVKT/E+GI3zwTXt+C6DjZ7xs6ZQVHs3umHKSidjf9yVM2LLmvGFpGrGX7aGxug=="], - - "cordova-plugin-advanced-http/cordova/cordova-create": ["cordova-create@4.1.0", "", { "dependencies": { "cordova-app-hello-world": "^6.0.0", "cordova-common": "^4.1.0", "cordova-fetch": "^3.1.0", "fs-extra": "^10.1.0", "globby": "^11.1.0", "import-fresh": "^3.3.0", "isobject": "^4.0.0", "npm-package-arg": "^8.1.5", "path-is-inside": "^1.0.2", "tmp": "^0.2.1", "valid-identifier": "0.0.2" } }, "sha512-8VQohB5w5WwuxurQJ+2L+lAFVhBr//kFvlxLOmF0P3SzTdfIU02pNalbOeLalC0DXD7rfBXJZOxJ+KSM5TOq+Q=="], + "core-js-compat/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="], - "cordova-plugin-advanced-http/cordova/cordova-lib": ["cordova-lib@11.1.0", "", { "dependencies": { "cordova-common": "^4.1.0", "cordova-fetch": "^3.1.0", "cordova-serve": "^4.0.0", "dep-graph": "^1.1.0", "detect-indent": "^6.1.0", "detect-newline": "^3.1.0", "elementtree": "^0.1.7", "execa": "^5.1.1", "fs-extra": "^10.1.0", "globby": "^11.1.0", "init-package-json": "^2.0.5", "md5-file": "^5.0.0", "pify": "^5.0.0", "semver": "^7.3.8", "stringify-package": "^1.0.1", "write-file-atomic": "^3.0.3" } }, "sha512-/XM+/wFag72bD4SNSxwX8b3OWatHNNlnmJpgb5pepp2Pobb957nWyR0GPwIkKyOyszdZesWM3Vv8uH9e2Z1k2w=="], + "core-js-compat/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="], - "cordova-plugin-advanced-http/cordova/nopt": ["nopt@5.0.0", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="], + "core-js-compat/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.353", "", {}, "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="], - "cordova-serve/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "core-js-compat/browserslist/node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], - "cordova-serve/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "core-js-compat/browserslist/update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "css-loader/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], - "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], - - "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], - - "har-validator/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "htmlparser2/readable-stream/isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], "htmlparser2/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], "ignore-walk/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "init-package-json/npm-package-arg/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "inquirer/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "inquirer/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "inquirer/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - - "inquirer/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@2.0.0", "", {}, "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="], - - "inquirer/string-width/strip-ansi": ["strip-ansi@4.0.0", "", { "dependencies": { "ansi-regex": "^3.0.0" } }, "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="], - - "inquirer/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], - "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "minipass-json-stream/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], "mocha/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], @@ -2920,33 +2274,17 @@ "mocha/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "node-gyp/tinyglobby/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], "parse-json/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], "parse-json/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - "raw-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "raw-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], - "read-package-json/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "request/tough-cookie/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], - - "restore-cursor/onetime/mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], - - "rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "vite/postcss/nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], + "sass/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "webpack/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], @@ -2956,19 +2294,11 @@ "webpack/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], - "webpack/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "wide-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "wide-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "widest-line/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "widest-line/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "webpack/browserslist/update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - "windows-release/execa/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + "webpack/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "windows-release/execa/human-signals": ["human-signals@1.1.1", "", {}, "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="], + "wrap-ansi/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], "@npmcli/arborist/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], @@ -2978,42 +2308,10 @@ "@tufjs/models/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cacache/glob/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "cordova-plugin-advanced-http/cordova/cordova-common/bplist-parser": ["bplist-parser@0.2.0", "", { "dependencies": { "big-integer": "^1.6.44" } }, "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/endent": ["endent@1.4.1", "", { "dependencies": { "dedent": "^0.7.0", "fast-json-parse": "^1.0.3", "objectorarray": "^1.0.4" } }, "sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-app-hello-world": ["cordova-app-hello-world@6.0.0", "", {}, "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch": ["cordova-fetch@3.1.0", "", { "dependencies": { "cordova-common": "^4.1.0", "fs-extra": "^9.1.0", "npm-package-arg": "^8.1.5", "pacote": "^11.3.5", "pify": "^5.0.0", "resolve": "^1.22.1", "semver": "^7.3.8", "which": "^2.0.2" } }, "sha512-qOT3HlNzVWbsCZVvbkZ6PdvAG1byiK8vWG+/Z+7s+8ZB76rOYKdzMvrmmMwrTTX6nglDnz5uJ/4XjQHJB770GQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg": ["npm-package-arg@8.1.5", "", { "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch": ["cordova-fetch@3.1.0", "", { "dependencies": { "cordova-common": "^4.1.0", "fs-extra": "^9.1.0", "npm-package-arg": "^8.1.5", "pacote": "^11.3.5", "pify": "^5.0.0", "resolve": "^1.22.1", "semver": "^7.3.8", "which": "^2.0.2" } }, "sha512-qOT3HlNzVWbsCZVvbkZ6PdvAG1byiK8vWG+/Z+7s+8ZB76rOYKdzMvrmmMwrTTX6nglDnz5uJ/4XjQHJB770GQ=="], - - "cordova-plugin-advanced-http/cordova/nopt/abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], - "ignore-walk/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "init-package-json/npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "inquirer/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "inquirer/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - - "inquirer/string-width/strip-ansi/ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="], - "mocha/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "mocha/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -3024,256 +2322,14 @@ "mocha/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "normalize-package-data/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], - - "pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], - "raw-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "wide-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "@npmcli/package-json/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "cacache/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "cordova-plugin-advanced-http/cordova/cordova-common/endent/dedent": ["dedent@0.7.0", "", {}, "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote": ["pacote@11.3.5", "", { "dependencies": { "@npmcli/git": "^2.1.0", "@npmcli/installed-package-contents": "^1.0.6", "@npmcli/promise-spawn": "^1.2.0", "@npmcli/run-script": "^1.8.2", "cacache": "^15.0.5", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", "minipass": "^3.1.3", "mkdirp": "^1.0.3", "npm-package-arg": "^8.0.1", "npm-packlist": "^2.1.4", "npm-pick-manifest": "^6.0.0", "npm-registry-fetch": "^11.0.0", "promise-retry": "^2.0.1", "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", "tar": "^6.1.0" }, "bin": { "pacote": "lib/bin.js" } }, "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg": ["npm-package-arg@8.1.5", "", { "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote": ["pacote@11.3.5", "", { "dependencies": { "@npmcli/git": "^2.1.0", "@npmcli/installed-package-contents": "^1.0.6", "@npmcli/promise-spawn": "^1.2.0", "@npmcli/run-script": "^1.8.2", "cacache": "^15.0.5", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", "minipass": "^3.1.3", "mkdirp": "^1.0.3", "npm-package-arg": "^8.0.1", "npm-packlist": "^2.1.4", "npm-pick-manifest": "^6.0.0", "npm-registry-fetch": "^11.0.0", "promise-retry": "^2.0.1", "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", "tar": "^6.1.0" }, "bin": { "pacote": "lib/bin.js" } }, "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "init-package-json/npm-package-arg/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "inquirer/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - "mocha/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "mocha/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/git": ["@npmcli/git@2.1.0", "", { "dependencies": { "@npmcli/promise-spawn": "^1.3.2", "lru-cache": "^6.0.0", "mkdirp": "^1.0.4", "npm-pick-manifest": "^6.1.1", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^2.0.2" } }, "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@1.0.7", "", { "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "installed-package-contents": "index.js" } }, "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/promise-spawn": ["@npmcli/promise-spawn@1.3.2", "", { "dependencies": { "infer-owner": "^1.0.4" } }, "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script": ["@npmcli/run-script@1.8.6", "", { "dependencies": { "@npmcli/node-gyp": "^1.0.2", "@npmcli/promise-spawn": "^1.3.2", "node-gyp": "^7.1.0", "read-package-json-fast": "^2.0.1" } }, "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache": ["cacache@15.3.0", "", { "dependencies": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", "infer-owner": "^1.0.4", "lru-cache": "^6.0.0", "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" } }, "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist": ["npm-packlist@2.2.2", "", { "dependencies": { "glob": "^7.1.6", "ignore-walk": "^3.0.3", "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "npm-packlist": "bin/index.js" } }, "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-pick-manifest": ["npm-pick-manifest@6.1.1", "", { "dependencies": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", "npm-package-arg": "^8.1.2", "semver": "^7.3.4" } }, "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch": ["npm-registry-fetch@11.0.0", "", { "dependencies": { "make-fetch-happen": "^9.0.1", "minipass": "^3.1.3", "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.0.0", "npm-package-arg": "^8.0.0" } }, "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/ssri": ["ssri@8.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/git": ["@npmcli/git@2.1.0", "", { "dependencies": { "@npmcli/promise-spawn": "^1.3.2", "lru-cache": "^6.0.0", "mkdirp": "^1.0.4", "npm-pick-manifest": "^6.1.1", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^2.0.2" } }, "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@1.0.7", "", { "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "installed-package-contents": "index.js" } }, "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/promise-spawn": ["@npmcli/promise-spawn@1.3.2", "", { "dependencies": { "infer-owner": "^1.0.4" } }, "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script": ["@npmcli/run-script@1.8.6", "", { "dependencies": { "@npmcli/node-gyp": "^1.0.2", "@npmcli/promise-spawn": "^1.3.2", "node-gyp": "^7.1.0", "read-package-json-fast": "^2.0.1" } }, "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache": ["cacache@15.3.0", "", { "dependencies": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", "infer-owner": "^1.0.4", "lru-cache": "^6.0.0", "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" } }, "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist": ["npm-packlist@2.2.2", "", { "dependencies": { "glob": "^7.1.6", "ignore-walk": "^3.0.3", "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "npm-packlist": "bin/index.js" } }, "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-pick-manifest": ["npm-pick-manifest@6.1.1", "", { "dependencies": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", "npm-package-arg": "^8.1.2", "semver": "^7.3.4" } }, "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch": ["npm-registry-fetch@11.0.0", "", { "dependencies": { "make-fetch-happen": "^9.0.1", "minipass": "^3.1.3", "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.0.0", "npm-package-arg": "^8.0.0" } }, "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/ssri": ["ssri@8.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/git/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/installed-package-contents/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/@npmcli/node-gyp": ["@npmcli/node-gyp@1.0.3", "", {}, "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp": ["node-gyp@7.1.2", "", { "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.3", "nopt": "^5.0.0", "npmlog": "^4.1.2", "request": "^2.88.2", "rimraf": "^3.0.2", "semver": "^7.3.2", "tar": "^6.0.2", "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/@npmcli/fs": ["@npmcli/fs@1.1.1", "", { "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" } }, "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/ignore-walk": ["ignore-walk@3.0.4", "", { "dependencies": { "minimatch": "^3.0.4" } }, "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-pick-manifest/npm-install-checks": ["npm-install-checks@4.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen": ["make-fetch-happen@9.1.0", "", { "dependencies": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^6.0.0", "minipass": "^3.1.3", "minipass-collect": "^1.0.2", "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.2", "promise-retry": "^2.0.1", "socks-proxy-agent": "^6.0.0", "ssri": "^8.0.0" } }, "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch": ["minipass-fetch@1.4.1", "", { "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", "minizlib": "^2.0.0" }, "optionalDependencies": { "encoding": "^0.1.12" } }, "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/git/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/installed-package-contents/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/@npmcli/node-gyp": ["@npmcli/node-gyp@1.0.3", "", {}, "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp": ["node-gyp@7.1.2", "", { "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.3", "nopt": "^5.0.0", "npmlog": "^4.1.2", "request": "^2.88.2", "rimraf": "^3.0.2", "semver": "^7.3.2", "tar": "^6.0.2", "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/@npmcli/fs": ["@npmcli/fs@1.1.1", "", { "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" } }, "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/ignore-walk": ["ignore-walk@3.0.4", "", { "dependencies": { "minimatch": "^3.0.4" } }, "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-pick-manifest/npm-install-checks": ["npm-install-checks@4.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen": ["make-fetch-happen@9.1.0", "", { "dependencies": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^6.0.0", "minipass": "^3.1.3", "minipass-collect": "^1.0.2", "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.2", "promise-retry": "^2.0.1", "socks-proxy-agent": "^6.0.0", "ssri": "^8.0.0" } }, "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch": ["minipass-fetch@1.4.1", "", { "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", "minizlib": "^2.0.0" }, "optionalDependencies": { "encoding": "^0.1.12" } }, "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/git/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/ignore-walk/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch/minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/git/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/ignore-walk/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch/minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], } } diff --git a/config.xml b/config.xml index 45838a5aa0..5101e1fa59 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - @@ -204,4 +204,4 @@ - \ No newline at end of file + diff --git a/hooks/post-process.js b/hooks/post-process.js index 188e3c68bd..449669cf4c 100644 --- a/hooks/post-process.js +++ b/hooks/post-process.js @@ -33,6 +33,7 @@ copyDirRecursively( ); enableLegacyJni(); enableStaticContext(); +disableSplashFadeOnRealmeAndroid13(); removeLegacyKeyboardWorkaround(); patchTargetSdkVersion(); stripLauncherFilterFromMainActivity(); @@ -254,6 +255,79 @@ function enableStaticContext() { } } +function disableSplashFadeOnRealmeAndroid13() { + try { + const prefix = execSync('npm prefix').toString().trim(); + const packageName = getPackageName(); + const mainActivityPath = path.join( + prefix, + 'platforms/android/app/src/main/java', + packageName.replace(/\./g, '/'), + 'MainActivity.java' + ); + + if (!fs.existsSync(mainActivityPath)) { + console.warn('[Cordova Hook] ⚠️ MainActivity.java not found at', mainActivityPath); + return; + } + + let content = fs.readFileSync(mainActivityPath, 'utf-8'); + + if ( + content.includes('hasBrokenRealmeSplashTransfer()') && + content.includes('preferences.set("FadeSplashScreen", false);') + ) { + console.log('[Cordova Hook] ✅ realme splash workaround already enabled, skipping'); + return; + } + + if (!content.includes('import android.os.Build;')) { + content = content.replace( + /import android\.os\.Bundle;/, + 'import android.os.Build;\nimport android.os.Bundle;' + ); + } + + content = content.replace( + /\n\s*@Override\n\s*public void onCreate\(Bundle savedInstanceState\)/, + ` + + private static boolean hasBrokenRealmeSplashTransfer() { + return Build.VERSION.SDK_INT == Build.VERSION_CODES.TIRAMISU + && ("realme".equalsIgnoreCase(Build.MANUFACTURER) + || "realme".equalsIgnoreCase(Build.BRAND)); + } + + @Override + protected void loadConfig() { + super.loadConfig(); + + // Some realme Android 13 builds pass a null SurfaceControl while handing the + // splash view to an app-provided exit animation. Avoid only that handoff. + if (hasBrokenRealmeSplashTransfer()) { + preferences.set("FadeSplashScreen", false); + } + } + + @Override + public void onCreate(Bundle savedInstanceState)` + ); + + if (!content.includes('preferences.set("FadeSplashScreen", false);')) { + console.warn('[Cordova Hook] ⚠️ Unable to inject realme splash workaround'); + return; + } + + fs.writeFileSync(mainActivityPath, content, 'utf-8'); + console.log('[Cordova Hook] ✅ Disabled splash fade on realme Android 13'); + } catch (err) { + console.error( + '[Cordova Hook] ❌ Failed to patch realme splash workaround:', + err.message + ); + } +} + function removeLegacyKeyboardWorkaround() { try { const prefix = execSync('npm prefix').toString().trim(); diff --git a/package-lock.json b/package-lock.json index 1115c34a9d..7550aea35f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,28 +1,28 @@ { "name": "com.foxdebug.acode", - "version": "1.13.1", + "version": "1.13.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "com.foxdebug.acode", - "version": "1.13.1", + "version": "1.13.3", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", + "@codemirror/commands": "^6.11.0", "@codemirror/lang-angular": "^0.1.4", "@codemirror/lang-cpp": "^6.0.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-go": "^6.0.1", - "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-java": "^6.0.2", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-jinja": "^6.0.1", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-less": "^6.0.2", "@codemirror/lang-liquid": "^6.3.2", - "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-markdown": "^6.5.2", "@codemirror/lang-php": "^6.0.2", "@codemirror/lang-python": "^6.2.1", "@codemirror/lang-rust": "^6.0.2", @@ -32,15 +32,15 @@ "@codemirror/lang-wast": "^6.0.2", "@codemirror/lang-xml": "^6.1.0", "@codemirror/lang-yaml": "^6.1.3", - "@codemirror/language": "^6.12.3", + "@codemirror/language": "^6.12.4", "@codemirror/language-data": "^6.5.2", "@codemirror/legacy-modes": "^6.5.3", "@codemirror/lint": "^6.9.7", "@codemirror/lsp-client": "github:Acode-Foundation/codemirror-lsp-client#db6930c2b6db67e14978f08ae8f5aeb149d29468", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.1", "@codemirror/theme-one-dark": "^6.1.3", - "@codemirror/view": "^6.43.4", + "@codemirror/view": "^6.43.9", "@deadlyjack/ajax": "^1.2.6", "@emmetio/codemirror6-plugin": "^0.4.1", "@lezer/common": "^1.5.0", @@ -55,57 +55,57 @@ "@xterm/addon-web-links": "^0.12.0", "@xterm/addon-webgl": "^0.19.0", "@xterm/xterm": "^6.0.0", - "acorn": "^8.16.0", + "acorn": "^8.18.0", "autosize": "^6.0.1", "codemirror": "^6.0.2", "cordova": "13.0.0", - "core-js": "^3.49.0", - "dayjs": "^1.11.20", - "dompurify": "^3.4.11", + "core-js": "^3.50.0", + "dayjs": "^1.11.23", + "dompurify": "^3.4.14", "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", - "filesize": "^11.0.17", + "filesize": "^11.0.22", "html-tag-js": "^2.4.16", "jszip": "^3.10.1", - "katex": "^0.16.45", - "markdown-it": "^14.2.0", - "markdown-it-anchor": "^9.2.0", - "markdown-it-emoji": "^3.0.0", + "katex": "^0.16.47", + "markdown-it": "^14.3.0", + "markdown-it-anchor": "^9.2.1", + "markdown-it-emoji": "^3.1.0", "markdown-it-footnote": "^4.0.0", "markdown-it-github-alerts": "^1.0.1", "markdown-it-task-lists": "^2.1.1", "markdown-it-texmath": "^1.0.0", "mermaid": "^11.14.0", "mime-types": "^3.0.2", - "motion": "^12.42.0", + "motion": "^12.43.0", "mustache": "^4.2.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.7", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", "vscode-css-languageservice": "6.3.10", "vscode-html-languageservice": "5.6.2", "vscode-json-languageservice": "5.7.2", "vscode-languageserver-textdocument": "1.0.12", - "yargs": "^18.0.0" + "yargs": "^18.1.0" }, "devDependencies": { "@babel/core": "^8.0.1", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.3", + "@babel/generator": "^7.29.8", + "@babel/parser": "^7.29.8", "@babel/plugin-transform-runtime": "^8.0.1", - "@babel/preset-env": "^8.0.1", + "@babel/preset-env": "^8.0.2", "@babel/preset-typescript": "^8.0.1", - "@babel/runtime": "^7.29.2", - "@babel/runtime-corejs3": "^7.29.2", - "@babel/traverse": "^7.29.0", + "@babel/runtime": "^7.29.7", + "@babel/runtime-corejs3": "^7.29.7", + "@babel/traverse": "^7.29.8", "@biomejs/biome": "2.4.11", "@lezer/generator": "^1.8.0", - "@rspack/cli": "^2.0.0", - "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.2.0", + "@rspack/core": "^2.2.0", "@types/ace": "^0.0.52", "@types/cordova": "^11.0.3", "@types/url-parse": "^1.4.11", - "autoprefixer": "^10.5.0", + "autoprefixer": "^10.5.4", "babel-loader": "^10.1.1", "chokidar": "^4.0.3", "com.foxdebug.acode.rk.auth": "file:src/plugins/auth", @@ -130,22 +130,22 @@ "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", "css-loader": "^7.1.4", - "happy-dom": "^20.11.1", + "happy-dom": "^20.11.6", "mini-css-extract-plugin": "^2.10.2", "path-browserify": "^1.0.1", "postcss-loader": "^8.2.1", "prettier": "^3.8.3", "prettier-plugin-java": "^2.8.1", "raw-loader": "^4.0.2", - "sass": "^1.99.0", + "sass": "^1.103.1", "sass-loader": "^16.0.8", "style-loader": "^4.0.0", "terminal": "^0.1.4", - "ts-loader": "^9.5.7", + "ts-loader": "^9.6.2", "typescript": "^5.9.3", - "vitest": "^4.1.10", + "vitest": "^4.1.11", "vscode-languageserver-types": "^3.17.5", - "ws": "^8.21.0" + "ws": "^8.21.3" } }, "node_modules/@antfu/install-pkg": { @@ -162,13 +162,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "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.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -365,14 +365,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -676,9 +676,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "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": { @@ -1640,9 +1640,9 @@ "license": "MIT" }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "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": { @@ -1650,9 +1650,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "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": { @@ -1918,13 +1918,13 @@ "license": "MIT" }, "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -2979,9 +2979,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.1.tgz", - "integrity": "sha512-1WjCi/45Mn5e0uvz26FdvRe6bTAvN6WAtkHgIjl0w/LkBvrv4Y5bDR+8YY72r7cefXBfwYUXIHSoxQkrIfnjXQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.2.tgz", + "integrity": "sha512-aFfsjCRYducRV4dPnpsBbdRkLjboca9FVDg6HZCgy0Ahvk2ZQ/2exmCRC5qS9P6rsWwrmIheNaIM6A1j2F8KMA==", "dev": true, "license": "MIT", "dependencies": { @@ -3213,9 +3213,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.1.tgz", - "integrity": "sha512-tiwl69ZQGIbPif28GK8vI/Nm1nYdP+UHXWRnqXl0fjfBS7DWmAs2XvlpVkZyZjVVDxcprcbzCnN93SbuSgz8WQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.2.tgz", + "integrity": "sha512-CUGLn9hNBCF/eXnwdFAWERbniCcXCRvnKwLV9fegeUEIqv7YlU2MepsWMMM54GcILx5XYMnRh+JAL+K5G+mK6g==", "dev": true, "license": "MIT", "dependencies": { @@ -3268,7 +3268,7 @@ "@babel/plugin-transform-private-methods": "^8.0.1", "@babel/plugin-transform-private-property-in-object": "^8.0.1", "@babel/plugin-transform-property-literals": "^8.0.1", - "@babel/plugin-transform-regenerator": "^8.0.1", + "@babel/plugin-transform-regenerator": "^8.0.2", "@babel/plugin-transform-regexp-modifiers": "^8.0.1", "@babel/plugin-transform-reserved-words": "^8.0.1", "@babel/plugin-transform-shorthand-properties": "^8.0.1", @@ -3280,8 +3280,8 @@ "@babel/plugin-transform-unicode-property-regex": "^8.0.1", "@babel/plugin-transform-unicode-regex": "^8.0.1", "@babel/plugin-transform-unicode-sets-regex": "^8.0.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs3": "^1.0.0-rc.2", + "@babel/preset-modules": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^1.0.0", "core-js-compat": "^3.48.0", "semver": "^7.7.3" }, @@ -3306,28 +3306,54 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.2.0.tgz", + "integrity": "sha512-yz0RBN2fx4fjCeFcTWsWgL7PxSRltvTa0Qg14HkWCU3qS8MO7ZSJlBVbGceynd5C9NsJwwUHNQD3dc6tYO+jqQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/plugin-transform-dotall-regex": "^8.0.1", + "@babel/plugin-transform-unicode-property-regex": "^8.0.1", + "@babel/types": "^8.0.0", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/preset-modules/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==", + "node_modules/@babel/preset-modules/node_modules/@babel/helper-string-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/types": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/preset-typescript": { @@ -3350,9 +3376,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", "engines": { @@ -3360,9 +3386,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", - "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz", + "integrity": "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3373,33 +3399,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "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.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -3407,14 +3433,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -3608,13 +3634,13 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", - "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.0.tgz", + "integrity": "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } @@ -3670,9 +3696,9 @@ } }, "node_modules/@codemirror/lang-html": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", - "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -3767,9 +3793,9 @@ } }, "node_modules/@codemirror/lang-markdown": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", - "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.2.tgz", + "integrity": "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.7.1", @@ -3900,9 +3926,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", - "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -3992,9 +4018,9 @@ } }, "node_modules/@codemirror/state": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", - "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -4013,9 +4039,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.43.4", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.4.tgz", - "integrity": "sha512-YImu23iyKfncJzT7sRy+rEqEhSc8RhOHqDxwy4WzXRKJwYm6iwf/9OJk5ctCAdZ6yi2ZqaGEvmf55fSVqMDrgg==", + "version": "6.43.9", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.9.tgz", + "integrity": "sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -4083,21 +4109,21 @@ "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", + "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "dev": true, "license": "MIT", "optional": true, @@ -4106,9 +4132,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "dev": true, "license": "MIT", "optional": true, @@ -4212,9 +4238,9 @@ } }, "node_modules/@lezer/common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", - "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", + "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==", "license": "MIT" }, "node_modules/@lezer/cpp": { @@ -4318,9 +4344,9 @@ } }, "node_modules/@lezer/lr": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", - "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.7.tgz", + "integrity": "sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -4403,29 +4429,29 @@ } }, "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", + "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", "license": "MIT" }, "node_modules/@mermaid-js/parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz", - "integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.1.tgz", + "integrity": "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==", "license": "MIT", "dependencies": { - "@chevrotain/types": "~11.1.1" + "@chevrotain/types": "~11.1.2" } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.3" }, "funding": { "type": "github", @@ -4770,9 +4796,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.142.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", - "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", "dev": true, "license": "MIT", "funding": { @@ -5089,10 +5115,27 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.1.tgz", - "integrity": "sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", "cpu": [ "arm64" ], @@ -5107,9 +5150,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz", - "integrity": "sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", "cpu": [ "arm64" ], @@ -5124,9 +5167,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz", - "integrity": "sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", "cpu": [ "x64" ], @@ -5141,9 +5184,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.1.tgz", - "integrity": "sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", "cpu": [ "x64" ], @@ -5158,9 +5201,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.1.tgz", - "integrity": "sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", "cpu": [ "arm" ], @@ -5175,9 +5218,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz", - "integrity": "sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", "cpu": [ "arm64" ], @@ -5192,9 +5235,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz", - "integrity": "sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", "cpu": [ "arm64" ], @@ -5209,9 +5252,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.1.tgz", - "integrity": "sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", "cpu": [ "ppc64" ], @@ -5226,9 +5269,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.1.tgz", - "integrity": "sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", "cpu": [ "s390x" ], @@ -5243,9 +5286,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz", - "integrity": "sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", "cpu": [ "x64" ], @@ -5260,9 +5303,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz", - "integrity": "sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", "cpu": [ "x64" ], @@ -5277,9 +5320,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.1.tgz", - "integrity": "sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", "cpu": [ "arm64" ], @@ -5293,82 +5336,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz", - "integrity": "sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "2.0.0-alpha.3", - "@emnapi/runtime": "2.0.0-alpha.3", - "@napi-rs/wasm-runtime": "^1.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", - "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "2.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz", - "integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", - "integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.1.tgz", - "integrity": "sha512-KjZdi8Q1wh89gsVmghvbrMgWl6ZWmRmHV6wjB7/g4Zf0dyO+hH3neZUtuDNPO00qq5YE5RITVWvrIZKRaAmzGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz", - "integrity": "sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", "cpu": [ "arm64" ], @@ -5383,9 +5354,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz", - "integrity": "sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", "cpu": [ "x64" ], @@ -5407,28 +5378,32 @@ "license": "MIT" }, "node_modules/@rspack/binding": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.0.3.tgz", - "integrity": "sha512-4exVNhGhW5RFHjK87XeTKbkA/qAgI5NHJlT1jNqiJv0gcUXLqTOEU3w7f8+f9zUo4JMFvPc0c9veOi4M19YYTg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.2.0.tgz", + "integrity": "sha512-nxZzJqqB0EmEKp6qjzFNkBb/SgGt0k0DSENrLvAJgvVvrm3waVsubD0cfxtPlZY/rd5SzadzxWGEHRyFcds5nA==", "dev": true, "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "2.0.3", - "@rspack/binding-darwin-x64": "2.0.3", - "@rspack/binding-linux-arm64-gnu": "2.0.3", - "@rspack/binding-linux-arm64-musl": "2.0.3", - "@rspack/binding-linux-x64-gnu": "2.0.3", - "@rspack/binding-linux-x64-musl": "2.0.3", - "@rspack/binding-wasm32-wasi": "2.0.3", - "@rspack/binding-win32-arm64-msvc": "2.0.3", - "@rspack/binding-win32-ia32-msvc": "2.0.3", - "@rspack/binding-win32-x64-msvc": "2.0.3" + "@rspack/binding-darwin-arm64": "2.2.0", + "@rspack/binding-darwin-x64": "2.2.0", + "@rspack/binding-linux-arm64-gnu": "2.2.0", + "@rspack/binding-linux-arm64-musl": "2.2.0", + "@rspack/binding-linux-ppc64-gnu": "2.2.0", + "@rspack/binding-linux-riscv64-gnu": "2.2.0", + "@rspack/binding-linux-riscv64-musl": "2.2.0", + "@rspack/binding-linux-s390x-gnu": "2.2.0", + "@rspack/binding-linux-x64-gnu": "2.2.0", + "@rspack/binding-linux-x64-musl": "2.2.0", + "@rspack/binding-wasm32-wasi": "2.2.0", + "@rspack/binding-win32-arm64-msvc": "2.2.0", + "@rspack/binding-win32-ia32-msvc": "2.2.0", + "@rspack/binding-win32-x64-msvc": "2.2.0" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.0.3.tgz", - "integrity": "sha512-4UyCjLJwU/WxR6K1/gG4u3+jUsoaRHJ5rNu9fto/UbvrItwdlVNULChAApqZFw6mcSetMddSjSICeuj5pSB6sA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-KAVVT7hp3NBjtc/RY2UtOjzzc8i+s4pIhW1p52UV+Aev6ywQCu3dXwkHTonpPvJO3hqLXc4zIMH5l4HbMqBm4g==", "cpu": [ "arm64" ], @@ -5440,9 +5415,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.0.3.tgz", - "integrity": "sha512-K3evrbTgZNa8emEqk+AjDtbuoXZp5tPZz3pcEgETxuu3KanW8Zu+Fb+TUp1DEUcL0xOmHPPox8H2cZ3pF4Zmug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.2.0.tgz", + "integrity": "sha512-rzyJCX99aFwl540trsVMNZOgK4+IFm2d5+YeP+RdNo9Uprxloz8vHz0J4dYtaq6MRiCAyM60dAwEa3wJMwqWAQ==", "cpu": [ "x64" ], @@ -5454,9 +5429,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.0.3.tgz", - "integrity": "sha512-aPLDaaTtX1wqjLYAIHc2MGDQZtv1Hbjx47oaaefbWz5GbAnSA4P8jdYIeeGRyrqvQ0WqJXIWXgT0d/iXtes00A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.2.0.tgz", + "integrity": "sha512-0t8QOiOMcBV7RvPSsTJ5DQ4QCK6FIyUZy77qbxnS6asGTOXPZZn7V5cL26IxEv/wuHdQ6tQOXheau1fi+gGyBQ==", "cpu": [ "arm64" ], @@ -5468,9 +5443,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.0.3.tgz", - "integrity": "sha512-0WulUQPop6vmSDfrTxghmVlm+6crU8/XqD2f0dOWbEniZVuDZJ5/Y/cBqTRyk3rjl0vrmUv3lc87/t7UgQJQSw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.2.0.tgz", + "integrity": "sha512-BAvCukqcuHxUdE294ITCohvhVkEklW8RbkKkR36Uo0WyIiMPGrnvPjARPn0/4Q4xMAz7lUmC60sZrvJHlAOKMw==", "cpu": [ "arm64" ], @@ -5481,10 +5456,66 @@ "linux" ] }, + "node_modules/@rspack/binding-linux-ppc64-gnu": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-2.2.0.tgz", + "integrity": "sha512-nCHqZLv/E8nm2ccGkb00F5DQtXxzGy3W3X73ArA+N0+zXJUnzRcSRSwr7AE8pVgP/FYfX4yMFgUXy0g0YxYGRA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-riscv64-gnu": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-2.2.0.tgz", + "integrity": "sha512-CA3WEqKFDI6FAZTnCho2n9pmdPWZYAW/S8mqgxd0cx2Jix43at3VyLxhCC7ED5A9WBSFn/AdHaIbVtgoQHVhWA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-riscv64-musl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-2.2.0.tgz", + "integrity": "sha512-kHB960oClkoPRPZ6sdkhRvqbdRIlbpIMYd/Tbxfmn3DWQahiCk1pkUFJbOtFq3EgESxZISV4THl442W2Y57HvQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-s390x-gnu": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-2.2.0.tgz", + "integrity": "sha512-lVBdiffVo1jq0P0jT36jNou2suLB4ueQI4aWUs+HM+h67YPBtVKWu/mo5Wh59+8nowgcZmYaFM5hdH69963I9w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.0.3.tgz", - "integrity": "sha512-fAhiMuV5omT53YMft+f3Y9euAFgspuyBAk9ZpeW2buL2TkuUMwP07adhhvQfKdQ5gpELfzmjQaRDGqaIT8UWiA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.2.0.tgz", + "integrity": "sha512-M49UaWspE0YJ3268DsquD8idEQTfjBDMvO/I8qccV/Z5T+Q98FJ+kIs5liUaTWb48OIbDEK+8ZKx5QzLbfVN6g==", "cpu": [ "x64" ], @@ -5496,9 +5527,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.0.3.tgz", - "integrity": "sha512-0kcuFoZ8vy2iNWoISFOZt+/Ujo7LRLrzE7h07AV5r+oN/mv+/v14Sd/8NUtDIScCkrYOszYq/QS31e6t0UrVfw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.2.0.tgz", + "integrity": "sha512-YYbs0wmey+5blhEQDE4Dax3TwJtqfGwe2QBm3OLphlBHo/fcZVvimzKkMV0/pVrZTLy2z5ZAwNhGMY64bNr77w==", "cpu": [ "x64" ], @@ -5510,9 +5541,9 @@ ] }, "node_modules/@rspack/binding-wasm32-wasi": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.0.3.tgz", - "integrity": "sha512-x2fsw7GzNZEnw444ikj4/b8kVjM0Y0TllxmizHpYZ9gmaQrOk5OXo9RQdz+l4zzoGors0l2IZP5Cc4GJNCaSoQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.2.0.tgz", + "integrity": "sha512-rerLPTN/HD4EvLNWs3O2N+Eb37eGvLRIP3dXXc3n+UzTebOepAsahNn44vXeRBsE4m/pHkpDJjwgWTytgQ2gBw==", "cpu": [ "wasm32" ], @@ -5520,15 +5551,15 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "1.1.4" + "@emnapi/core": "1.11.3", + "@emnapi/runtime": "1.11.3", + "@napi-rs/wasm-runtime": "1.1.6" } }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.0.3.tgz", - "integrity": "sha512-jqlxuVPdrgMuwj/HEjSkC/jmhl4fAuKyob36zJXq2uAusn2FRJ4kClGe1fLFpfxRXFVQAWwlAOwLJg8T0suuaA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.2.0.tgz", + "integrity": "sha512-JUAmnbOQYGTRyX28vls/MOMonZWcmcCi5YtEq6YMc8Xqh3Qx0HUwaLM/I1xr/N9BX3b8CV0dQDOpNuBc2ei+CA==", "cpu": [ "arm64" ], @@ -5540,9 +5571,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.0.3.tgz", - "integrity": "sha512-QM4JEuyk5QaZ5gnvnAIaCwVQzCkrD2E4Sud77kx/MVGDsRkcOlMx3blMC5QNHPDamRmWGk+7314YOQvRhKuWyg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.2.0.tgz", + "integrity": "sha512-wOmQRUaOG0eWH/fnfslA9yK9xKfaq9X+3Xa1TdTJnTqlo0ARJYs6A+Lzjbs7cxdY/o1f12Xe00BG3nQozReUOg==", "cpu": [ "ia32" ], @@ -5554,9 +5585,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.0.3.tgz", - "integrity": "sha512-vSQNnAy0wswG6AfNRuArTHQBiXOXl+A9ddQxBFup4PMHUzXxKtsBLQzw7BgFC0EgrPeHbt+30j7sXVZKYukj4A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.2.0.tgz", + "integrity": "sha512-v6/3bFr9+i7hRpgulL9b5qCvZL0VgR4vQGQNqOWezUzZmPUj9LYpvB0L9xZIVwDQ2ug/xBiA58bfg5IbESgoyw==", "cpu": [ "x64" ], @@ -5568,9 +5599,9 @@ ] }, "node_modules/@rspack/cli": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-2.0.3.tgz", - "integrity": "sha512-h/Xbkupx82UaPr5Ye3hNORi5eXmpEGSPri7WkEOrKIcT+Y3h603kujCQziNIPX3G4UURWPiksIArp1GBTF+A9w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-2.2.0.tgz", + "integrity": "sha512-GSiQPG5v5tN8vYJdUMYX44sPiwVVG8H25fq3LWRydVB4WswDAD/N3qNgWZtFVliQdLH3ZWzFdFUoCyZmea0TMA==", "dev": true, "license": "MIT", "bin": { @@ -5587,20 +5618,20 @@ } }, "node_modules/@rspack/core": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.0.3.tgz", - "integrity": "sha512-2ufO/8FHIA/lX6UOgSsKPhpDvHr0sh9lYq/n/LsIZsTwu3973BGbu2fg1Akvuu3rEnskPqXjsqH2EPBzEA42uA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.2.0.tgz", + "integrity": "sha512-3W7oX0BAHbK4VlknH3lfyfRvupzxdZtyEa+DfKmdjzmIAcqYtHnFd0nLqp5dzitDPyDI1TIKkDhpB0AZJn0pVg==", "dev": true, "license": "MIT", "dependencies": { - "@rspack/binding": "2.0.3" + "@rspack/binding": "2.2.0" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", - "@swc/helpers": ">=0.5.1" + "@swc/helpers": "^0.5.23" }, "peerDependenciesMeta": { "@module-federation/runtime-tools": { @@ -6150,16 +6181,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -6178,13 +6209,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", - "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.10", + "@vitest/spy": "4.1.11", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -6205,9 +6236,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", - "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -6218,13 +6249,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", - "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.10", + "@vitest/utils": "4.1.11", "pathe": "^2.0.3" }, "funding": { @@ -6232,14 +6263,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", - "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.10", - "@vitest/utils": "4.1.10", + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -6248,9 +6279,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", "dev": true, "license": "MIT", "funding": { @@ -6258,13 +6289,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", - "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.10", + "@vitest/pretty-format": "4.1.11", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -6540,9 +6571,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6737,9 +6768,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "dev": true, "funding": [ { @@ -6757,8 +6788,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -6852,9 +6883,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.30", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz", - "integrity": "sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==", + "version": "2.11.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", + "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6980,9 +7011,9 @@ "license": "ISC" }, "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==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -7000,11 +7031,11 @@ ], "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" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -7078,9 +7109,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ { @@ -7719,11 +7750,14 @@ } }, "node_modules/core-js": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", "hasInstallScript": true, "license": "MIT", + "engines": { + "node": "*" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -7909,9 +7943,9 @@ } }, "node_modules/cytoscape": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.3.tgz", - "integrity": "sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g==", + "version": "3.34.2", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.2.tgz", + "integrity": "sha512-Cm2jaj1X/PBNlzV9yH8zcfGOxO7U+CJ/+mxSBVPSchLaugdp4jtlGx5qaHtPRZ6tgiZ5P+o1XoRfJA+ba6KM3g==", "license": "MIT", "engines": { "node": ">=0.10" @@ -8423,9 +8457,9 @@ "dev": true }, "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", "license": "MIT" }, "node_modules/debug": { @@ -8596,9 +8630,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", - "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -8633,9 +8667,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.357", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz", - "integrity": "sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==", + "version": "1.5.415", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz", + "integrity": "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==", "dev": true, "license": "ISC" }, @@ -8716,6 +8750,7 @@ "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" @@ -8772,13 +8807,15 @@ "license": "MIT" }, "node_modules/es-toolkit": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", - "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.51.0.tgz", + "integrity": "sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types", + "tests/browser-compat" ] }, "node_modules/escalade": { @@ -8983,9 +9020,9 @@ } }, "node_modules/filesize": { - "version": "11.0.17", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.17.tgz", - "integrity": "sha512-oHLTvMLw6imZUl1se/RBQrFlyy50nXce4sU7yGR6Qc0JgCwqnfiFsAnEwotdGmfKLD7SArGUk2/5STU0k8LOBQ==", + "version": "11.0.22", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.22.tgz", + "integrity": "sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw==", "license": "BSD-3-Clause", "engines": { "node": ">= 10.8.0" @@ -9045,12 +9082,12 @@ } }, "node_modules/framer-motion": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.0.tgz", - "integrity": "sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==", + "version": "12.43.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.43.0.tgz", + "integrity": "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g==", "license": "MIT", "dependencies": { - "motion-dom": "^12.42.0", + "motion-dom": "^12.43.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, @@ -9239,9 +9276,9 @@ "license": "MIT" }, "node_modules/happy-dom": { - "version": "20.11.1", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.11.1.tgz", - "integrity": "sha512-XSt8tMzbW9ymE7687xztkO1ckR7qJNQ3LywY9vlYGhGi3zXrGBHuUo2Cl1ztZaICW+1eAGdkLbj6iwVqDT33kg==", + "version": "20.11.6", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.11.6.tgz", + "integrity": "sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg==", "dev": true, "license": "MIT", "dependencies": { @@ -10232,9 +10269,9 @@ "license": "MIT" }, "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "funding": [ { "type": "github", @@ -10385,9 +10422,9 @@ } }, "node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", "funding": [ { "type": "github", @@ -10401,8 +10438,8 @@ "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -10412,9 +10449,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", - "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.1.tgz", + "integrity": "sha512-p6APiLJDFAW2GEvaavDvhIBn7jrX2jLv77NkBGgNacFTurbORYc4pyYySg/mI6mpR6cHQuAtzKtmqgQr4K8dsQ==", "license": "Unlicense", "peerDependencies": { "@types/markdown-it": "*", @@ -10422,9 +10459,9 @@ } }, "node_modules/markdown-it-emoji": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", - "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.1.0.tgz", + "integrity": "sha512-NhmMEH2ywduD4Nty1E8uB5NqfLhAT1VR0dyvoJyStKOqCzbZmVdn/+8wj7zpDsb/fLBikpCPsWwxqKlvMmbz4g==", "license": "MIT" }, "node_modules/markdown-it-footnote": { @@ -11212,12 +11249,12 @@ } }, "node_modules/motion": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.42.0.tgz", - "integrity": "sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA==", + "version": "12.43.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.43.0.tgz", + "integrity": "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ==", "license": "MIT", "dependencies": { - "framer-motion": "^12.42.0", + "framer-motion": "^12.43.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -11238,9 +11275,9 @@ } }, "node_modules/motion-dom": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.0.tgz", - "integrity": "sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==", + "version": "12.43.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.43.0.tgz", + "integrity": "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag==", "license": "MIT", "dependencies": { "motion-utils": "^12.39.0" @@ -11268,9 +11305,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -11347,11 +11384,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nopt": { "version": "9.0.0", @@ -11809,9 +11849,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -11851,9 +11891,9 @@ } }, "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -11871,7 +11911,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -12386,13 +12426,13 @@ "license": "Unlicense" }, "node_modules/rolldown": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", - "integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.142.0", + "@oxc-project/types": "=0.147.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -12402,21 +12442,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.1", - "@rolldown/binding-darwin-arm64": "1.2.1", - "@rolldown/binding-darwin-x64": "1.2.1", - "@rolldown/binding-freebsd-x64": "1.2.1", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.1", - "@rolldown/binding-linux-arm64-gnu": "1.2.1", - "@rolldown/binding-linux-arm64-musl": "1.2.1", - "@rolldown/binding-linux-ppc64-gnu": "1.2.1", - "@rolldown/binding-linux-s390x-gnu": "1.2.1", - "@rolldown/binding-linux-x64-gnu": "1.2.1", - "@rolldown/binding-linux-x64-musl": "1.2.1", - "@rolldown/binding-openharmony-arm64": "1.2.1", - "@rolldown/binding-wasm32-wasi": "1.2.1", - "@rolldown/binding-win32-arm64-msvc": "1.2.1", - "@rolldown/binding-win32-x64-msvc": "1.2.1" + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" } }, "node_modules/roughjs": { @@ -12473,13 +12513,13 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.99.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", - "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", + "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", + "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -12487,7 +12527,7 @@ "sass": "sass.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" @@ -12534,6 +12574,36 @@ } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", @@ -13106,37 +13176,28 @@ } }, "node_modules/ts-loader": { - "version": "9.5.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", - "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.2.tgz", + "integrity": "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", + "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" }, "peerDependencies": { + "loader-utils": "*", "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "webpack": "^4.0.0 || ^5.0.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "loader-utils": { + "optional": true + } } }, "node_modules/tslib": { @@ -13288,9 +13349,9 @@ } }, "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==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -13345,16 +13406,16 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", - "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist-node/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/valid-identifier": { @@ -13382,16 +13443,16 @@ } }, "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -13408,7 +13469,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -13460,19 +13521,19 @@ } }, "node_modules/vitest": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", - "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.10", - "@vitest/mocker": "4.1.10", - "@vitest/pretty-format": "4.1.10", - "@vitest/runner": "4.1.10", - "@vitest/snapshot": "4.1.10", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -13500,12 +13561,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.10", - "@vitest/browser-preview": "4.1.10", - "@vitest/browser-webdriverio": "4.1.10", - "@vitest/coverage-istanbul": "4.1.10", - "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -13812,9 +13873,9 @@ } }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", "engines": { @@ -13891,15 +13952,15 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", + "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" }, @@ -13932,6 +13993,22 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 7e49faba2d..2a2a7deae2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.foxdebug.acode", "displayName": "Acode", - "version": "1.13.1", + "version": "1.13.3", "description": "Acode is a code editor for android", "scripts": { "lang": "node ./utils/lang.js", @@ -64,22 +64,22 @@ "homepage": "https://github.com/deadlyjack/acode#readme", "devDependencies": { "@babel/core": "^8.0.1", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.3", + "@babel/generator": "^7.29.8", + "@babel/parser": "^7.29.8", "@babel/plugin-transform-runtime": "^8.0.1", - "@babel/preset-env": "^8.0.1", + "@babel/preset-env": "^8.0.2", "@babel/preset-typescript": "^8.0.1", - "@babel/runtime": "^7.29.2", - "@babel/runtime-corejs3": "^7.29.2", - "@babel/traverse": "^7.29.0", + "@babel/runtime": "^7.29.7", + "@babel/runtime-corejs3": "^7.29.7", + "@babel/traverse": "^7.29.8", "@biomejs/biome": "2.4.11", "@lezer/generator": "^1.8.0", - "@rspack/cli": "^2.0.0", - "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.2.0", + "@rspack/core": "^2.2.0", "@types/ace": "^0.0.52", "@types/cordova": "^11.0.3", "@types/url-parse": "^1.4.11", - "autoprefixer": "^10.5.0", + "autoprefixer": "^10.5.4", "babel-loader": "^10.1.1", "chokidar": "^4.0.3", "com.foxdebug.acode.rk.auth": "file:src/plugins/auth", @@ -104,38 +104,38 @@ "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", "css-loader": "^7.1.4", - "happy-dom": "^20.11.1", + "happy-dom": "^20.11.6", "mini-css-extract-plugin": "^2.10.2", "path-browserify": "^1.0.1", "postcss-loader": "^8.2.1", "prettier": "^3.8.3", "prettier-plugin-java": "^2.8.1", "raw-loader": "^4.0.2", - "sass": "^1.99.0", + "sass": "^1.103.1", "sass-loader": "^16.0.8", "style-loader": "^4.0.0", "terminal": "^0.1.4", - "ts-loader": "^9.5.7", + "ts-loader": "^9.6.2", "typescript": "^5.9.3", - "vitest": "^4.1.10", + "vitest": "^4.1.11", "vscode-languageserver-types": "^3.17.5", - "ws": "^8.21.0" + "ws": "^8.21.3" }, "dependencies": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", + "@codemirror/commands": "^6.11.0", "@codemirror/lang-angular": "^0.1.4", "@codemirror/lang-cpp": "^6.0.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-go": "^6.0.1", - "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-java": "^6.0.2", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-jinja": "^6.0.1", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-less": "^6.0.2", "@codemirror/lang-liquid": "^6.3.2", - "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-markdown": "^6.5.2", "@codemirror/lang-php": "^6.0.2", "@codemirror/lang-python": "^6.2.1", "@codemirror/lang-rust": "^6.0.2", @@ -145,15 +145,15 @@ "@codemirror/lang-wast": "^6.0.2", "@codemirror/lang-xml": "^6.1.0", "@codemirror/lang-yaml": "^6.1.3", - "@codemirror/language": "^6.12.3", + "@codemirror/language": "^6.12.4", "@codemirror/language-data": "^6.5.2", "@codemirror/legacy-modes": "^6.5.3", "@codemirror/lint": "^6.9.7", "@codemirror/lsp-client": "github:Acode-Foundation/codemirror-lsp-client#db6930c2b6db67e14978f08ae8f5aeb149d29468", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.1", "@codemirror/theme-one-dark": "^6.1.3", - "@codemirror/view": "^6.43.4", + "@codemirror/view": "^6.43.9", "@deadlyjack/ajax": "^1.2.6", "@emmetio/codemirror6-plugin": "^0.4.1", "@lezer/common": "^1.5.0", @@ -168,47 +168,47 @@ "@xterm/addon-web-links": "^0.12.0", "@xterm/addon-webgl": "^0.19.0", "@xterm/xterm": "^6.0.0", - "acorn": "^8.16.0", + "acorn": "^8.18.0", "autosize": "^6.0.1", "codemirror": "^6.0.2", "cordova": "13.0.0", - "core-js": "^3.49.0", - "dayjs": "^1.11.20", - "dompurify": "^3.4.11", + "core-js": "^3.50.0", + "dayjs": "^1.11.23", + "dompurify": "^3.4.14", "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", - "filesize": "^11.0.17", + "filesize": "^11.0.22", "html-tag-js": "^2.4.16", "jszip": "^3.10.1", - "katex": "^0.16.45", - "markdown-it": "^14.2.0", - "markdown-it-anchor": "^9.2.0", - "markdown-it-emoji": "^3.0.0", + "katex": "^0.16.47", + "markdown-it": "^14.3.0", + "markdown-it-anchor": "^9.2.1", + "markdown-it-emoji": "^3.1.0", "markdown-it-footnote": "^4.0.0", "markdown-it-github-alerts": "^1.0.1", "markdown-it-task-lists": "^2.1.1", "markdown-it-texmath": "^1.0.0", "mermaid": "^11.14.0", "mime-types": "^3.0.2", - "motion": "^12.42.0", + "motion": "^12.43.0", "mustache": "^4.2.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.7", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", "vscode-css-languageservice": "6.3.10", "vscode-html-languageservice": "5.6.2", "vscode-json-languageservice": "5.7.2", "vscode-languageserver-textdocument": "1.0.12", - "yargs": "^18.0.0" + "yargs": "^18.1.0" }, "overrides": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", - "@codemirror/language": "^6.12.3", + "@codemirror/commands": "^6.11.0", + "@codemirror/language": "^6.12.4", "@codemirror/lint": "^6.9.7", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.43.4", + "@codemirror/state": "^6.7.1", + "@codemirror/view": "^6.43.9", "tar": "^7.5.22" }, "browserslist": "cover 100%", diff --git a/readme.md b/readme.md index f95dad8c33..ca69912401 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,8 @@ Welcome to Acode Editor - a powerful and versatile code editing tool designed sp - Edit and create websites, and instantly preview them in a browser. - Seamlessly modify source files for various languages like Python, Java, JavaScript, and more. - Built-in javascript console +- S/FTP and SSH terminal integration +- Built-in terminal(Alpine) - Enjoy multi-language editing support with easy management tools. - Enjoy a large collections of community plugins to enhance your coding experience. diff --git a/rspack.config.js b/rspack.config.js index a30e31154b..9efbf30197 100644 --- a/rspack.config.js +++ b/rspack.config.js @@ -144,6 +144,7 @@ module.exports = (env, options) => { boot: './src/boot.js', main: './src/main.js', console: './src/lib/console.js', + consoleWorker: './src/lib/consoleWorker.js', searchInFilesWorker: './src/sidebarApps/searchInFiles/worker.js', searchIndexWorker: './src/sidebarApps/searchInFiles/indexWorker.js', htmlLspWorker: './src/cm/lsp/workers/html.worker.ts', diff --git a/src/cm/commandRegistry.js b/src/cm/commandRegistry.js index 1446027cbb..5d53cb1747 100644 --- a/src/cm/commandRegistry.js +++ b/src/cm/commandRegistry.js @@ -63,13 +63,7 @@ import { } from "@codemirror/lint"; import { LSPPlugin, - closeReferencePanel as lspCloseReferencePanel, - findReferences as lspFindReferences, formatDocument as lspFormatDocument, - jumpToDeclaration as lspJumpToDeclaration, - jumpToDefinition as lspJumpToDefinition, - jumpToImplementation as lspJumpToImplementation, - jumpToTypeDefinition as lspJumpToTypeDefinition, } from "@codemirror/lsp-client"; import { Compartment, EditorSelection } from "@codemirror/state"; import { keymap } from "@codemirror/view"; @@ -91,6 +85,10 @@ import { renameSymbol as acodeRenameSymbol, clearDiagnosticsEffect, clientManager, + jumpToDeclaration as lspJumpToDeclaration, + jumpToDefinition as lspJumpToDefinition, + jumpToImplementation as lspJumpToImplementation, + jumpToTypeDefinition as lspJumpToTypeDefinition, nextSignature as lspNextSignature, prevSignature as lspPrevSignature, showSignatureHelp as lspShowSignatureHelp, diff --git a/src/cm/lsp/clientManager.ts b/src/cm/lsp/clientManager.ts index 11bb6f5401..efd9cb284d 100644 --- a/src/cm/lsp/clientManager.ts +++ b/src/cm/lsp/clientManager.ts @@ -24,6 +24,7 @@ import { supportsBuiltinFormatting } from "./formattingSupport"; import { documentColorsExtension } from "./documentColors"; import { inlayHintsExtension } from "./inlayHints"; import { addLspLog } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import { selectRuntimeProvider } from "./runtimeProviders"; import serverRegistry from "./serverRegistry"; import { @@ -804,6 +805,14 @@ export class LspClientManager { configuration: true, workspaceFolders: true, }, + textDocument: { + codeAction: { + dataSupport: true, + resolveSupport: { + properties: ["edit"], + }, + }, + }, }, }; @@ -1436,12 +1445,8 @@ function applyTextEdits( if (!edit?.range) continue; let fromBase: number; let toBase: number; - try { - fromBase = plugin.fromPosition(edit.range.start, plugin.syncedDoc); - toBase = plugin.fromPosition(edit.range.end, plugin.syncedDoc); - } catch (_) { - continue; - } + fromBase = safeLspPositionToOffset(plugin.syncedDoc, edit.range.start); + toBase = safeLspPositionToOffset(plugin.syncedDoc, edit.range.end); const fromResult = plugin.unsyncedChanges.mapPos( fromBase, 1, diff --git a/src/cm/lsp/codeActions.ts b/src/cm/lsp/codeActions.ts index 89811ac560..7e8996e5ad 100644 --- a/src/cm/lsp/codeActions.ts +++ b/src/cm/lsp/codeActions.ts @@ -12,8 +12,9 @@ import type { Range as LspRange, WorkspaceEdit, } from "vscode-languageserver-types"; -import type { Position, Range } from "./types"; +import type { Range } from "./types"; import { addLspLogFor } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import type AcodeWorkspace from "./workspace"; type CodeActionResponse = (CodeAction | Command)[] | null; @@ -62,13 +63,6 @@ function isCommand(item: CodeAction | Command): item is Command { ); } -function lspPositionToOffset( - doc: { line: (n: number) => { from: number } }, - pos: Position, -): number { - return doc.line(pos.line + 1).from + pos.character; -} - async function requestCodeActions( plugin: LSPPlugin, range: LspRange, @@ -157,7 +151,7 @@ async function applyChangesToFile( workspace: AcodeWorkspace, uri: string, changes: LspChange[], - mapping: { mapPosition: (uri: string, pos: Position) => number }, + mapping: { mapPos: (uri: string, pos: number, assoc?: number) => number }, ): Promise { const file = workspace.getFile(uri); if (file) { @@ -165,8 +159,16 @@ async function applyChangesToFile( if (view) { view.dispatch({ changes: changes.map((c) => ({ - from: mapping.mapPosition(uri, c.range.start), - to: mapping.mapPosition(uri, c.range.end), + from: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, c.range.start), + 1, + ), + to: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, c.range.end), + -1, + ), insert: c.newText, })), userEvent: "codeAction", @@ -188,8 +190,11 @@ async function applyChangesToFile( displayedView.dispatch({ changes: changes.map((c) => ({ - from: lspPositionToOffset(displayedView.state.doc, c.range.start), - to: lspPositionToOffset(displayedView.state.doc, c.range.end), + from: safeLspPositionToOffset( + displayedView.state.doc, + c.range.start, + ), + to: safeLspPositionToOffset(displayedView.state.doc, c.range.end), insert: c.newText, })), userEvent: "codeAction", diff --git a/src/cm/lsp/definition.ts b/src/cm/lsp/definition.ts new file mode 100644 index 0000000000..53d3726ed7 --- /dev/null +++ b/src/cm/lsp/definition.ts @@ -0,0 +1,147 @@ +import { LSPPlugin } from "@codemirror/lsp-client"; +import type { Command, EditorView } from "@codemirror/view"; +import { showReferencesPanel } from "components/referencesPanel"; +import { navigateToReference } from "components/referencesPanel/utils"; +import toast from "components/toast"; +import type { ServerCapabilities } from "vscode-languageserver-protocol"; +import { normalizeLocations, type LspLocationResult } from "./locationUtils"; +import { addLspLogFor } from "./logs"; +import { fetchLineText, getWordAtCursor } from "./references"; + +type DefinitionKind = + | "definition" + | "declaration" + | "implementation" + | "typeDefinition"; + +const CAPABILITY: Record = { + definition: "definitionProvider", + declaration: "declarationProvider", + implementation: "implementationProvider", + typeDefinition: "typeDefinitionProvider", +}; + +const LABEL: Record = { + definition: "definition", + declaration: "declaration", + implementation: "implementation", + typeDefinition: "type definition", +}; + +function locationKey(location: ReturnType[number]) { + const { start, end } = location.range; + return `${location.uri}:${start.line}:${start.character}:${end.line}:${end.character}`; +} + +async function fetchLocations( + view: EditorView, + kind: DefinitionKind, +): Promise | null> { + const plugins = LSPPlugin.getAll(view, kind).filter( + (plugin) => !!plugin.client.serverCapabilities?.[CAPABILITY[kind]], + ); + if (!plugins.length) { + toast(`Language server does not support go to ${LABEL[kind]}`); + return null; + } + + const position = view.state.selection.main.head; + const settled = await Promise.allSettled( + plugins.map(async (plugin) => { + plugin.client.sync(); + return plugin.client.request< + { + textDocument: { uri: string }; + position: { line: number; character: number }; + }, + LspLocationResult + >(`textDocument/${kind}`, { + textDocument: { uri: plugin.uri }, + position: plugin.toPosition(position), + }); + }), + ); + + const locations: ReturnType = []; + const seen = new Set(); + for (let index = 0; index < settled.length; index++) { + const result = settled[index]; + if (result.status === "rejected") { + addLspLogFor( + plugins[index], + "warn", + `Go to ${LABEL[kind]} failed`, + result.reason, + ); + continue; + } + for (const location of normalizeLocations(result.value)) { + const key = locationKey(location); + if (seen.has(key)) continue; + seen.add(key); + locations.push(location); + } + } + return locations; +} + +async function goTo(view: EditorView, kind: DefinitionKind): Promise { + try { + const locations = await fetchLocations(view, kind); + if (locations === null) return false; + if (!locations.length) { + toast(`No ${LABEL[kind]} found`); + return true; + } + + if (locations.length === 1) { + await navigateToReference(locations[0]); + return true; + } + + const symbolName = getWordAtCursor(view); + const panel = showReferencesPanel({ symbolName }); + panel.setReferences( + await Promise.all( + locations.map(async (location) => ({ + ...location, + lineText: await fetchLineText( + location.uri, + location.range.start.line, + ), + })), + ), + ); + return true; + } catch (error) { + console.error(`[LSP:Definition] Go to ${LABEL[kind]} failed:`, error); + return false; + } +} + +export const jumpToDefinition: Command = (view) => { + void goTo(view, "definition"); + return true; +}; + +export const jumpToDeclaration: Command = (view) => { + void goTo(view, "declaration"); + return true; +}; + +export const jumpToImplementation: Command = (view) => { + void goTo(view, "implementation"); + return true; +}; + +export const jumpToTypeDefinition: Command = (view) => { + void goTo(view, "typeDefinition"); + return true; +}; + +export const goToDefinition = (view: EditorView) => goTo(view, "definition"); +export const goToDeclaration = (view: EditorView) => goTo(view, "declaration"); +export const goToImplementation = (view: EditorView) => + goTo(view, "implementation"); +export const goToTypeDefinition = (view: EditorView) => + goTo(view, "typeDefinition"); diff --git a/src/cm/lsp/diagnostics.ts b/src/cm/lsp/diagnostics.ts index 906c505167..61e670ac73 100644 --- a/src/cm/lsp/diagnostics.ts +++ b/src/cm/lsp/diagnostics.ts @@ -10,6 +10,7 @@ import { } from "@codemirror/state"; import { type EditorView, ViewPlugin, type ViewUpdate } from "@codemirror/view"; import { addLspLogFor } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import type { DocumentDiagnosticParams, DocumentDiagnosticReport, @@ -186,13 +187,13 @@ function collectLspDiagnostics( let from: number; let to: number; try { - const mappedFrom = plugin.fromPosition( - diagnostic.range.start, + const mappedFrom = safeLspPositionToOffset( plugin.syncedDoc, + diagnostic.range.start, ); - const mappedTo = plugin.fromPosition( - diagnostic.range.end, + const mappedTo = safeLspPositionToOffset( plugin.syncedDoc, + diagnostic.range.end, ); const fromResult = plugin.unsyncedChanges.mapPos(mappedFrom); const toResult = plugin.unsyncedChanges.mapPos(mappedTo); diff --git a/src/cm/lsp/documentColors.ts b/src/cm/lsp/documentColors.ts index 11496259fd..6c64c7540d 100644 --- a/src/cm/lsp/documentColors.ts +++ b/src/cm/lsp/documentColors.ts @@ -36,6 +36,7 @@ import { type ColorChipPayload, } from "../colorChip"; import type { LSPPluginAPI } from "./types"; +import { safeLspPositionToOffset } from "./positionUtils"; export interface DocumentColorsConfig { enabled?: boolean; @@ -178,8 +179,8 @@ function mapLspRange( let from: number; let to: number; try { - const fromBase = lsp.fromPosition(range.start, lsp.syncedDoc); - const toBase = lsp.fromPosition(range.end, lsp.syncedDoc); + const fromBase = safeLspPositionToOffset(lsp.syncedDoc, range.start); + const toBase = safeLspPositionToOffset(lsp.syncedDoc, range.end); const fromMapped = lsp.unsyncedChanges.mapPos( fromBase, 1, diff --git a/src/cm/lsp/index.ts b/src/cm/lsp/index.ts index f3a8b4d36a..e165f91b17 100644 --- a/src/cm/lsp/index.ts +++ b/src/cm/lsp/index.ts @@ -89,6 +89,16 @@ export { findAllReferences, findAllReferencesInTab, } from "./references"; +export { + goToDeclaration, + goToDefinition, + goToImplementation, + goToTypeDefinition, + jumpToDeclaration, + jumpToDefinition, + jumpToImplementation, + jumpToTypeDefinition, +} from "./definition"; export { acodeRenameExtension, acodeRenameKeymap, diff --git a/src/cm/lsp/inlayHints.ts b/src/cm/lsp/inlayHints.ts index 477c82d1b2..112ec3e5b3 100644 --- a/src/cm/lsp/inlayHints.ts +++ b/src/cm/lsp/inlayHints.ts @@ -22,6 +22,7 @@ import type { Position, } from "vscode-languageserver-types"; import type { LSPPluginAPI } from "./types"; +import { safeLspPositionToOffset } from "./positionUtils"; // ============================================================================ // Types @@ -238,7 +239,7 @@ function createPlugin(config: InlayHintsConfig) { let pos: number; try { - pos = lsp.fromPosition(h.position, lsp.syncedDoc); + pos = safeLspPositionToOffset(lsp.syncedDoc, h.position); const mapped = lsp.unsyncedChanges.mapPos(pos); if (mapped === null) continue; pos = mapped; diff --git a/src/cm/lsp/locationUtils.ts b/src/cm/lsp/locationUtils.ts new file mode 100644 index 0000000000..672c6a2744 --- /dev/null +++ b/src/cm/lsp/locationUtils.ts @@ -0,0 +1,26 @@ +import type { + Location, + LocationLink, +} from "vscode-languageserver-protocol"; + +export type LspLocationResult = + | Location + | Location[] + | LocationLink[] + | null; + +/** Normalize definition-style responses to the Location shape used by Acode. */ +export function normalizeLocations(result: LspLocationResult): Location[] { + if (!result) return []; + const locations = Array.isArray(result) ? result : [result]; + + return locations.map((location) => { + if ("targetUri" in location) { + return { + uri: location.targetUri, + range: location.targetSelectionRange ?? location.targetRange, + }; + } + return location; + }); +} diff --git a/src/cm/lsp/positionUtils.ts b/src/cm/lsp/positionUtils.ts new file mode 100644 index 0000000000..158afe188e --- /dev/null +++ b/src/cm/lsp/positionUtils.ts @@ -0,0 +1,16 @@ +import type { Text } from "@codemirror/state"; + +/** Convert an LSP position to an offset without reading outside the document. */ +export function safeLspPositionToOffset( + doc: Pick, + position: { line: number; character: number }, +): number { + if (position.line < 0) return 0; + if (position.line >= doc.lines) return doc.length; + + const line = doc.line(position.line + 1); + const character = Number.isFinite(position.character) + ? Math.max(0, Math.min(position.character, line.length)) + : 0; + return line.from + character; +} diff --git a/src/cm/lsp/references.ts b/src/cm/lsp/references.ts index def69288c3..cb02fe207d 100644 --- a/src/cm/lsp/references.ts +++ b/src/cm/lsp/references.ts @@ -33,7 +33,7 @@ interface ReferenceParams { context: { includeDeclaration: boolean }; } -async function fetchLineText(uri: string, line: number): Promise { +export async function fetchLineText(uri: string, line: number): Promise { try { interface EditorManagerLike { getFile?: (uri: string, type: string) => EditorFileLike | null; @@ -89,7 +89,7 @@ async function fetchLineText(uri: string, line: number): Promise { return ""; } -function getWordAtCursor(view: EditorView): string { +export function getWordAtCursor(view: EditorView): string { const { state } = view; const pos = state.selection.main.head; const word = state.wordAt(pos); diff --git a/src/cm/lsp/rename.ts b/src/cm/lsp/rename.ts index 75b89693cb..5e4c93b50b 100644 --- a/src/cm/lsp/rename.ts +++ b/src/cm/lsp/rename.ts @@ -8,6 +8,7 @@ import { import prompt from "dialogs/prompt"; import type * as lsp from "vscode-languageserver-protocol"; import { addLspLogFor } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import type AcodeWorkspace from "./workspace"; interface RenameParams { @@ -99,12 +100,24 @@ async function performRename(view: EditorView): Promise { ) { initialValue = word; } else if ("start" in prepareResult && "end" in prepareResult) { - const from = plugin.fromPosition(prepareResult.start); - const to = plugin.fromPosition(prepareResult.end); + const from = safeLspPositionToOffset( + view.state.doc, + prepareResult.start, + ); + const to = safeLspPositionToOffset( + view.state.doc, + prepareResult.end, + ); initialValue = view.state.sliceDoc(from, to); } else if ("range" in prepareResult && prepareResult.range) { - const from = plugin.fromPosition(prepareResult.range.start); - const to = plugin.fromPosition(prepareResult.range.end); + const from = safeLspPositionToOffset( + view.state.doc, + prepareResult.range.start, + ); + const to = safeLspPositionToOffset( + view.state.doc, + prepareResult.range.end, + ); initialValue = view.state.sliceDoc(from, to); } } @@ -148,19 +161,11 @@ async function performRename(view: EditorView): Promise { return true; } -function lspPositionToOffset( - doc: { line: (n: number) => { from: number } }, - pos: lsp.Position, -): number { - const line = doc.line(pos.line + 1); - return line.from + pos.character; -} - async function applyChangesToFile( workspace: AcodeWorkspace, uri: string, lspChanges: LspChange[], - mapping: { mapPosition: (uri: string, pos: lsp.Position) => number }, + mapping: { mapPos: (uri: string, pos: number, assoc?: number) => number }, ): Promise { const file = workspace.getFile(uri); @@ -169,8 +174,16 @@ async function applyChangesToFile( if (view) { view.dispatch({ changes: lspChanges.map((change) => ({ - from: mapping.mapPosition(uri, change.range.start), - to: mapping.mapPosition(uri, change.range.end), + from: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, change.range.start), + 1, + ), + to: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, change.range.end), + -1, + ), insert: change.newText, })), userEvent: "rename", @@ -189,8 +202,8 @@ async function applyChangesToFile( const doc = displayedView.state.doc; displayedView.dispatch({ changes: lspChanges.map((change) => ({ - from: lspPositionToOffset(doc, change.range.start), - to: lspPositionToOffset(doc, change.range.end), + from: safeLspPositionToOffset(doc, change.range.start), + to: safeLspPositionToOffset(doc, change.range.end), insert: change.newText, })), userEvent: "rename", diff --git a/src/cm/lsp/serverLauncher.ts b/src/cm/lsp/serverLauncher.ts index ea39576d5a..b6c3058111 100644 --- a/src/cm/lsp/serverLauncher.ts +++ b/src/cm/lsp/serverLauncher.ts @@ -781,7 +781,7 @@ export async function installServer( icon: "zap", loading: () => loading, title: displayLabel, - message: `${actionLabel}ing ${displayLabel}...`, + message: `${isUpdate ? "Updating" : "Installing"} ${displayLabel}...`, }); await runForegroundCommand(command); resetInstallState(server.id); diff --git a/src/cm/lsp/servers/luau.ts b/src/cm/lsp/servers/luau.ts index 4d401ff4dc..f83113f098 100644 --- a/src/cm/lsp/servers/luau.ts +++ b/src/cm/lsp/servers/luau.ts @@ -164,7 +164,7 @@ esac && apk add --no-cache gcompat libstdc++ && TMP_DIR="$(mktemp -d)" && cleanu const loadingDialog = loader.create( label, - `${actionLabel}ing ${label}...`, + `${mode === "update" ? "Updating" : "Installing"} ${label}...`, ); try { loadingDialog.show(); diff --git a/src/cm/lsp/tooltipExtensions.ts b/src/cm/lsp/tooltipExtensions.ts index 2a9a157ea0..7332d12a2c 100644 --- a/src/cm/lsp/tooltipExtensions.ts +++ b/src/cm/lsp/tooltipExtensions.ts @@ -40,6 +40,7 @@ import type { MarkupContent, } from "vscode-languageserver-types"; import { getMode, getModeForPath, type Mode } from "../modelist"; +import { safeLspPositionToOffset } from "./positionUtils"; interface LspClientInternals { config?: { @@ -258,14 +259,6 @@ async function loadHoverContentLanguages(contents: Hover["contents"]): Promise"']/g, (match) => { switch (match) { @@ -401,8 +394,14 @@ function lspTooltipSource( let to = pos; for (const { result } of results) { if (!result.range) continue; - from = Math.min(from, fromPosition(view.state.doc, result.range.start)); - to = Math.max(to, fromPosition(view.state.doc, result.range.end)); + from = Math.min( + from, + safeLspPositionToOffset(view.state.doc, result.range.start), + ); + to = Math.max( + to, + safeLspPositionToOffset(view.state.doc, result.range.end), + ); } return { diff --git a/src/cm/lsp/types.ts b/src/cm/lsp/types.ts index ad47e72df0..6f39038a42 100644 --- a/src/cm/lsp/types.ts +++ b/src/cm/lsp/types.ts @@ -631,13 +631,8 @@ export interface LSPPluginAPI { client: LSPClient & { sync: () => void; connected?: boolean }; /** Convert a document offset to an LSP Position */ toPosition: (offset: number) => { line: number; character: number }; - /** Convert an LSP Position to a document offset */ - fromPosition: ( - pos: { line: number; character: number }, - doc?: unknown, - ) => number; /** The currently synced document state */ - syncedDoc: { length: number }; + syncedDoc: Text; /** Pending changes that haven't been synced yet */ unsyncedChanges: { mapPos: (pos: number, assoc?: number, mode?: MapMode) => number | null; diff --git a/src/cm/mainEditorExtensions.ts b/src/cm/mainEditorExtensions.ts index e445bf9b40..f825898d4a 100644 --- a/src/cm/mainEditorExtensions.ts +++ b/src/cm/mainEditorExtensions.ts @@ -1,5 +1,6 @@ import type { Extension } from "@codemirror/state"; import { EditorView } from "@codemirror/view"; +import searchMatchHighlighter from "./searchMatchHighlighter"; interface MainEditorExtensionOptions { emmetExtensions?: Extension[]; @@ -51,7 +52,9 @@ export function createMainEditorExtensions( pushExtension(extensions, options.multiCursorSelectionExtension); pushExtension(extensions, options.touchSelectionUpdateExtension); pushExtension(extensions, options.quickToolsModifierInputExtension); - pushExtension(extensions, options.searchExtension); + if (options.searchExtension != null) { + extensions.push(options.searchExtension, searchMatchHighlighter); + } pushExtension(extensions, options.readOnlyExtension); if (options.optionExtensions?.length) { diff --git a/src/cm/searchMatchHighlighter.ts b/src/cm/searchMatchHighlighter.ts new file mode 100644 index 0000000000..70449c54ab --- /dev/null +++ b/src/cm/searchMatchHighlighter.ts @@ -0,0 +1,140 @@ +import { + getSearchQuery, + searchPanelOpen, + type SearchQuery, +} from "@codemirror/search"; +import { RangeSetBuilder, type EditorState } from "@codemirror/state"; +import type { DecorationSet, ViewUpdate } from "@codemirror/view"; +import { Decoration, EditorView, ViewPlugin } from "@codemirror/view"; + +interface DocRange { + from: number; + to: number; +} + +// Keep the same regular-expression look-around used by CodeMirror's built-in +// search highlighter. Literal searches only need enough context to catch a +// match that crosses a viewport boundary. +const REGEXP_SCAN_MARGIN = 250; + +const matchMark = Decoration.mark({ class: "cm-searchMatch" }); +const selectedMatchMark = Decoration.mark({ + class: "cm-searchMatch cm-searchMatch-selected", +}); + +function scanMargin(query: SearchQuery): number { + return query.regexp ? REGEXP_SCAN_MARGIN : query.search.length; +} + +function sameHighlightQuery(left: SearchQuery, right: SearchQuery): boolean { + return ( + left.search === right.search && + left.caseSensitive === right.caseSensitive && + left.literal === right.literal && + left.regexp === right.regexp && + left.wholeWord === right.wholeWord && + left.test === right.test + ); +} + +function scanRanges( + visibleRanges: readonly DocRange[], + margin: number, + docLength: number, +): DocRange[] { + const ranges: DocRange[] = []; + + for (const visible of visibleRanges) { + const from = Math.max(0, visible.from - margin); + const to = Math.min(docLength, visible.to + margin); + const previous = ranges[ranges.length - 1]; + + if (previous && from <= previous.to) { + previous.to = Math.max(previous.to, to); + } else { + ranges.push({ from, to }); + } + } + + return ranges; +} + +/** + * Builds search marks only around rendered document ranges. Keeping this + * separate from the view plugin makes the viewport-only behavior testable. + */ +export function buildSearchMatchDecorations( + state: EditorState, + visibleRanges: readonly DocRange[], +): DecorationSet { + const query = getSearchQuery(state); + if (!query.search || !query.valid || searchPanelOpen(state)) { + return Decoration.none; + } + + const builder = new RangeSetBuilder(); + const ranges = scanRanges(visibleRanges, scanMargin(query), state.doc.length); + const selectedRanges = new Map>(); + for (const range of state.selection.ranges) { + let ends = selectedRanges.get(range.from); + if (!ends) selectedRanges.set(range.from, (ends = new Set())); + ends.add(range.to); + } + + for (const { from, to } of ranges) { + const cursor = query.getCursor(state, from, to); + for (let result = cursor.next(); !result.done; result = cursor.next()) { + const match = result.value; + const selected = selectedRanges.get(match.from)?.has(match.to) === true; + builder.add( + match.from, + match.to, + selected ? selectedMatchMark : matchMark, + ); + } + } + + return builder.finish(); +} + +class SearchMatchHighlighterPlugin { + decorations: DecorationSet; + + constructor(view: EditorView) { + this.decorations = buildSearchMatchDecorations( + view.state, + view.visibleRanges, + ); + } + + update(update: ViewUpdate): void { + const queryChanged = !sameHighlightQuery( + getSearchQuery(update.state), + getSearchQuery(update.startState), + ); + const panelChanged = + searchPanelOpen(update.state) !== searchPanelOpen(update.startState); + + if ( + queryChanged || + panelChanged || + update.docChanged || + update.selectionSet || + update.viewportChanged + ) { + this.decorations = buildSearchMatchDecorations( + update.state, + update.view.visibleRanges, + ); + } + } +} + +export const searchMatchHighlighter = ViewPlugin.fromClass( + SearchMatchHighlighterPlugin, + { + decorations: (plugin) => plugin.decorations, + }, +); + +export default searchMatchHighlighter; diff --git a/src/cm/selectionMenuUtils.ts b/src/cm/selectionMenuUtils.ts index 414dbfa836..65abc0ceda 100644 --- a/src/cm/selectionMenuUtils.ts +++ b/src/cm/selectionMenuUtils.ts @@ -1,4 +1,5 @@ export interface SelectionMenuItem { + id?: string; mode?: "selected" | "all"; readOnly?: boolean; } @@ -8,6 +9,70 @@ export interface SelectionMenuFilterOptions { hasSelection: boolean; } +const POINTER_MOVE_TOLERANCE = 8; + +/** Preserve editor focus during a pointer press and activate on release. */ +export function bindSelectionMenuButton( + button: HTMLButtonElement, + onActivate: (event: Event) => void, +): void { + let activePointerId: number | null = null; + let pointerStart: { x: number; y: number } | null = null; + + const stopEvent = (event: Event) => { + event.preventDefault(); + event.stopPropagation(); + }; + const clearPointer = () => { + activePointerId = null; + pointerStart = null; + button.classList.remove("is-pressed"); + }; + const pointerMoved = (event: PointerEvent) => { + if (!pointerStart) return false; + const xDistance = event.clientX - pointerStart.x; + const yDistance = event.clientY - pointerStart.y; + return ( + xDistance ** 2 + yDistance ** 2 > + POINTER_MOVE_TOLERANCE ** 2 + ); + }; + + button.addEventListener("pointerdown", (event) => { + if (event.isPrimary === false) return; + if (event.pointerType === "mouse" && event.button !== 0) return; + activePointerId = event.pointerId; + pointerStart = { x: event.clientX, y: event.clientY }; + button.classList.add("is-pressed"); + stopEvent(event); + try { + button.setPointerCapture?.(event.pointerId); + } catch { + // Pointer capture is optional in older Android WebViews. + } + }); + + button.addEventListener("pointermove", (event) => { + if (event.pointerId !== activePointerId || !pointerStart) return; + if (pointerMoved(event)) clearPointer(); + }); + + button.addEventListener("pointerup", (event) => { + if (event.pointerId !== activePointerId || !pointerStart) return; + const moved = pointerMoved(event); + clearPointer(); + stopEvent(event); + if (!moved) onActivate(event); + }); + + button.addEventListener("pointercancel", clearPointer); + button.addEventListener("lostpointercapture", clearPointer); + button.addEventListener("click", (event) => { + stopEvent(event); + if (event.detail === 0) onActivate(event); + }); +} + /** Filter selection actions using Acode's read-only and selection rules. */ export function filterSelectionMenuItems( items: readonly T[], @@ -23,3 +88,29 @@ export function filterSelectionMenuItems( return true; }); } + +const SELECTION_PRIMARY_ACTIONS = new Set([ + "copy", + "cut", + "paste", + "select-all", +]); +const CARET_PRIMARY_ACTIONS = new Set(["paste", "select-all"]); + +/** Keep the touch toolbar compact by moving secondary/plugin actions into More. */ +export function partitionSelectionMenuItems( + items: readonly T[], + options: Pick, +): { primary: T[]; overflow: T[] } { + const primaryIds = options.hasSelection + ? SELECTION_PRIMARY_ACTIONS + : CARET_PRIMARY_ACTIONS; + const primary: T[] = []; + const overflow: T[] = []; + + for (const item of items) { + (primaryIds.has(item.id ?? "") ? primary : overflow).push(item); + } + + return { primary, overflow }; +} diff --git a/src/cm/themes/catppuccin.js b/src/cm/themes/catppuccin.js index d83e90f3a7..6b1e9a5330 100644 --- a/src/cm/themes/catppuccin.js +++ b/src/cm/themes/catppuccin.js @@ -113,7 +113,8 @@ function createConfig(name, caption, palette) { cursor: palette.rosewater, dropdownBackground: palette.mantle, dropdownBorder: palette.overlay0, - activeLine: palette.surface0, + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: `${palette.surface0}40`, lineNumber: palette.subtext0, lineNumberActive: palette.mauve, matchingBracket: `${palette.surface2}47`, diff --git a/src/cm/themes/tokyoNight.js b/src/cm/themes/tokyoNight.js index efc55889c4..3ec2548e70 100644 --- a/src/cm/themes/tokyoNight.js +++ b/src/cm/themes/tokyoNight.js @@ -11,7 +11,8 @@ export const config = { cursor: "#c0caf5", dropdownBackground: "#1a1b26", dropdownBorder: "#414868", - activeLine: "#24283b", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#6a83ce20", lineNumber: "#414868", lineNumberActive: "#a9b1d6", matchingBracket: "#24283b", diff --git a/src/cm/themes/tomorrowNight.js b/src/cm/themes/tomorrowNight.js index ef09700e7c..0ff0d39c0b 100644 --- a/src/cm/themes/tomorrowNight.js +++ b/src/cm/themes/tomorrowNight.js @@ -12,7 +12,8 @@ export const config = { cursor: "#AEAFAD", dropdownBackground: "#1D1F21", dropdownBorder: "#4B4E55", - activeLine: "#282A2E", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#75778920", lineNumber: "#4B4E55", lineNumberActive: "#C5C8C6", matchingBracket: "#282A2E", diff --git a/src/cm/themes/tomorrowNightBright.js b/src/cm/themes/tomorrowNightBright.js index 7fb6b25bfd..26bfacf9de 100644 --- a/src/cm/themes/tomorrowNightBright.js +++ b/src/cm/themes/tomorrowNightBright.js @@ -12,7 +12,8 @@ export const config = { cursor: "#9F9F9F", dropdownBackground: "#000000", dropdownBorder: "#343434", - activeLine: "#2A2A2A", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#D2D2D233", lineNumber: "#343434", lineNumberActive: "#DEDEDE", matchingBracket: "#2A2A2A", diff --git a/src/cm/themes/vscodeDark.js b/src/cm/themes/vscodeDark.js index 2045621f5f..8790b32b19 100644 --- a/src/cm/themes/vscodeDark.js +++ b/src/cm/themes/vscodeDark.js @@ -12,7 +12,8 @@ export const config = { cursor: "#c6c6c6", dropdownBackground: "#202020", dropdownBorder: "#454545", - activeLine: "#282828", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#67676720", lineNumber: "#6e7681", lineNumberActive: "#cccccc", matchingBracket: "#add6ff26", diff --git a/src/cm/touchSelectionMenu.js b/src/cm/touchSelectionMenu.js index f99badae35..b017acb1fb 100644 --- a/src/cm/touchSelectionMenu.js +++ b/src/cm/touchSelectionMenu.js @@ -1,3 +1,4 @@ +import { LSPPlugin } from "@codemirror/lsp-client"; import { EditorSelection } from "@codemirror/state"; import { focusEditorIfEditable, @@ -5,8 +6,13 @@ import { resolveReadOnlyContextSelection, shouldCommitReadOnlyTap, } from "cm/editorReadOnly"; -import { filterSelectionMenuItems } from "cm/selectionMenuUtils"; +import { + bindSelectionMenuButton, + filterSelectionMenuItems, + partitionSelectionMenuItems, +} from "cm/selectionMenuUtils"; import selectionMenu from "lib/selectionMenu"; +import { animate } from "motion"; export { filterSelectionMenuItems } from "cm/selectionMenuUtils"; @@ -18,6 +24,7 @@ const MENU_SHOW_DELAY = 120; const MENU_CARET_GAP = 10; const MENU_SELECTION_GAP = 12; const MENU_HANDLE_CLEARANCE = 28; +const OVERFLOW_GRID_THRESHOLD = 10; const TAP_MAX_COLUMN_DELTA = 2; const TAP_MAX_POS_DELTA = 2; @@ -127,6 +134,44 @@ function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); } +function hasCodeActionProvider(view) { + return LSPPlugin.getAll(view, "codeAction").some( + (plugin) => !!plugin.client.serverCapabilities?.codeActionProvider, + ); +} + +function hasLspActions(view) { + const capabilities = [ + ["definition", "definitionProvider"], + ["declaration", "declarationProvider"], + ["implementation", "implementationProvider"], + ["typeDefinition", "typeDefinitionProvider"], + ["references", "referencesProvider"], + ]; + if ( + capabilities.some(([feature, capability]) => + LSPPlugin.getAll(view, feature).some( + (plugin) => !!plugin.client.serverCapabilities?.[capability], + ), + ) + ) { + return true; + } + return ( + !view.state.readOnly && + LSPPlugin.getAll(view, "rename").some( + (plugin) => !!plugin.client.serverCapabilities?.renameProvider, + ) + ); +} + +function animationsDisabled() { + return ( + document.body.classList.contains("no-animation") || + globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches + ); +} + export default function createTouchSelectionMenu(view, options = {}) { return new TouchSelectionMenuController(view, options); } @@ -149,6 +194,12 @@ class TouchSelectionMenuController { #handlingMenuAction = false; #menuShowTimer = null; #tooltipObserver = null; + #dismissedSelection = null; + #renderedMenuKey = ""; + #menuAnchor = null; + #menuAnimation = null; + #viewAnimations = []; + #overflowExpanded = false; constructor(view, options = {}) { this.#view = view; @@ -226,6 +277,7 @@ class TouchSelectionMenuController { this.#pointerSelectionSession = null; this.#readOnlyTapSession = null; this.#pendingPointerSelectionClick = null; + this.#dismissedSelection = null; this.#menuRequested = false; this.#isPointerInteracting = false; this.#isScrolling = false; @@ -238,6 +290,7 @@ class TouchSelectionMenuController { setSelection(value) { if (!this.#enabled) return; if (value) { + this.#dismissedSelection = null; this.#menuRequested = true; } this.onStateChanged({ @@ -254,6 +307,7 @@ class TouchSelectionMenuController { this.#hideMenu(); return; } + this.#dismissedSelection = null; this.#scheduleMenuShow(MENU_SHOW_DELAY); } @@ -279,6 +333,12 @@ class TouchSelectionMenuController { onStateChanged(meta = {}) { if (!this.#enabled) return; if (meta.selectionChanged) this.#cancelReadOnlyTap(); + if ( + meta.selectionChanged && + this.#dismissedSelection !== this.#selectionSignature() + ) { + this.#dismissedSelection = null; + } if (this.#handlingMenuAction) return; if (!this.#shouldShowMenu()) { if (!this.#hasSelection()) { @@ -298,6 +358,7 @@ class TouchSelectionMenuController { this.#pointerSelectionSession = null; this.#readOnlyTapSession = null; this.#pendingPointerSelectionClick = null; + this.#dismissedSelection = null; this.#menuRequested = false; this.#isPointerInteracting = false; this.#isScrolling = false; @@ -321,6 +382,7 @@ class TouchSelectionMenuController { } event.preventDefault(); event.stopPropagation(); + this.#dismissedSelection = null; this.#menuRequested = true; this.#scheduleMenuShow(MENU_SHOW_DELAY); }; @@ -337,6 +399,7 @@ class TouchSelectionMenuController { return; } if (target instanceof Node && this.#view.dom.contains(target)) { + this.#dismissedSelection = null; this.#capturePointerSelection(event); this.#captureReadOnlyTap(event); this.#isPointerInteracting = true; @@ -549,6 +612,12 @@ class TouchSelectionMenuController { #shouldShowMenu() { if (this.#isScrolling || this.#isPointerInteracting) return false; if (!this.#view.hasFocus && !this.#isReadOnly()) return false; + if ( + !this.#menuRequested && + this.#dismissedSelection === this.#selectionSignature() + ) { + return false; + } return this.#hasSelection() || this.#menuRequested; } @@ -616,52 +685,310 @@ class TouchSelectionMenuController { } #showMenu(anchor) { + this.#menuAnchor = anchor; const hasSelection = this.#hasSelection(); - const items = filterSelectionMenuItems(selectionMenu(), { - readOnly: this.#isReadOnly(), - hasSelection, - }); + const items = filterSelectionMenuItems( + selectionMenu({ + codeActionsAvailable: hasCodeActionProvider(this.#view), + lspActionsAvailable: hasLspActions(this.#view), + }), + { + readOnly: this.#isReadOnly(), + hasSelection, + }, + ); - this.$menu.innerHTML = ""; if (!items.length) { this.#menuRequested = false; this.#hideMenu(true); return; } - items.forEach(({ onclick, text }) => { - const $item = document.createElement("div"); - if (typeof text === "string") { - $item.textContent = text; - } else if (text instanceof Node) { - $item.append(text.cloneNode(true)); - } - let handled = false; - const runAction = (event) => { - if (handled) return; - handled = true; - event.preventDefault(); - event.stopPropagation(); - this.#handlingMenuAction = true; - try { - onclick?.(); - } finally { - this.#handlingMenuAction = false; - this.#menuRequested = false; - this.#hideMenu(); - focusEditorIfEditable(this.#view); - } - }; - $item.addEventListener("pointerdown", runAction); - $item.addEventListener("click", runAction); - this.$menu.append($item); - }); + const menuKey = `${hasSelection}:${items + .map((item) => item.id || this.#getItemLabel(item)) + .join("|")}`; + const menuChanged = menuKey !== this.#renderedMenuKey; + if (menuChanged) { + const groups = partitionSelectionMenuItems(items, { hasSelection }); + this.#renderMenu(groups.primary, groups.overflow); + this.#renderedMenuKey = menuKey; + } if (!this.$menu.isConnected) { this.#container.append(this.$menu); } + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + const isOpening = !this.#menuActive; + this.#positionMenu(anchor); + this.#menuActive = true; + this.#menuRequested = false; + if (isOpening) this.#animateMenuIn(); + } + + #renderMenu(primaryItems, overflowItems) { + for (const animation of this.#viewAnimations) animation.cancel?.(); + this.#viewAnimations = []; + this.#overflowExpanded = false; + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu.replaceChildren(); + this.$menu.setAttribute("aria-label", "Text selection actions"); + + const $primary = document.createElement("div"); + $primary.className = "cursor-menu__primary"; + $primary.setAttribute("role", "toolbar"); + for (const item of primaryItems) { + $primary.append(this.#createActionButton(item, false)); + } + + if (overflowItems.length) { + const $overflow = document.createElement("div"); + $overflow.className = "cursor-menu__overflow"; + if (overflowItems.length > OVERFLOW_GRID_THRESHOLD) { + $overflow.classList.add("cursor-menu__overflow--grid"); + } + $overflow.setAttribute("role", "toolbar"); + $overflow.setAttribute("aria-label", "More text actions"); + $overflow.hidden = true; + + const backLabel = globalThis.strings?.back || "Back"; + const $back = document.createElement("button"); + $back.type = "button"; + $back.className = "cursor-menu__action cursor-menu__back"; + $back.setAttribute("aria-label", backLabel); + $back.append(this.#createIcon("arrow_back")); + + const $overflowActions = document.createElement("div"); + $overflowActions.className = "cursor-menu__overflow-actions"; + for (const item of overflowItems) { + $overflowActions.append(this.#createActionButton(item, true)); + } + $overflow.append($back, $overflowActions); + + const moreLabel = globalThis.strings?.more || "More"; + const $more = document.createElement("button"); + $more.type = "button"; + $more.className = "cursor-menu__action cursor-menu__more"; + $more.setAttribute("aria-label", moreLabel); + $more.setAttribute("aria-expanded", "false"); + $more.append(this.#createIcon("keyboard_control")); + bindSelectionMenuButton($more, () => { + $more.setAttribute("aria-expanded", "true"); + this.#setOverflowExpanded($primary, $overflow, true); + }); + bindSelectionMenuButton($back, () => { + $more.setAttribute("aria-expanded", "false"); + this.#setOverflowExpanded($primary, $overflow, false); + }); + + $primary.append($more); + this.$menu.append($primary, $overflow); + return; + } + + this.$menu.append($primary); + } + + #createActionButton(item, isOverflow) { + const $item = document.createElement("button"); + const label = this.#getItemLabel(item); + $item.type = "button"; + $item.className = `cursor-menu__action${ + isOverflow ? " cursor-menu__overflow-action" : "" + }`; + $item.setAttribute("aria-label", label); + if (label !== "More action") $item.title = label; + + if (isOverflow) { + if (item.text instanceof Node) { + $item.append(item.text.cloneNode(true)); + } else { + $item.textContent = label; + } + } else if (item.text instanceof Node) { + $item.append(item.text.cloneNode(true)); + } else { + $item.textContent = label; + } + + let handled = false; + const runAction = (event) => { + if (handled) return; + handled = true; + event.preventDefault(); + event.stopPropagation(); + this.#clearMenuShowTimer(); + cancelAnimationFrame(this.#stateSyncRaf); + this.#stateSyncRaf = 0; + this.#handlingMenuAction = true; + try { + item.onclick?.(); + } finally { + this.#handlingMenuAction = false; + this.#menuRequested = false; + this.#dismissedSelection = this.#selectionSignature(); + this.#hideMenu(); + focusEditorIfEditable(this.#view); + } + }; + bindSelectionMenuButton($item, runAction); + return $item; + } + + #animateMenuIn() { + this.#menuAnimation?.cancel?.(); + if (animationsDisabled()) { + this.$menu.style.opacity = "1"; + this.$menu.style.transform = "none"; + return; + } + + const y = this.$menu.dataset.placement === "above" ? 3 : -3; + this.#menuAnimation = animate( + this.$menu, + { + opacity: [0, 1], + scale: [0.96, 1], + y: [y, 0], + }, + { duration: 0.14, ease: "easeOut" }, + ); + } + + #setOverflowExpanded($primary, $overflow, expanded) { + if (expanded === this.#overflowExpanded) return; + const initialRect = this.$menu.getBoundingClientRect(); + this.#menuAnimation?.cancel?.(); + this.#menuAnimation = null; + for (const animation of this.#viewAnimations) animation.cancel?.(); + this.#viewAnimations = []; + $primary.hidden = this.#overflowExpanded; + $overflow.hidden = !this.#overflowExpanded; + const outgoing = this.#overflowExpanded ? $overflow : $primary; + const incoming = expanded ? $overflow : $primary; + const direction = expanded ? 1 : -1; + for (const $view of [$primary, $overflow]) { + $view.style.opacity = ""; + $view.style.transform = ""; + $view.style.visibility = ""; + $view.style.position = ""; + $view.style.inset = ""; + $view.style.pointerEvents = ""; + $view.style.transformOrigin = ""; + } + this.#overflowExpanded = expanded; + outgoing.style.position = "absolute"; + outgoing.style.inset = "0 auto auto 0"; + outgoing.style.pointerEvents = "none"; + incoming.hidden = false; + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu.style.transform = ""; + if (this.#menuAnchor) this.#positionMenu(this.#menuAnchor); + const finalRect = this.$menu.getBoundingClientRect(); + const menuScaleX = finalRect.width + ? initialRect.width / finalRect.width + : 1; + const menuScaleY = finalRect.height + ? initialRect.height / finalRect.height + : 1; + const viewScaleX = menuScaleX ? 1 / menuScaleX : 1; + const viewScaleY = menuScaleY ? 1 / menuScaleY : 1; + this.$menu.style.transformOrigin = "left top"; + for (const $view of [outgoing, incoming]) { + $view.style.transformOrigin = "left top"; + } + + const clearMenuGeometry = () => { + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu.style.transform = ""; + this.$menu.style.transformOrigin = ""; + }; + const finish = () => { + outgoing.hidden = true; + for (const $view of [$primary, $overflow]) { + $view.style.opacity = ""; + $view.style.transform = ""; + $view.style.position = ""; + $view.style.inset = ""; + $view.style.pointerEvents = ""; + $view.style.transformOrigin = ""; + } + clearMenuGeometry(); + this.#viewAnimations = []; + }; + + if (animationsDisabled()) { + finish(); + return; + } + const outgoingAnimation = animate( + outgoing, + { + opacity: [1, 0], + x: [0, -6 * direction], + scaleX: [viewScaleX, 1], + scaleY: [viewScaleY, 1], + }, + { duration: 0.12, ease: "easeIn" }, + ); + const incomingAnimation = animate( + incoming, + { + opacity: [0, 1], + x: [6 * direction, 0], + scaleX: [viewScaleX, 1], + scaleY: [viewScaleY, 1], + }, + { duration: 0.18, ease: "easeOut" }, + ); + const animations = [outgoingAnimation, incomingAnimation]; + if ( + initialRect.width !== finalRect.width || + initialRect.height !== finalRect.height || + initialRect.left !== finalRect.left || + initialRect.top !== finalRect.top + ) { + animations.push( + animate( + this.$menu, + { + x: [initialRect.left - finalRect.left, 0], + y: [initialRect.top - finalRect.top, 0], + scaleX: [menuScaleX, 1], + scaleY: [menuScaleY, 1], + }, + { + duration: 0.18, + ease: [0.2, 0, 0, 1], + onComplete: clearMenuGeometry, + }, + ), + ); + } + this.#viewAnimations = animations; + Promise.allSettled( + animations.map((animation) => animation.finished ?? animation), + ).then(() => { + if (this.#viewAnimations !== animations) return; + finish(); + }); + } + + #positionMenu(anchor) { + if (!this.$menu.isConnected) return; const containerRect = this.#container.getBoundingClientRect(); + this.$menu.style.setProperty( + "--cursor-menu-max-width", + `${Math.max(0, containerRect.width - MENU_MARGIN * 2)}px`, + ); + this.$menu.style.setProperty( + "--cursor-menu-grid-max-height", + `${Math.max(40, Math.min(240, containerRect.height - MENU_MARGIN * 2))}px`, + ); this.$menu.style.left = "0px"; this.$menu.style.top = "0px"; this.$menu.style.visibility = "hidden"; @@ -679,10 +1006,11 @@ class TouchSelectionMenuController { containerRect.top + containerRect.height - menuRect.height - MENU_MARGIN; const fitsAbove = topAbove >= minTop; const fitsBelow = topBelow <= maxTop; + const placedAbove = fitsAbove || !fitsBelow; const clamped = clampMenuPosition( { left: preferredLeft, - top: fitsAbove || !fitsBelow ? topAbove : topBelow, + top: placedAbove ? topAbove : topBelow, width: menuRect.width, height: menuRect.height, }, @@ -698,9 +1026,29 @@ class TouchSelectionMenuController { this.$menu.style.left = `${clamped.left - containerRect.left}px`; this.$menu.style.top = `${clamped.top - containerRect.top}px`; + this.$menu.dataset.placement = placedAbove ? "above" : "below"; this.$menu.style.visibility = ""; - this.#menuActive = true; - this.#menuRequested = false; + } + + #getItemLabel(item) { + if (item.label) return item.label; + if (typeof item.text === "string" && item.text.trim()) return item.text; + if (item.text instanceof Element) { + return ( + item.text.getAttribute("aria-label") || + item.text.getAttribute("title") || + item.text.textContent?.trim() || + "More action" + ); + } + return "More action"; + } + + #createIcon(name) { + const $icon = document.createElement("span"); + $icon.className = `icon ${name}`; + $icon.setAttribute("aria-hidden", "true"); + return $icon; } #showMenuDeferred() { @@ -771,9 +1119,44 @@ class TouchSelectionMenuController { #hideMenu(force = false) { if (!force && !this.#menuActive && !this.$menu.isConnected) return; + this.#menuAnimation?.cancel?.(); + for (const animation of this.#viewAnimations) animation.cancel?.(); + this.#menuAnimation = null; + this.#viewAnimations = []; if (this.$menu.isConnected) { this.$menu.remove(); } + const overflow = this.$menu.querySelector(".cursor-menu__overflow"); + if (overflow) overflow.hidden = true; + if (overflow) { + overflow.style.opacity = ""; + overflow.style.transform = ""; + overflow.style.pointerEvents = ""; + overflow.style.position = ""; + overflow.style.inset = ""; + overflow.style.transformOrigin = ""; + } + const primary = this.$menu.querySelector(".cursor-menu__primary"); + if (primary) { + primary.hidden = false; + primary.style.opacity = ""; + primary.style.transform = ""; + primary.style.pointerEvents = ""; + primary.style.position = ""; + primary.style.inset = ""; + primary.style.transformOrigin = ""; + } + this.$menu.style.opacity = ""; + this.$menu.style.transform = ""; + this.$menu.style.transformOrigin = ""; + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu + .querySelector(".cursor-menu__more") + ?.setAttribute("aria-expanded", "false"); + this.#renderedMenuKey = ""; + this.#overflowExpanded = false; + this.#menuAnchor = null; this.#menuActive = false; } @@ -817,4 +1200,10 @@ class TouchSelectionMenuController { const selection = this.#view.state.selection.main; return selection.from !== selection.to; } + + #selectionSignature() { + return this.#view.state.selection.ranges + .map((range) => `${range.anchor}:${range.head}`) + .join("|"); + } } diff --git a/src/components/referencesPanel/utils.js b/src/components/referencesPanel/utils.js index d88a9ca84f..d02de6ca54 100644 --- a/src/components/referencesPanel/utils.js +++ b/src/components/referencesPanel/utils.js @@ -1,5 +1,5 @@ -import { EditorView } from "@codemirror/view"; import { focusEditorIfEditable } from "cm/editorReadOnly"; +import { safeLspPositionToOffset } from "cm/lsp/positionUtils"; import Sidebar from "components/sidebar"; import DOMPurify from "dompurify"; import openFile from "lib/openFile"; @@ -117,19 +117,22 @@ export async function navigateToReference(ref) { if (!editor) return; const doc = editor.state.doc; - const startLine = doc.line(ref.range.start.line + 1); - const endLine = doc.line(ref.range.end.line + 1); - const from = Math.min( - startLine.from + ref.range.start.character, - startLine.to, - ); - const to = Math.min(endLine.from + ref.range.end.character, endLine.to); + const from = safeLspPositionToOffset(doc, ref.range.start); + const to = safeLspPositionToOffset(doc, ref.range.end); - editor.dispatch({ - selection: { anchor: from, head: to }, - effects: EditorView.scrollIntoView(from, { y: "center" }), - }); - focusEditorIfEditable(editor); + if (typeof editorManager.revealRange === "function") { + editorManager.revealRange(from, to, { + y: "center", + userEvent: "select.definition", + }); + } else { + editor.dispatch({ + selection: { anchor: from, head: to }, + scrollIntoView: true, + userEvent: "select.definition", + }); + focusEditorIfEditable(editor); + } } catch (error) { console.error("Failed to navigate to reference:", error); } diff --git a/src/components/settingsPage.scss b/src/components/settingsPage.scss index bfe722e73e..e0e9f34b55 100644 --- a/src/components/settingsPage.scss +++ b/src/components/settingsPage.scss @@ -60,6 +60,11 @@ wc-page.main-settings-page { .main-settings-list>.list-item, .settings-section-card>.list-item { display: flex; + + &[hidden] { + display: none; + } + width: 100%; min-height: 64px; margin: 0; diff --git a/src/components/virtualList/index.js b/src/components/virtualList/index.js index bf7b7db4b1..c1ff5bafcf 100644 --- a/src/components/virtualList/index.js +++ b/src/components/virtualList/index.js @@ -1,6 +1,8 @@ import "./style.scss"; import tag from "html-tag-js"; +export { default as VariableVirtualList } from "./variable"; + /** * @typedef {object} VirtualListOptions * @property {number} [itemHeight=30] - Height of each item in pixels diff --git a/src/components/virtualList/style.scss b/src/components/virtualList/style.scss index 9af4e0df05..3ef86ce953 100644 --- a/src/components/virtualList/style.scss +++ b/src/components/virtualList/style.scss @@ -7,3 +7,13 @@ position: relative; min-width: 100%; } + +.variable-virtual-spacer { + width: 100%; + pointer-events: none; +} + +.variable-virtual-items { + position: relative; + min-width: 100%; +} diff --git a/src/components/virtualList/variable.js b/src/components/virtualList/variable.js new file mode 100644 index 0000000000..e2cf193c6d --- /dev/null +++ b/src/components/virtualList/variable.js @@ -0,0 +1,411 @@ +const DEFAULT_ESTIMATED_HEIGHT = 52; +const DEFAULT_OVERSCAN = 360; +const BOTTOM_THRESHOLD = 48; + +/** + * Variable-height virtual list for retained HTMLElement items. + * + * Every item stays in the model, while only the visible window and a small pixel + * overscan are mounted. ResizeObserver keeps changing item heights measured + * without losing the reader's scroll anchor. + */ +export default class VariableVirtualList { + constructor( + container, + { + estimatedHeight = DEFAULT_ESTIMATED_HEIGHT, + overscan = DEFAULT_OVERSCAN, + activeOverscan = overscan * 4, + maxOverscan = overscan * 10, + footer = null, + } = {}, + ) { + this.container = container; + this.estimatedHeight = estimatedHeight; + this.overscan = overscan; + this.activeOverscan = Math.max(overscan, activeOverscan); + this.maxOverscan = Math.max(this.activeOverscan, maxOverscan); + this.dynamicOverscan = overscan; + this.footer = footer; + this.footerHeight = 0; + this.viewportHeight = this.container.clientHeight; + this.items = []; + this.itemByElement = new WeakMap(); + this.offsets = [0]; + this.offsetsDirty = false; + this.renderedRange = { start: 0, end: 0 }; + this.frame = null; + this.stickToBottom = true; + this.lastScrollTop = this.container.scrollTop; + this.lastScrollTime = this.now(); + this.touching = false; + this.releaseTimer = null; + this.destroyed = false; + + this.topSpacer = document.createElement("div"); + this.topSpacer.className = "variable-virtual-spacer"; + this.itemContainer = document.createElement("div"); + this.itemContainer.className = "variable-virtual-items"; + this.bottomSpacer = document.createElement("div"); + this.bottomSpacer.className = "variable-virtual-spacer"; + this.container.append( + this.topSpacer, + this.itemContainer, + this.bottomSpacer, + ); + if (this.footer) this.container.append(this.footer); + + this.onScroll = () => { + this.stickToBottom = this.isNearBottom(); + const now = this.now(); + const elapsed = Math.max(8, now - this.lastScrollTime); + const distance = Math.abs(this.container.scrollTop - this.lastScrollTop); + const projectedDistance = distance * (32 / elapsed); + this.dynamicOverscan = Math.min( + this.maxOverscan, + this.activeOverscan + projectedDistance * 2, + ); + this.lastScrollTop = this.container.scrollTop; + this.lastScrollTime = now; + // Scroll rendering is intentionally synchronous. Android WebView can move + // the compositor several rows before the next animation frame. + this.render(); + this.scheduleOverscanRelease(); + }; + this.onTouchStart = () => { + this.touching = true; + this.clearOverscanRelease(); + this.dynamicOverscan = this.activeOverscan; + // Pre-paint the fling guard before compositor scrolling begins. + this.render(); + }; + this.onTouchEnd = () => { + this.touching = false; + this.scheduleOverscanRelease(); + }; + this.container.addEventListener("scroll", this.onScroll, { passive: true }); + this.container.addEventListener("touchstart", this.onTouchStart, { + passive: true, + }); + this.container.addEventListener("touchend", this.onTouchEnd, { + passive: true, + }); + this.container.addEventListener("touchcancel", this.onTouchEnd, { + passive: true, + }); + + this.resizeObserver = + typeof ResizeObserver === "function" + ? new ResizeObserver((entries) => this.onResize(entries)) + : null; + this.resizeObserver?.observe(this.container); + } + + now() { + return ( + this.container.ownerDocument.defaultView?.performance?.now?.() ?? + Date.now() + ); + } + + scheduleOverscanRelease() { + this.clearOverscanRelease(); + this.releaseTimer = this.container.ownerDocument.defaultView?.setTimeout( + () => { + this.releaseTimer = null; + if (this.destroyed || this.touching) return; + this.dynamicOverscan = this.overscan; + this.render(); + }, + 500, + ); + } + + clearOverscanRelease() { + if (this.releaseTimer === null) return; + this.container.ownerDocument.defaultView?.clearTimeout(this.releaseTimer); + this.releaseTimer = null; + } + + get length() { + return this.items.length; + } + + get mountedCount() { + return this.itemContainer.childElementCount; + } + + append(element) { + const wasNearBottom = this.isNearBottom(); + const item = { + element, + height: this.estimatedHeight, + index: this.items.length, + }; + this.items.push(item); + this.itemByElement.set(element, item); + this.offsetsDirty = true; + if (wasNearBottom || this.items.length === 1) this.stickToBottom = true; + this.scheduleRender(); + } + + clear() { + this.items = []; + this.itemByElement = new WeakMap(); + this.offsets = [0]; + this.offsetsDirty = false; + this.renderedRange = { start: 0, end: 0 }; + this.stickToBottom = true; + this.dynamicOverscan = this.overscan; + this.topSpacer.style.height = "0px"; + this.bottomSpacer.style.height = "0px"; + this.itemContainer.replaceChildren(); + this.container.scrollTop = 0; + this.footerHeight = this.getFooterHeight(); + this.observeResizeTargets(); + } + + invalidate() { + this.scheduleRender(); + } + + scrollToBottom() { + this.stickToBottom = true; + this.scheduleRender(); + } + + scheduleRender() { + if (this.frame !== null || this.destroyed) return; + this.frame = requestAnimationFrame(() => { + this.frame = null; + this.render(); + }); + } + + rebuildOffsets() { + if (!this.offsetsDirty) return; + + const offsets = new Array(this.items.length + 1); + offsets[0] = 0; + for (let index = 0; index < this.items.length; index++) { + offsets[index + 1] = offsets[index] + this.items[index].height; + } + this.offsets = offsets; + this.offsetsDirty = false; + } + + findIndexAt(offset) { + let low = 0; + let high = this.items.length; + while (low < high) { + const middle = Math.floor((low + high + 1) / 2); + if (this.offsets[middle] <= offset) low = middle; + else high = middle - 1; + } + return Math.min(low, Math.max(0, this.items.length - 1)); + } + + getFooterHeight() { + if (!this.footer) return 0; + return Math.ceil( + this.footer.getBoundingClientRect().height || + this.footer.offsetHeight || + 0, + ); + } + + observeResizeTargets() { + if (!this.resizeObserver) return; + this.resizeObserver.disconnect(); + this.resizeObserver.observe(this.container); + for (const element of this.itemContainer.children) { + this.resizeObserver.observe(element); + } + if (this.footer) this.resizeObserver.observe(this.footer); + } + + render() { + if (this.destroyed) return; + this.rebuildOffsets(); + if (!this.items.length) { + this.footerHeight = this.getFooterHeight(); + this.itemContainer.replaceChildren(); + this.topSpacer.style.height = "0px"; + this.bottomSpacer.style.height = "0px"; + this.renderedRange = { start: 0, end: 0 }; + this.observeResizeTargets(); + return; + } + + const viewportHeight = Math.max( + 1, + this.container.clientHeight || window.innerHeight, + ); + this.viewportHeight = viewportHeight; + const totalHeight = this.offsets[this.items.length]; + this.footerHeight = this.getFooterHeight(); + const targetScrollTop = this.stickToBottom + ? Math.max(0, totalHeight + this.footerHeight - viewportHeight) + : this.container.scrollTop; + const start = this.findIndexAt( + Math.max(0, targetScrollTop - this.dynamicOverscan), + ); + const end = Math.min( + this.items.length, + this.findIndexAt( + targetScrollTop + viewportHeight + this.dynamicOverscan, + ) + 1, + ); + + this.updateMountedRange(start, end); + this.observeResizeTargets(); + this.topSpacer.style.height = `${this.offsets[start]}px`; + this.bottomSpacer.style.height = `${Math.max( + 0, + totalHeight - this.offsets[end], + )}px`; + this.renderedRange = { start, end }; + + if (this.stickToBottom) { + this.container.scrollTop = Math.max( + 0, + this.container.scrollHeight - viewportHeight, + ); + } + if (!this.resizeObserver) this.measureMountedItems(); + } + + updateMountedRange(start, end) { + let oldStart = this.renderedRange.start; + let oldEnd = this.renderedRange.end; + const rangesOverlap = oldStart < end && start < oldEnd; + + if (!this.itemContainer.childElementCount || !rangesOverlap) { + const fragment = document.createDocumentFragment(); + for (let index = start; index < end; index++) { + fragment.append(this.items[index].element); + } + this.itemContainer.replaceChildren(fragment); + return; + } + + while (oldStart < start) { + this.itemContainer.firstElementChild?.remove(); + oldStart++; + } + while (oldEnd > end) { + this.itemContainer.lastElementChild?.remove(); + oldEnd--; + } + + if (start < oldStart) { + const leading = document.createDocumentFragment(); + for (let index = start; index < oldStart; index++) { + leading.append(this.items[index].element); + } + this.itemContainer.insertBefore(leading, this.itemContainer.firstChild); + } + if (end > oldEnd) { + const trailing = document.createDocumentFragment(); + for (let index = oldEnd; index < end; index++) { + trailing.append(this.items[index].element); + } + this.itemContainer.append(trailing); + } + } + + measureMountedItems() { + for (const element of this.itemContainer.children) { + const item = this.itemByElement.get(element); + if (item) this.updateHeight(item, element.getBoundingClientRect().height); + } + } + + onResize(entries) { + const wasNearBottom = this.stickToBottom || this.isNearBottom(); + let footerChanged = false; + let viewportChanged = false; + for (const entry of entries) { + if (entry.target === this.container) { + const borderBox = Array.isArray(entry.borderBoxSize) + ? entry.borderBoxSize[0] + : entry.borderBoxSize; + const height = Math.ceil( + borderBox?.blockSize || + entry.contentRect?.height || + this.container.clientHeight, + ); + viewportChanged = Math.abs(height - this.viewportHeight) >= 1; + this.viewportHeight = height; + continue; + } + if (entry.target === this.footer) { + const borderBox = Array.isArray(entry.borderBoxSize) + ? entry.borderBoxSize[0] + : entry.borderBoxSize; + const height = Math.ceil( + borderBox?.blockSize || + entry.contentRect?.height || + this.getFooterHeight(), + ); + footerChanged = Math.abs(height - this.footerHeight) >= 1; + this.footerHeight = height; + continue; + } + const item = this.itemByElement.get(entry.target); + if (!item) continue; + const borderBox = Array.isArray(entry.borderBoxSize) + ? entry.borderBoxSize[0] + : entry.borderBoxSize; + this.updateHeight( + item, + borderBox?.blockSize || + entry.contentRect?.height || + entry.target.offsetHeight, + ); + } + if (wasNearBottom) this.stickToBottom = true; + if (viewportChanged || (wasNearBottom && footerChanged)) { + this.scheduleRender(); + } + } + + updateHeight(item, measuredHeight) { + const height = Math.max(1, Math.ceil(measuredHeight || 0)); + if (Math.abs(height - item.height) < 1) return; + + const delta = height - item.height; + item.height = height; + this.offsetsDirty = true; + if (!this.stickToBottom && item.index < this.renderedRange.start) { + this.container.scrollTop += delta; + } + this.scheduleRender(); + } + + isNearBottom() { + if (!this.items.length) return true; + return ( + this.container.scrollHeight - + this.container.scrollTop - + this.container.clientHeight <= + BOTTOM_THRESHOLD + ); + } + + destroy() { + this.destroyed = true; + if (this.frame !== null) cancelAnimationFrame(this.frame); + this.frame = null; + this.clearOverscanRelease(); + this.resizeObserver?.disconnect(); + this.container.removeEventListener("scroll", this.onScroll); + this.container.removeEventListener("touchstart", this.onTouchStart); + this.container.removeEventListener("touchend", this.onTouchEnd); + this.container.removeEventListener("touchcancel", this.onTouchEnd); + this.topSpacer.remove(); + this.itemContainer.remove(); + this.bottomSpacer.remove(); + this.items = []; + } +} diff --git a/src/dialogs/confirm.js b/src/dialogs/confirm.js index d9d187a0cf..2145c22ba2 100644 --- a/src/dialogs/confirm.js +++ b/src/dialogs/confirm.js @@ -10,7 +10,7 @@ let nextConfirmId = 0; * @param {string} titleText Title text * @param {string} [message] Alert message * @param {boolean} [isHTML] Whether the message is HTML - * @param {{checkboxText?: string, returnState?: boolean, signal?: AbortSignal}} [options] + * @param {{checkboxText?: string, returnState?: boolean, signal?: AbortSignal, direction?: "ltr" | "rtl", aboveOverlay?: boolean}} [options] * @returns {Promise} */ function confirm(titleText, message, isHTML, options = {}) { @@ -59,7 +59,8 @@ function confirm(titleText, message, isHTML, options = {}) { onclick: cancel, }); const confirmDiv = tag("div", { - className: "prompt confirm", + className: `prompt confirm${options.aboveOverlay ? " above-overlay" : ""}`, + dir: options.direction, children: [ titleSpan, messageSpan, diff --git a/src/dialogs/loader.js b/src/dialogs/loader.js index e7a34cea40..dfb98946fe 100644 --- a/src/dialogs/loader.js +++ b/src/dialogs/loader.js @@ -6,14 +6,15 @@ import restoreTheme from "lib/restoreTheme"; let loaderIsImmortal = false; let onCancelCallback = null; +let cancelButtonTimeout = null; let $currentDialog = null; let $currentMask = null; const titleLoaderId = "__title-loader"; /** * @typedef {object} LoaderOptions - * @property {number} timeout Timeout in milliseconds after which the loader will be shown - * @property {function():void} oncancel Callback function to be called when the loader is shown + * @property {number} timeout Delay before the cancel button is shown, in milliseconds + * @property {function():void} oncancel Callback invoked only when the user cancels */ /** @@ -64,19 +65,21 @@ function create(titleText, message = "", options = {}) { ); - const { timeout, oncancel } = options; - if (typeof oncancel === "function") { - onCancelCallback = oncancel; - } + clearTimeout(cancelButtonTimeout); + cancelButtonTimeout = null; + onCancelCallback = + typeof options.oncancel === "function" ? options.oncancel : null; - if (typeof timeout === "number") { - setTimeout(() => { + if (typeof options.timeout === "number") { + cancelButtonTimeout = setTimeout(() => { + cancelButtonTimeout = null; + if (!$dialog.isConnected) return; $dialog.append(
- +
, ); - }, timeout); + }, options.timeout); } if (!$oldLoader) { @@ -98,6 +101,13 @@ function create(titleText, message = "", options = {}) { }; } +function cancel() { + const callback = onCancelCallback; + onCancelCallback = null; + destroy(); + callback?.(); +} + function createTitleLoader() { const $titleLoader = tag.get(`#${titleLoaderId}`) || ( @@ -116,6 +126,9 @@ function createTitleLoader() { function destroy() { const loaderDiv = tag.get("#__loader"); const mask = tag.get("#__loader-mask"); + clearTimeout(cancelButtonTimeout); + cancelButtonTimeout = null; + onCancelCallback = null; restoreTheme(); if (!loaderDiv && !mask) { @@ -128,7 +141,6 @@ function destroy() { actionStack.unfreeze(); if (loaderDiv?.isConnected) loaderDiv.remove(); if (mask?.isConnected) mask.remove(); - onCancelCallback?.(); }, 300); } diff --git a/src/dialogs/style.scss b/src/dialogs/style.scss index 91fe9ab802..0380b5c0d5 100644 --- a/src/dialogs/style.scss +++ b/src/dialogs/style.scss @@ -49,6 +49,14 @@ z-index: 113; } + &.above-overlay { + z-index: 1001; + + & + .mask { + z-index: 1000; + } + } + &.multi { textarea:not(:first-of-type) { margin-top: 20px; diff --git a/src/fileSystem/sftp.js b/src/fileSystem/sftp.js index 41bff24af7..803be8af45 100644 --- a/src/fileSystem/sftp.js +++ b/src/fileSystem/sftp.js @@ -407,6 +407,23 @@ class SftpClient { } } + /** + * Tests a profile once without the normal remote-filesystem retry policy. + * @param {string} requestID Native request ID used for cancellation + */ + testConnection(requestID) { + return new Promise((resolve, reject) => { + sftp.testProfile(this.#profileID, requestID, 10000, resolve, reject); + }); + } + + /** Cancel an in-flight profile test. */ + cancelConnection(requestID) { + return new Promise((resolve) => { + sftp.cancelConnection(requestID, resolve, resolve); + }); + } + async #connectWithRetry() { const attempts = settings.value.retryRemoteFsAfterFail ? this.#MAX_TRY + 1 diff --git a/src/handlers/intent.js b/src/handlers/intent.js index fc5f5b9cb1..78c0009ab6 100644 --- a/src/handlers/intent.js +++ b/src/handlers/intent.js @@ -17,11 +17,14 @@ const pendingIntents = []; * @param {Intent} intent */ export default async function HandleIntent(intent = {}) { - const type = intent.action.split(".").slice(-1)[0]; + const type = intent.action?.split(".").slice(-1)[0]; if (["SEND", "VIEW", "EDIT"].includes(type)) { /**@type {string} */ - const url = intent.fileUri || intent.data; + const url = + intent.fileUri || + intent.data || + intent.extras?.["android.intent.extra.STREAM"]; if (!url) return; if (url.startsWith("acode://")) { @@ -72,19 +75,19 @@ export default async function HandleIntent(intent = {}) { return; } + const options = { + mode: "single", + render: true, + persistInSession: false, + }; + if (sessionStorage.getItem("isfilesRestored") === "true") { - await openFile(url, { - mode: "single", - render: true, - }); + await openFile(url, options); } else { // Store the intent for later processing when files are restored pendingIntents.push({ url, - options: { - mode: "single", - render: true, - }, + options, }); } } diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json index e96e78e135..f593714cca 100644 --- a/src/lang/ar-ye.json +++ b/src/lang/ar-ye.json @@ -842,5 +842,37 @@ "confirm app icon reward": "هل تريد مشاهدة إعلان بمكافأة لتطبيق أيقونة التطبيق هذه؟", "rewarded ad unavailable": "الإعلانات بمكافأة غير متاحة الآن. يُرجى المحاولة مرة أخرى.", "rewarded ad failed": "تعذر إكمال الإعلان. يُرجى المحاولة مرة أخرى.", - "rewarded ad incomplete": "شاهد الإعلان حتى النهاية للحصول على المكافأة." + "rewarded ad incomplete": "شاهد الإعلان حتى النهاية للحصول على المكافأة.", + "plugin-review:dialog-label": "تقييمات الإضافة", + "plugin-review:account-check-failed": "تعذّر التحقق من حسابك. حاول مرة أخرى.", + "plugin-review:sign-in": "سجّل الدخول لكتابة تقييم", + "plugin-review:edit": "عدّل تقييمك", + "plugin-review:add": "أضف تقييمًا...", + "plugin-review:placeholder": "شارك تجربتك...", + "plugin-review:input-label": "تقييم الإضافة", + "plugin-review:vote-group-label": "التصويت", + "plugin-review:thumbs-up": "أعجبني", + "plugin-review:thumbs-down": "لم يعجبني", + "plugin-review:delete": "حذف التقييم", + "plugin-review:load-failed": "تعذّر تحميل التقييمات.", + "plugin-review:retry": "إعادة المحاولة", + "plugin-review:empty-title": "لا توجد تقييمات بعد", + "plugin-review:empty-description": "كن أول من يشارك تجربته.", + "plugin-review:yours": "تقييمك", + "plugin-review:community": "تقييمات المجتمع", + "plugin-review:no-other-reviews": "لا توجد تقييمات أخرى بعد.", + "plugin-review:login-incomplete": "لم يكتمل تسجيل الدخول.", + "plugin-review:sign-in-failed": "تعذّر تسجيل الدخول.", + "plugin-review:session-expired-review": "انتهت جلستك. سجّل الدخول مجددًا لكتابة تقييم.", + "plugin-review:save-failed": "تعذّر حفظ التقييم.", + "plugin-review:delete-confirmation": "هل تريد حذف تقييمك؟ لا يمكن التراجع عن هذا الإجراء.", + "plugin-review:session-expired-continue": "انتهت جلستك. سجّل الدخول مجددًا للمتابعة.", + "plugin-review:delete-failed": "تعذّر حذف التقييم.", + "plugin-review:you": "أنت", + "plugin-review:edit-action": "تعديل التقييم", + "plugin-review:recommended": "أوصى بهذه الإضافة", + "plugin-review:error-max-length": "يجب ألا يتجاوز التقييم {max} حرفًا.", + "plugin-review:error-downvote-comment": "أخبر المطوّر بما يمكن تحسينه.", + "plugin-review:error-empty": "أضف تعليقًا أو اختر «أعجبني».", + "plugin-review:unrated": "غير مقيّم" } diff --git a/src/lang/be-by.json b/src/lang/be-by.json index 6cddef6f07..14562075a7 100644 --- a/src/lang/be-by.json +++ b/src/lang/be-by.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Паглядзець рэкламу з узнагародай, каб ужыць гэты значок праграмы?", "rewarded ad unavailable": "Рэклама з узнагародай зараз недаступная. Паспрабуйце яшчэ раз.", "rewarded ad failed": "Не ўдалося завяршыць прагляд рэкламы. Паспрабуйце яшчэ раз.", - "rewarded ad incomplete": "Даглядзіце рэкламу да канца, каб атрымаць узнагароду." + "rewarded ad incomplete": "Даглядзіце рэкламу да канца, каб атрымаць узнагароду.", + "plugin-review:dialog-label": "Водгукі пра плагін", + "plugin-review:account-check-failed": "Не ўдалося праверыць ваш уліковы запіс. Паспрабуйце яшчэ раз.", + "plugin-review:sign-in": "Увайсці, каб пакінуць водгук", + "plugin-review:edit": "Рэдагаваць свой водгук", + "plugin-review:add": "Дадаць водгук…", + "plugin-review:placeholder": "Падзяліцеся сваім досведам…", + "plugin-review:input-label": "Водгук пра плагін", + "plugin-review:vote-group-label": "Ацэнка", + "plugin-review:thumbs-up": "Падабаецца", + "plugin-review:thumbs-down": "Не падабаецца", + "plugin-review:delete": "Выдаліць водгук", + "plugin-review:load-failed": "Не ўдалося загрузіць водгукі.", + "plugin-review:retry": "Паспрабаваць яшчэ раз", + "plugin-review:empty-title": "Водгукаў пакуль няма", + "plugin-review:empty-description": "Падзяліцеся сваім досведам першымі.", + "plugin-review:yours": "Ваш водгук", + "plugin-review:community": "Водгукі супольнасці", + "plugin-review:no-other-reviews": "Іншых водгукаў пакуль няма.", + "plugin-review:login-incomplete": "Уваход не быў завершаны.", + "plugin-review:sign-in-failed": "Не ўдалося ўвайсці.", + "plugin-review:session-expired-review": "Сеанс скончыўся. Увайдзіце зноў, каб пакінуць водгук.", + "plugin-review:save-failed": "Не ўдалося захаваць водгук.", + "plugin-review:delete-confirmation": "Выдаліць ваш водгук? Гэта дзеянне нельга скасаваць.", + "plugin-review:session-expired-continue": "Сеанс скончыўся. Увайдзіце зноў, каб працягнуць.", + "plugin-review:delete-failed": "Не ўдалося выдаліць водгук.", + "plugin-review:you": "Вы", + "plugin-review:edit-action": "Рэдагаваць водгук", + "plugin-review:recommended": "Рэкамендуе гэты плагін", + "plugin-review:error-max-length": "Водгук павінен змяшчаць не больш за {max} сімвалаў.", + "plugin-review:error-downvote-comment": "Раскажыце распрацоўшчыку, што можна палепшыць.", + "plugin-review:error-empty": "Дадайце каментарый або выберыце «Падабаецца».", + "plugin-review:unrated": "Без ацэнкі" } diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json index 166738aff1..75cc364b1f 100644 --- a/src/lang/bn-bd.json +++ b/src/lang/bn-bd.json @@ -842,5 +842,37 @@ "confirm app icon reward": "এই অ্যাপ আইকনটি প্রয়োগ করতে একটি পুরস্কারযুক্ত বিজ্ঞাপন দেখবেন?", "rewarded ad unavailable": "পুরস্কারযুক্ত বিজ্ঞাপন এখন উপলভ্য নেই। অনুগ্রহ করে আবার চেষ্টা করুন।", "rewarded ad failed": "বিজ্ঞাপনটি সম্পূর্ণ করা যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।", - "rewarded ad incomplete": "পুরস্কার পেতে বিজ্ঞাপনটি সম্পূর্ণ দেখুন।" + "rewarded ad incomplete": "পুরস্কার পেতে বিজ্ঞাপনটি সম্পূর্ণ দেখুন।", + "plugin-review:dialog-label": "প্লাগইন পর্যালোচনা", + "plugin-review:account-check-failed": "আপনার অ্যাকাউন্ট যাচাই করা যায়নি। আবার চেষ্টা করুন।", + "plugin-review:sign-in": "পর্যালোচনা দিতে সাইন ইন করুন", + "plugin-review:edit": "আপনার পর্যালোচনা সম্পাদনা করুন", + "plugin-review:add": "পর্যালোচনা যোগ করুন...", + "plugin-review:placeholder": "আপনার অভিজ্ঞতা শেয়ার করুন...", + "plugin-review:input-label": "প্লাগইন পর্যালোচনা", + "plugin-review:vote-group-label": "ভোট", + "plugin-review:thumbs-up": "পছন্দ", + "plugin-review:thumbs-down": "অপছন্দ", + "plugin-review:delete": "পর্যালোচনা মুছুন", + "plugin-review:load-failed": "পর্যালোচনাগুলো লোড করা যায়নি।", + "plugin-review:retry": "আবার চেষ্টা করুন", + "plugin-review:empty-title": "এখনও কোনো পর্যালোচনা নেই", + "plugin-review:empty-description": "সবার আগে আপনার অভিজ্ঞতা শেয়ার করুন।", + "plugin-review:yours": "আপনার পর্যালোচনা", + "plugin-review:community": "কমিউনিটির পর্যালোচনা", + "plugin-review:no-other-reviews": "এখনও অন্য কোনো পর্যালোচনা নেই।", + "plugin-review:login-incomplete": "সাইন ইন সম্পন্ন হয়নি।", + "plugin-review:sign-in-failed": "সাইন ইন করা যায়নি।", + "plugin-review:session-expired-review": "আপনার সেশনের মেয়াদ শেষ। পর্যালোচনা দিতে আবার সাইন ইন করুন।", + "plugin-review:save-failed": "পর্যালোচনা সংরক্ষণ করা যায়নি।", + "plugin-review:delete-confirmation": "আপনার পর্যালোচনা মুছবেন? এটি আর ফিরিয়ে আনা যাবে না।", + "plugin-review:session-expired-continue": "আপনার সেশনের মেয়াদ শেষ। চালিয়ে যেতে আবার সাইন ইন করুন।", + "plugin-review:delete-failed": "পর্যালোচনা মোছা যায়নি।", + "plugin-review:you": "আপনি", + "plugin-review:edit-action": "পর্যালোচনা সম্পাদনা করুন", + "plugin-review:recommended": "এই প্লাগইনটি সুপারিশ করেছেন", + "plugin-review:error-max-length": "পর্যালোচনা {max} অক্ষর বা তার কম হতে হবে।", + "plugin-review:error-downvote-comment": "কী উন্নত করা যায় তা ডেভেলপারকে জানান।", + "plugin-review:error-empty": "একটি মন্তব্য যোগ করুন বা পছন্দ নির্বাচন করুন।", + "plugin-review:unrated": "এখনও মূল্যায়ন নেই" } diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json index 69a1605a87..38b332d152 100644 --- a/src/lang/cs-cz.json +++ b/src/lang/cs-cz.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Chcete zhlédnout reklamu s odměnou a použít tuto ikonu aplikace?", "rewarded ad unavailable": "Reklamy s odměnou nejsou nyní dostupné. Zkuste to znovu.", "rewarded ad failed": "Reklamu se nepodařilo dokončit. Zkuste to znovu.", - "rewarded ad incomplete": "Pro získání odměny zhlédněte reklamu až do konce." + "rewarded ad incomplete": "Pro získání odměny zhlédněte reklamu až do konce.", + "plugin-review:dialog-label": "Recenze pluginu", + "plugin-review:account-check-failed": "Váš účet se nepodařilo ověřit. Zkuste to znovu.", + "plugin-review:sign-in": "Přihlásit se a napsat recenzi", + "plugin-review:edit": "Upravit vaši recenzi", + "plugin-review:add": "Přidat recenzi…", + "plugin-review:placeholder": "Podělte se o své zkušenosti…", + "plugin-review:input-label": "Recenze pluginu", + "plugin-review:vote-group-label": "Hlas", + "plugin-review:thumbs-up": "Líbí se mi", + "plugin-review:thumbs-down": "Nelíbí se mi", + "plugin-review:delete": "Smazat recenzi", + "plugin-review:load-failed": "Recenze se nepodařilo načíst.", + "plugin-review:retry": "Zkusit znovu", + "plugin-review:empty-title": "Zatím žádné recenze", + "plugin-review:empty-description": "Podělte se o zkušenost jako první.", + "plugin-review:yours": "Vaše recenze", + "plugin-review:community": "Recenze komunity", + "plugin-review:no-other-reviews": "Zatím žádné další recenze.", + "plugin-review:login-incomplete": "Přihlášení nebylo dokončeno.", + "plugin-review:sign-in-failed": "Přihlášení se nezdařilo.", + "plugin-review:session-expired-review": "Vaše relace vypršela. Chcete-li napsat recenzi, přihlaste se znovu.", + "plugin-review:save-failed": "Recenzi se nepodařilo uložit.", + "plugin-review:delete-confirmation": "Smazat vaši recenzi? Tuto akci nelze vrátit zpět.", + "plugin-review:session-expired-continue": "Vaše relace vypršela. Chcete-li pokračovat, přihlaste se znovu.", + "plugin-review:delete-failed": "Recenzi se nepodařilo smazat.", + "plugin-review:you": "Vy", + "plugin-review:edit-action": "Upravit recenzi", + "plugin-review:recommended": "Doporučuje tento plugin", + "plugin-review:error-max-length": "Recenze může mít nejvýše {max} znaků.", + "plugin-review:error-downvote-comment": "Sdělte vývojáři, co by se dalo zlepšit.", + "plugin-review:error-empty": "Přidejte komentář nebo zvolte Líbí se mi.", + "plugin-review:unrated": "Nehodnoceno" } diff --git a/src/lang/de-de.json b/src/lang/de-de.json index 1efd40fe58..a3c9447c7f 100644 --- a/src/lang/de-de.json +++ b/src/lang/de-de.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Eine belohnte Anzeige ansehen, um dieses App-Symbol anzuwenden?", "rewarded ad unavailable": "Belohnte Anzeigen sind derzeit nicht verfügbar. Bitte versuche es erneut.", "rewarded ad failed": "Die Anzeige konnte nicht abgeschlossen werden. Bitte versuche es erneut.", - "rewarded ad incomplete": "Sieh dir die Anzeige bis zum Ende an, um die Belohnung zu erhalten." + "rewarded ad incomplete": "Sieh dir die Anzeige bis zum Ende an, um die Belohnung zu erhalten.", + "plugin-review:dialog-label": "Plugin-Bewertungen", + "plugin-review:account-check-failed": "Dein Konto konnte nicht überprüft werden. Versuche es erneut.", + "plugin-review:sign-in": "Zum Bewerten anmelden", + "plugin-review:edit": "Deine Bewertung bearbeiten", + "plugin-review:add": "Bewertung hinzufügen…", + "plugin-review:placeholder": "Teile deine Erfahrung…", + "plugin-review:input-label": "Plugin-Bewertung", + "plugin-review:vote-group-label": "Stimme", + "plugin-review:thumbs-up": "Gefällt mir", + "plugin-review:thumbs-down": "Gefällt mir nicht", + "plugin-review:delete": "Bewertung löschen", + "plugin-review:load-failed": "Bewertungen konnten nicht geladen werden.", + "plugin-review:retry": "Erneut versuchen", + "plugin-review:empty-title": "Noch keine Bewertungen", + "plugin-review:empty-description": "Teile als Erste oder Erster deine Erfahrung.", + "plugin-review:yours": "Deine Bewertung", + "plugin-review:community": "Bewertungen der Community", + "plugin-review:no-other-reviews": "Noch keine weiteren Bewertungen.", + "plugin-review:login-incomplete": "Die Anmeldung wurde nicht abgeschlossen.", + "plugin-review:sign-in-failed": "Anmeldung nicht möglich.", + "plugin-review:session-expired-review": "Deine Sitzung ist abgelaufen. Melde dich erneut an, um eine Bewertung abzugeben.", + "plugin-review:save-failed": "Bewertung konnte nicht gespeichert werden.", + "plugin-review:delete-confirmation": "Deine Bewertung löschen? Dies kann nicht rückgängig gemacht werden.", + "plugin-review:session-expired-continue": "Deine Sitzung ist abgelaufen. Melde dich erneut an, um fortzufahren.", + "plugin-review:delete-failed": "Bewertung konnte nicht gelöscht werden.", + "plugin-review:you": "Du", + "plugin-review:edit-action": "Bewertung bearbeiten", + "plugin-review:recommended": "Empfiehlt dieses Plugin", + "plugin-review:error-max-length": "Die Bewertung darf höchstens {max} Zeichen lang sein.", + "plugin-review:error-downvote-comment": "Sage dem Entwickler, was verbessert werden könnte.", + "plugin-review:error-empty": "Füge einen Kommentar hinzu oder wähle „Gefällt mir“.", + "plugin-review:unrated": "Nicht bewertet" } diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 53063bc74c..2f7a159f7e 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", "rewarded ad failed": "The ad could not be completed. Please try again.", - "rewarded ad incomplete": "Finish watching the ad to earn the reward." + "rewarded ad incomplete": "Finish watching the ad to earn the reward.", + "plugin-review:dialog-label": "Plugin reviews", + "plugin-review:account-check-failed": "Unable to check your account. Try again.", + "plugin-review:sign-in": "Sign in to review", + "plugin-review:edit": "Edit your review", + "plugin-review:add": "Add a review...", + "plugin-review:placeholder": "Share your experience...", + "plugin-review:input-label": "Plugin review", + "plugin-review:vote-group-label": "Vote", + "plugin-review:thumbs-up": "Thumbs up", + "plugin-review:thumbs-down": "Thumbs down", + "plugin-review:delete": "Delete review", + "plugin-review:load-failed": "Unable to load reviews.", + "plugin-review:retry": "Retry", + "plugin-review:empty-title": "No reviews yet", + "plugin-review:empty-description": "Be the first to share your experience.", + "plugin-review:yours": "Your review", + "plugin-review:community": "Community reviews", + "plugin-review:no-other-reviews": "No other reviews yet.", + "plugin-review:login-incomplete": "Login was not completed.", + "plugin-review:sign-in-failed": "Unable to sign in.", + "plugin-review:session-expired-review": "Your session expired. Sign in again to review.", + "plugin-review:save-failed": "Unable to save review.", + "plugin-review:delete-confirmation": "Delete your review? This cannot be undone.", + "plugin-review:session-expired-continue": "Your session expired. Sign in again to continue.", + "plugin-review:delete-failed": "Unable to delete review.", + "plugin-review:you": "You", + "plugin-review:edit-action": "Edit review", + "plugin-review:recommended": "Recommended this plugin", + "plugin-review:error-max-length": "Review must be {max} characters or less.", + "plugin-review:error-downvote-comment": "Tell the developer what could be improved.", + "plugin-review:error-empty": "Add a comment or choose thumbs up.", + "plugin-review:unrated": "Unrated" } diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json index 2147ba35fe..276965e483 100644 --- a/src/lang/es-sv.json +++ b/src/lang/es-sv.json @@ -842,5 +842,37 @@ "confirm app icon reward": "¿Ver un anuncio con recompensa para aplicar este icono de la aplicación?", "rewarded ad unavailable": "Los anuncios con recompensa no están disponibles en este momento. Inténtalo de nuevo.", "rewarded ad failed": "No se pudo completar el anuncio. Inténtalo de nuevo.", - "rewarded ad incomplete": "Termina de ver el anuncio para obtener la recompensa." + "rewarded ad incomplete": "Termina de ver el anuncio para obtener la recompensa.", + "plugin-review:dialog-label": "Reseñas del complemento", + "plugin-review:account-check-failed": "No se pudo verificar tu cuenta. Inténtalo de nuevo.", + "plugin-review:sign-in": "Inicia sesión para opinar", + "plugin-review:edit": "Editar tu reseña", + "plugin-review:add": "Agregar una reseña...", + "plugin-review:placeholder": "Comparte tu experiencia...", + "plugin-review:input-label": "Reseña del complemento", + "plugin-review:vote-group-label": "Voto", + "plugin-review:thumbs-up": "Me gusta", + "plugin-review:thumbs-down": "No me gusta", + "plugin-review:delete": "Eliminar reseña", + "plugin-review:load-failed": "No se pudieron cargar las reseñas.", + "plugin-review:retry": "Reintentar", + "plugin-review:empty-title": "Aún no hay reseñas", + "plugin-review:empty-description": "Sé la primera persona en compartir tu experiencia.", + "plugin-review:yours": "Tu reseña", + "plugin-review:community": "Reseñas de la comunidad", + "plugin-review:no-other-reviews": "Aún no hay otras reseñas.", + "plugin-review:login-incomplete": "No se completó el inicio de sesión.", + "plugin-review:sign-in-failed": "No se pudo iniciar sesión.", + "plugin-review:session-expired-review": "Tu sesión venció. Inicia sesión de nuevo para opinar.", + "plugin-review:save-failed": "No se pudo guardar la reseña.", + "plugin-review:delete-confirmation": "¿Eliminar tu reseña? Esta acción no se puede deshacer.", + "plugin-review:session-expired-continue": "Tu sesión venció. Inicia sesión de nuevo para continuar.", + "plugin-review:delete-failed": "No se pudo eliminar la reseña.", + "plugin-review:you": "Tú", + "plugin-review:edit-action": "Editar reseña", + "plugin-review:recommended": "Recomendó este complemento", + "plugin-review:error-max-length": "La reseña debe tener {max} caracteres o menos.", + "plugin-review:error-downvote-comment": "Dile al desarrollador qué podría mejorar.", + "plugin-review:error-empty": "Agrega un comentario o elige Me gusta.", + "plugin-review:unrated": "Sin calificar" } diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json index ac2403ef35..5cf8f8b56f 100644 --- a/src/lang/fr-fr.json +++ b/src/lang/fr-fr.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Regarder une publicité récompensée pour appliquer cette icône d’application ?", "rewarded ad unavailable": "Les publicités récompensées sont indisponibles pour le moment. Réessayez.", "rewarded ad failed": "La publicité n’a pas pu être terminée. Réessayez.", - "rewarded ad incomplete": "Regardez la publicité jusqu’à la fin pour obtenir la récompense." + "rewarded ad incomplete": "Regardez la publicité jusqu’à la fin pour obtenir la récompense.", + "plugin-review:dialog-label": "Avis sur l’extension", + "plugin-review:account-check-failed": "Impossible de vérifier votre compte. Réessayez.", + "plugin-review:sign-in": "Se connecter pour donner un avis", + "plugin-review:edit": "Modifier votre avis", + "plugin-review:add": "Ajouter un avis…", + "plugin-review:placeholder": "Partagez votre expérience…", + "plugin-review:input-label": "Avis sur l’extension", + "plugin-review:vote-group-label": "Vote", + "plugin-review:thumbs-up": "J’aime", + "plugin-review:thumbs-down": "Je n’aime pas", + "plugin-review:delete": "Supprimer l’avis", + "plugin-review:load-failed": "Impossible de charger les avis.", + "plugin-review:retry": "Réessayer", + "plugin-review:empty-title": "Aucun avis pour le moment", + "plugin-review:empty-description": "Soyez la première personne à partager votre expérience.", + "plugin-review:yours": "Votre avis", + "plugin-review:community": "Avis de la communauté", + "plugin-review:no-other-reviews": "Aucun autre avis pour le moment.", + "plugin-review:login-incomplete": "La connexion n’a pas abouti.", + "plugin-review:sign-in-failed": "Impossible de se connecter.", + "plugin-review:session-expired-review": "Votre session a expiré. Reconnectez-vous pour donner un avis.", + "plugin-review:save-failed": "Impossible d’enregistrer l’avis.", + "plugin-review:delete-confirmation": "Supprimer votre avis ? Cette action est irréversible.", + "plugin-review:session-expired-continue": "Votre session a expiré. Reconnectez-vous pour continuer.", + "plugin-review:delete-failed": "Impossible de supprimer l’avis.", + "plugin-review:you": "Vous", + "plugin-review:edit-action": "Modifier l’avis", + "plugin-review:recommended": "Recommande cette extension", + "plugin-review:error-max-length": "L’avis doit contenir au maximum {max} caractères.", + "plugin-review:error-downvote-comment": "Indiquez au développeur ce qui pourrait être amélioré.", + "plugin-review:error-empty": "Ajoutez un commentaire ou choisissez J’aime.", + "plugin-review:unrated": "Non évalué" } diff --git a/src/lang/he-il.json b/src/lang/he-il.json index 56b2071a6e..4c306eb535 100644 --- a/src/lang/he-il.json +++ b/src/lang/he-il.json @@ -842,5 +842,37 @@ "confirm app icon reward": "לצפות בפרסומת מתגמלת כדי להחיל את סמל האפליקציה הזה?", "rewarded ad unavailable": "פרסומות מתגמלות אינן זמינות כרגע. יש לנסות שוב.", "rewarded ad failed": "לא ניתן היה להשלים את הפרסומת. יש לנסות שוב.", - "rewarded ad incomplete": "יש לצפות בפרסומת עד הסוף כדי לקבל את התגמול." + "rewarded ad incomplete": "יש לצפות בפרסומת עד הסוף כדי לקבל את התגמול.", + "plugin-review:dialog-label": "ביקורות על התוסף", + "plugin-review:account-check-failed": "לא ניתן לבדוק את החשבון שלך. נסה שוב.", + "plugin-review:sign-in": "יש להתחבר כדי לכתוב ביקורת", + "plugin-review:edit": "עריכת הביקורת שלך", + "plugin-review:add": "הוספת ביקורת...", + "plugin-review:placeholder": "שתף את החוויה שלך...", + "plugin-review:input-label": "ביקורת על התוסף", + "plugin-review:vote-group-label": "הצבעה", + "plugin-review:thumbs-up": "אהבתי", + "plugin-review:thumbs-down": "לא אהבתי", + "plugin-review:delete": "מחיקת ביקורת", + "plugin-review:load-failed": "לא ניתן לטעון את הביקורות.", + "plugin-review:retry": "נסה שוב", + "plugin-review:empty-title": "אין עדיין ביקורות", + "plugin-review:empty-description": "היה הראשון לשתף את החוויה שלך.", + "plugin-review:yours": "הביקורת שלך", + "plugin-review:community": "ביקורות הקהילה", + "plugin-review:no-other-reviews": "אין עדיין ביקורות נוספות.", + "plugin-review:login-incomplete": "ההתחברות לא הושלמה.", + "plugin-review:sign-in-failed": "לא ניתן להתחבר.", + "plugin-review:session-expired-review": "פג תוקף ההפעלה שלך. התחבר שוב כדי לכתוב ביקורת.", + "plugin-review:save-failed": "לא ניתן לשמור את הביקורת.", + "plugin-review:delete-confirmation": "למחוק את הביקורת שלך? לא ניתן לבטל פעולה זו.", + "plugin-review:session-expired-continue": "פג תוקף ההפעלה שלך. התחבר שוב כדי להמשיך.", + "plugin-review:delete-failed": "לא ניתן למחוק את הביקורת.", + "plugin-review:you": "אתה", + "plugin-review:edit-action": "עריכת ביקורת", + "plugin-review:recommended": "המליץ על התוסף הזה", + "plugin-review:error-max-length": "הביקורת צריכה להכיל עד {max} תווים.", + "plugin-review:error-downvote-comment": "ספר למפתח מה אפשר לשפר.", + "plugin-review:error-empty": "הוסף תגובה או בחר באהבתי.", + "plugin-review:unrated": "ללא דירוג" } diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json index a26d5eaae9..97857b6bc6 100644 --- a/src/lang/hi-in.json +++ b/src/lang/hi-in.json @@ -842,5 +842,37 @@ "confirm app icon reward": "क्या इस ऐप आइकन को लागू करने के लिए इनाम वाला एक विज्ञापन देखना चाहते हैं?", "rewarded ad unavailable": "इनाम वाले विज्ञापन अभी उपलब्ध नहीं हैं। कृपया फिर से कोशिश करें।", "rewarded ad failed": "विज्ञापन पूरा नहीं हो सका। कृपया फिर से कोशिश करें।", - "rewarded ad incomplete": "इनाम पाने के लिए विज्ञापन पूरा देखें।" + "rewarded ad incomplete": "इनाम पाने के लिए विज्ञापन पूरा देखें।", + "plugin-review:dialog-label": "प्लगइन समीक्षाएँ", + "plugin-review:account-check-failed": "आपके खाते की जाँच नहीं हो सकी। फिर से कोशिश करें।", + "plugin-review:sign-in": "समीक्षा देने के लिए साइन इन करें", + "plugin-review:edit": "अपनी समीक्षा संपादित करें", + "plugin-review:add": "समीक्षा जोड़ें...", + "plugin-review:placeholder": "अपना अनुभव साझा करें...", + "plugin-review:input-label": "प्लगइन समीक्षा", + "plugin-review:vote-group-label": "वोट", + "plugin-review:thumbs-up": "पसंद", + "plugin-review:thumbs-down": "नापसंद", + "plugin-review:delete": "समीक्षा हटाएँ", + "plugin-review:load-failed": "समीक्षाएँ लोड नहीं हो सकीं।", + "plugin-review:retry": "फिर से कोशिश करें", + "plugin-review:empty-title": "अभी कोई समीक्षा नहीं है", + "plugin-review:empty-description": "अपना अनुभव साझा करने वाले पहले व्यक्ति बनें।", + "plugin-review:yours": "आपकी समीक्षा", + "plugin-review:community": "समुदाय की समीक्षाएँ", + "plugin-review:no-other-reviews": "अभी कोई अन्य समीक्षा नहीं है।", + "plugin-review:login-incomplete": "साइन इन पूरा नहीं हुआ।", + "plugin-review:sign-in-failed": "साइन इन नहीं हो सका।", + "plugin-review:session-expired-review": "आपका सत्र समाप्त हो गया। समीक्षा देने के लिए फिर से साइन इन करें।", + "plugin-review:save-failed": "समीक्षा सहेजी नहीं जा सकी।", + "plugin-review:delete-confirmation": "अपनी समीक्षा हटाएँ? इसे वापस नहीं किया जा सकता।", + "plugin-review:session-expired-continue": "आपका सत्र समाप्त हो गया। जारी रखने के लिए फिर से साइन इन करें।", + "plugin-review:delete-failed": "समीक्षा हटाई नहीं जा सकी।", + "plugin-review:you": "आप", + "plugin-review:edit-action": "समीक्षा संपादित करें", + "plugin-review:recommended": "इस प्लगइन की सिफ़ारिश की", + "plugin-review:error-max-length": "समीक्षा {max} वर्णों या उससे कम की होनी चाहिए।", + "plugin-review:error-downvote-comment": "डेवलपर को बताएँ कि क्या बेहतर किया जा सकता है।", + "plugin-review:error-empty": "टिप्पणी जोड़ें या पसंद चुनें।", + "plugin-review:unrated": "अभी रेटिंग नहीं" } diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json index 086b82bb69..5616f4f889 100644 --- a/src/lang/hu-hu.json +++ b/src/lang/hu-hu.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Megnézel egy jutalmazott hirdetést az alkalmazásikon beállításához?", "rewarded ad unavailable": "A jutalmazott hirdetések jelenleg nem érhetők el. Próbáld újra.", "rewarded ad failed": "A hirdetést nem sikerült befejezni. Próbáld újra.", - "rewarded ad incomplete": "Nézd végig a hirdetést a jutalom megszerzéséhez." + "rewarded ad incomplete": "Nézd végig a hirdetést a jutalom megszerzéséhez.", + "plugin-review:dialog-label": "Bővítményértékelések", + "plugin-review:account-check-failed": "Nem sikerült ellenőrizni a fiókját. Próbálja újra.", + "plugin-review:sign-in": "Megjegyzés írásához be kell jelentkezni", + "plugin-review:edit": "Megjegyzés szerkesztése", + "plugin-review:add": "Megjegyzés hozzáadása…", + "plugin-review:placeholder": "Ossza meg a tapasztalatait…", + "plugin-review:input-label": "Megjegyzés hozzáadása", + "plugin-review:vote-group-label": "Szavazás", + "plugin-review:thumbs-up": "Tetszik", + "plugin-review:thumbs-down": "Nem tetszik", + "plugin-review:delete": "Megjegyzés törlése", + "plugin-review:load-failed": "Nem sikerült betölteni a megjegyzéseket.", + "plugin-review:retry": "Újrapróbálkozás", + "plugin-review:empty-title": "Még nincsenek megjegyzések", + "plugin-review:empty-description": "Ossza meg elsőként a tapasztalatait.", + "plugin-review:yours": "Saját megjegyzés", + "plugin-review:community": "Közösségi megjegyzések", + "plugin-review:no-other-reviews": "Még nincsenek további megjegyzések.", + "plugin-review:login-incomplete": "A bejelentkezési folyamat még nem fejeződött be.", + "plugin-review:sign-in-failed": "Nem sikerült bejelentkezni.", + "plugin-review:session-expired-review": "A munkamenet lejárt. Jelentkezzen be újra a megjegyzés írásához.", + "plugin-review:save-failed": "Nem sikerült menteni a megjegyzést.", + "plugin-review:delete-confirmation": "Biztosan törli a megjegyzést? Ez a művelet nem vonható vissza.", + "plugin-review:session-expired-continue": "A munkamenet lejárt. A folytatáshoz jelentkezzen be újra.", + "plugin-review:delete-failed": "Nem sikerült törölni a megjegyzést.", + "plugin-review:you": "Ön", + "plugin-review:edit-action": "Megjegyzés szerkesztése", + "plugin-review:recommended": "Bővítmény ajánlása", + "plugin-review:error-max-length": "A megjegyzés szövege legfeljebb {max} karakter lehet.", + "plugin-review:error-downvote-comment": "Írja meg a fejlesztőknek, hogy min lehetne javítani.", + "plugin-review:error-empty": "Adjon hozzá megjegyzést vagy válassza a „Tetszik” lehetőséget.", + "plugin-review:unrated": "Még nem értékelte senki" } diff --git a/src/lang/id-id.json b/src/lang/id-id.json index dd62d02bb0..9b38fe0ef1 100644 --- a/src/lang/id-id.json +++ b/src/lang/id-id.json @@ -8,18 +8,18 @@ "autosave": "Simpan Otomatis", "cancel": "Batal", "change language": "Ubah Bahasa", - "choose color": "Pilih warna", + "choose color": "Pilih Warna", "clear": "Kosongkan", - "close app": "Tutup aplikasi?", - "commit message": "Pesan komit", + "close app": "Tutup Aplikasi?", + "commit message": "Pesan Komit", "console": "Konsol", "conflict error": "Terjadi konflik! Harap tunggu sebelum melakukan komit lain.", "copy": "Salin", - "create folder error": "Maaf, tidak dapat membuat folder baru", + "create folder error": "Maaf, tidak dapat membuat folder baru.", "cut": "Potong", "delete": "Hapus", - "dependencies": "Ketergantungan", - "delay": "Waktu dalam milidetik", + "dependencies": "Dependensi", + "delay": "Waktu dalam Milidetik", "editor settings": "Pengaturan Editor", "editor theme": "Tema Editor", "enter file name": "Masukkan nama berkas", @@ -34,13 +34,13 @@ "file deleted": "Berkas dihapus", "file is not supported": "Berkas tidak didukung", "file not supported": "Jenis berkas ini tidak didukung.", - "file too large": "Berkas terlalu besar untuk ditangani. Ukuran maksimal berkas yang diizinkan adalah {size}", + "file too large": "Berkas terlalu besar untuk ditangani. Ukuran maksimal berkas yang diizinkan adalah {size}.", "file renamed": "Berkas berganti nama", "file saved": "Berkas disimpan", "folder added": "Folder ditambahkan", "folder already added": "Folder sudah ditambahkan", "font size": "Ukuran Font", - "goto": "Pergi ke baris", + "goto": "Pergi ke Baris", "icons definition": "Definisi ikon", "info": "Info", "invalid value": "Nilai tidak valid", @@ -48,23 +48,23 @@ "linting": "Cek kesalahan sintaks", "logout": "Keluar", "loading": "Memuat", - "my profile": "Profil saya", + "my profile": "Profil Saya", "new file": "Berkas baru", "new folder": "Folder baru", "no": "Tidak", - "no editor message": "Buka atau buat berkas dan folder baru dari menu", + "no editor message": "Buka atau buat berkas dan folder baru dari menu.", "not set": "Tidak diatur", "unsaved files close app": "Ada berkas yang belum disimpan. Tutup Aplikasi?", "notice": "Pemberitahuan", "open file": "Buka berkas", "open files and folders": "Buka berkas dan folder", "open folder": "Buka folder", - "open recent": "Buka baru-baru ini", + "open recent": "Buka Yang Baru-Baru Ini", "ok": "OK", "overwrite": "Timpa", "paste": "Tempel", "preview mode": "Mode Pratinjau", - "read only file": "Tidak dapat menyimpan berkas hanya baca. Silakan coba simpan sebagai", + "read only file": "Tidak dapat menyimpan berkas hanya-baca. Silakan coba simpan sebagai.", "reload": "Muat Ulang", "rename": "Ubah Nama", "replace": "Ganti", @@ -73,7 +73,7 @@ "save": "Simpan", "saving": "Menyimpan", "save as": "Simpan sebagai", - "save file to run": "Silakan simpan berkas ini untuk berjalan di peramban", + "save file to run": "Silakan simpan berkas ini agar dapat berjalan di peramban.", "search": "Cari", "see logs and errors": "Lihat log dan kesalahan", "select folder": "Pilih folder", @@ -160,7 +160,7 @@ "dark": "Gelap", "file browser": "Penjelajah Berkas", "operation not permitted": "Operasi tidak diizinkan", - "no such file or directory": "Tidak ada berkas atau direktori seperti itu", + "no such file or directory": "Tidak ada berkas atau direktori seperti itu.", "input/output error": "Kesalahan masukan/keluaran", "permission denied": "Izin ditolak", "bad address": "Alamat tidak valid", @@ -177,7 +177,7 @@ "too many users": "Terlalu banyak pengguna", "connection timed out": "Waktu koneksi habis", "connection refused": "Koneksi ditolak", - "owner died": "Proses induk terhenti", + "owner died": "Proses induk berhenti.", "an error occurred": "Terjadi kesalahan", "add ftp": "Tambahkan FTP", "add sftp": "Tambahkan SFTP", @@ -191,7 +191,7 @@ "deleted file": "Berkas yang dihapus", "line height": "Tinggi baris", "preview info": "Jika Anda ingin menjalankan berkas aktif, ketuk dan tahan ikon Putar.", - "manage all files": "Izinkan Acode Editor untuk mengelola semua berkas dalam pengaturan untuk mengedit berkas di perangkat Anda dengan mudah.", + "manage all files": "Izinkan Acode Editor untuk mengelola semua berkas di pengaturan agar dapat mengedit berkas di perangkat Anda dengan mudah.", "close file": "Tutup berkas", "reset connections": "Atur ulang koneksi", "check file changes": "Periksa perubahan berkas", @@ -252,25 +252,25 @@ "select key file": "Pilih berkas kunci", "passphrase": "Frasa sandi", "connecting...": "Menghubungkan...", - "type filename": "Jenis nama berkas", + "type filename": "Ketik nama berkas", "unable to load files": "Tidak dapat memuat berkas", "preview port": "Port pratinjau", "find file": "Temukan berkas", "system": "Sistem", "please select a formatter": "Mohon pilih pemformat", "case sensitive": "Sensitif huruf besar", - "regular expression": "Ekspresi Regular", + "regular expression": "Ekspresi Reguler", "whole word": "Seluruh kata", "edit with": "Edit dengan", "open with": "Buka dengan", "no app found to handle this file": "Tidak ditemukan aplikasi untuk menangani berkas ini", - "restore default settings": "Kembalikan pengaturan default", + "restore default settings": "Kembalikan Pengaturan Bawaan", "server port": "Port server", "preview settings": "Pengaturan pratinjau", - "preview settings note": "Jika port pratinjau dan port server berbeda, aplikasi tidak akan memulai server dan sebaliknya akan membuka https://: di peramban atau peramban-dalam-aplikasi. Ini berguna ketika Anda menjalankan server di tempat lain.", + "preview settings note": "Jika port pratinjau dan port server berbeda, aplikasi tidak akan memulai server dan sebaliknya akan membuka https://: di peramban atau peramban-dalam-aplikasi. Ini berguna ketika Anda menjalankan server di tempat lain.", "backup/restore note": "Ini hanya akan membuat cadangan pengaturan Anda, tema khusus, plugin yang dipasang, dan pemetaan tombol. Ini tidak akan membuat cadangan FTP/SFTP atau status aplikasi Anda.", "host": "Host", - "retry ftp/sftp when fail": "Ulangi FTP/SFTP ketika gagal", + "retry ftp/sftp when fail": "Ulangi FTP/SFTP saat gagal", "more": "Lebih banyak", "thank you :)": "Terima kasih :)", "purchase pending": "Pembelian Tertunda", @@ -292,42 +292,42 @@ "quicktools trigger mode": "Mode Pemicu Alat Cepat", "print margin": "Cetak margin", "touch move threshold": "Ambang pergerakan sentuh", - "info-retryremotefsafterfail": "Ulangi koneksi FTP/SFTP ketika gagal.", - "info-fullscreen": "Sembunyikan Bilah Judul di Layar Beranda.", - "info-checkfiles": "Periksa perubahan berkas ketika aplikasi di latar belakang.", - "info-console": "Pilih konsol JavaScript. Legacy adalah konsol default, Eruda adalah konsol pihak ketiga.", - "info-keyboardmode": "Mode keyboard untuk input teks, tidak ada saran akan menyembunyikan saran dan koreksi otomatis. Jika tidak ada saran tidak berfungsi, cobalah untuk mengubah nilai ke tanpa saran yang agresif.", - "info-rememberfiles": "Ingat berkas yang dibuka ketika aplikasi ditutup.", - "info-rememberfolders": "Ingat folder yang dibuka ketika aplikasi ditutup.", + "info-retryremotefsafterfail": "Ulangi koneksi FTP/SFTP saat gagal.", + "info-fullscreen": "Sembunyikan bilah judul di layar beranda.", + "info-checkfiles": "Periksa perubahan berkas saat aplikasi berjalan di latar belakang.", + "info-console": "Pilih konsol JavaScript. Legacy adalah konsol bawaan, Eruda adalah konsol pihak ketiga.", + "info-keyboardmode": "Mode papan ketik untuk input teks. Pilihan tanpa saran akan menyembunyikan saran dan koreksi otomatis. Jika tidak ada saran tidak berfungsi, coba ubah nilainya ke tanpa saran yang agresif.", + "info-rememberfiles": "Ingat berkas yang dibuka saat aplikasi ditutup.", + "info-rememberfolders": "Ingat folder yang dibuka saat aplikasi ditutup.", "info-floatingbutton": "Tampilkan atau sembunyikan tombol apung Alat Cepat.", - "info-openfilelistpos": "Di mana untuk menampilkan daftar berkas aktif.", + "info-openfilelistpos": "Lokasi untuk menampilkan daftar berkas aktif.", "info-touchmovethreshold": "Jika sensitivitas sentuhan perangkat Anda terlalu tinggi, Anda dapat meningkatkan nilai ini untuk mencegah gerakan sentuh yang tidak disengaja.", - "info-scroll-settings": "Pengaturan ini berisi pengaturan gulir termasuk bungkus teks.", + "info-scroll-settings": "Pengaturan ini mencakup pengaturan gulir termasuk bungkus teks.", "info-animation": "Jika aplikasi terasa lag, nonaktifkan animasi.", - "info-quicktoolstriggermode": "Jika tombol dalam alat cepat tidak berfungsi, cobalah untuk mengubah nilai ini.", + "info-quicktoolstriggermode": "Jika tombol dalam alat cepat tidak berfungsi, coba ubah nilai ini.", "info-checkForAppUpdates": "Periksa pembaruan aplikasi secara otomatis.", "info-quickTools": "Tampilkan atau sembunyikan alat cepat.", - "info-showHiddenFiles": "Tampilkan berkas dan folder tersembunyi. (Berawal dengan .)", - "info-listFiles": "Otomatis daftarkan semua berkas saat folder dibuka", + "info-showHiddenFiles": "Tampilkan berkas dan folder tersembunyi. (Diawali dengan .)", + "info-listFiles": "Secara otomatis daftarkan semua berkas saat folder dibuka.", "info-all_file_access": "Aktifkan akses ke /sdcard dan /storage di terminal.", "info-fontSize": "Ukuran font yang digunakan untuk menampilkan teks.", "info-fontFamily": "Jenis font yang digunakan untuk menampilkan teks.", "info-theme": "Tema warna terminal.", "info-cursorStyle": "Gaya kursor saat terminal sedang aktif.", "info-cursorInactiveStyle": "Gaya kursor saat terminal tidak terfokus.", - "info-fontWeight": "Ketebalan font yang digunakan untuk menampilkan teks tidak tebal.", + "info-fontWeight": "Ketebalan font yang digunakan untuk menampilkan teks biasa.", "info-cursorBlink": "Apakah kursor berkedip.", - "info-scrollback": "Jumlah scrollback di terminal. Scrollback adalah jumlah baris yang dipertahankan ketika baris digulirkan melampaui tampilan awal.", - "info-tabStopWidth": "Ukuran tab berhenti di terminal.", + "info-scrollback": "Jumlah gulir balik di terminal. Gulir balik adalah jumlah baris yang dipertahankan saat baris digulirkan melampaui tampilan awal.", + "info-tabStopWidth": "Ukuran hentian tab di terminal.", "info-letterSpacing": "Jarak antar karakter dalam piksel penuh.", "info-imageSupport": "Apakah gambar didukung di terminal.", "info-fontLigatures": "Apakah ligatur font diaktifkan di terminal.", - "info-confirmTabClose": "Mintalah konfirmasi sebelum menutup tab terminal.", + "info-confirmTabClose": "Minta konfirmasi sebelum menutup tab terminal.", "info-backup": "Membuat cadangan instalasi terminal.", "info-restore": "Memulihkan cadangan instalasi terminal.", "info-uninstall": "Menghapus instalasi terminal.", "owned": "Dimiliki", - "api_error": "API server turun, silakan coba setelah beberapa waktu.", + "api_error": "Server API sedang down, silakan coba beberapa saat lagi.", "installed": "Terpasang", "all": "Semua", "medium": "Sedang", @@ -345,10 +345,10 @@ "bottom": "Bawah", "save all": "Simpan semua", "close all": "Tutup semua", - "unsaved files warning": "Beberapa berkas tidak disimpan. Klik 'Oke' pilih apa yang harus dilakukan atau tekan 'Batal' untuk kembali.", - "save all warning": "Apakah Anda yakin ingin menyimpan semua berkas dan tutup? Tindakan ini tidak dapat dibalik.", + "unsaved files warning": "Beberapa berkas belum disimpan. Klik 'Oke' untuk memilih tindakan atau tekan 'Batal' untuk kembali.", + "save all warning": "Apakah Anda yakin ingin menyimpan semua berkas dan menutupnya? Tindakan ini tidak dapat diurungkan.", "save all changes warning": "Apakah Anda yakin ingin menyimpan semua berkas?", - "close all warning": "Apakah Anda yakin ingin menutup semua berkas? Anda akan kehilangan perubahan yang belum disimpan dan tindakan ini tidak dapat dibalik.", + "close all warning": "Apakah Anda yakin ingin menutup semua berkas? Anda akan kehilangan perubahan yang belum disimpan dan tindakan ini tidak dapat diurungkan.", "refresh": "Segarkan", "shortcut buttons": "Tombol pintasan", "no result": "Tidak ada hasil", @@ -387,17 +387,17 @@ "quicktools:search-settings": "Pengaturan Pencarian", "quicktools:search-replace": "Mengganti", "quicktools:search-replace-all": "Ganti Semua", - "info-quicktoolssettings": "Kustomisasi tombol pintas dan tombol keyboard dalam wadah alat cepat di bawah editor untuk meningkatkan pengalaman pengkodean Anda.", - "info-excludefolders": "Gunakan pola **/node_modules/** untuk mengabaikan semua berkas dari folder node_modules. Ini akan mengecualikan berkas dari terdaftar dan juga akan mencegah mereka dimasukkan dalam pencarian berkas.", - "missed files": "Memindai {count} berkas setelah pencarian dimulai dan tidak akan dimasukkan dalam pencarian.", + "info-quicktoolssettings": "Sesuaikan tombol pintasan dan tombol papan ketik dalam wadah alat cepat di bawah editor untuk meningkatkan pengalaman pengkodean Anda.", + "info-excludefolders": "Gunakan pola **/node_modules/** untuk mengabaikan semua berkas dari folder node_modules. Ini akan mengecualikan berkas dari daftar dan juga mencegahnya diikutsertakan dalam pencarian berkas.", + "missed files": "Memindai {count} berkas setelah pencarian dimulai dan tidak akan dimasukkan dalam hasil pencarian.", "remove": "Hapus", "quicktools:command-palette": "Palet perintah", "default file encoding": "Enkoding berkas default", - "remove entry": "Apakah Anda yakin ingin menghapus '{name}' dari jalur yang disimpan? Harap dicatat bahwa menghapusnya tidak akan menghapus jalur itu sendiri.", - "delete entry": "Konfirmasikan penghapusan: '{name}'. Tindakan ini tidak dapat diurungkan. Melanjutkan?", - "change encoding": "Buka kembali '{file}' dengan enkoding '{encoding}'? Tindakan ini akan mengakibatkan hilangnya perubahan yang belum disimpan yang dilakukan pada berkas. Apakah Anda ingin melanjutkan pembukaan kembali?", - "reopen file": "Apakah Anda yakin ingin membuka kembali '{file}'? Setiap perubahan yang belum disimpan akan hilang.", - "plugin min version": "{name} hanya tersedia dalam Acode - {v-code} dan di atas. Klik di sini untuk memperbarui.", + "remove entry": "Apakah Anda yakin ingin menghapus '{name}' dari jalur yang disimpan? Perlu diketahui bahwa menghapusnya tidak akan menghapus jalur itu sendiri.", + "delete entry": "Konfirmasi penghapusan: '{name}'. Tindakan ini tidak dapat diurungkan. Lanjutkan?", + "change encoding": "Buka kembali '{file}' dengan enkoding '{encoding}'? Tindakan ini akan mengakibatkan hilangnya perubahan yang belum disimpan pada berkas ini. Apakah Anda ingin melanjutkan?", + "reopen file": "Apakah Anda yakin ingin membuka kembali '{file}'? Semua perubahan yang belum disimpan akan hilang.", + "plugin min version": "{name} hanya tersedia di Acode - {v-code} ke atas. Klik di sini untuk memperbarui.", "color preview": "Pratinjau warna", "confirm": "Konfirmasi", "problems": "Masalah", @@ -407,16 +407,16 @@ "most_downloaded": "Paling Banyak Diunduh", "newly_added": "Baru Ditambahkan", "top_rated": "Peringkat Teratas", - "rename not supported": "Mengganti nama pada direktori Termux tidak didukung", + "rename not supported": "Mengganti nama pada direktori Termux tidak didukung.", "compress": "Kompres", "copy uri": "Salin Uri", "delete entries": "Apakah Anda yakin ingin menghapus {count} item?", - "deleting items": "menghapus {count} item...", + "deleting items": "Menghapus {count} item...", "import project zip": "Impor Proyek (zip)", "changelog": "Catatan Perubahan", "notifications": "Notifikasi", "no_unread_notifications": "Tidak ada pemberitahuan yang belum dibaca", - "should_use_current_file_for_preview": "Harus menggunakan berkas saat ini untuk pratinjau alih-alih default (index.html)", + "should_use_current_file_for_preview": "Gunakan berkas saat ini untuk pratinjau, alih-alih default (index.html).", "fade fold widgets": "Widget Lipat Pudar", "quicktools:home-key": "Kunci Home", "quicktools:end-key": "Kunci End", @@ -513,7 +513,7 @@ "add to home screen": "Tambah ke layar beranda", "pin shortcuts not supported": "Pintasan layar beranda tidak didukung di perangkat ini.", "save file before home shortcut": "Simpan berkas sebelum menambahkannya ke layar beranda.", - "terminal_required_message_for_lsp": "Terminal tidak terpasang. Mohon pasang Terminal terlebih dahulu untuk menggunakan server LSP.", + "terminal_required_message_for_lsp": "Terminal belum terpasang. Mohon pasang Terminal terlebih dahulu untuk menggunakan server LSP.", "shift click selection": "Pemilihan Shift + tekan/klik", "earn ad-free time": "Ambil waktu bebas iklan", "indent guides": "Panduan indentasi", @@ -534,7 +534,7 @@ "lsp-empty": "Kosong", "lsp-enabled": "Diaktifkan", "lsp-error-add-server-failed": "Gagal menambahkan server", - "lsp-error-args-must-be-array": "Argumen harus berupa sebuah senarai JSON", + "lsp-error-args-must-be-array": "Argumen harus berupa senarai JSON.", "lsp-error-binary-command-required": "Perintah biner diperlukan", "lsp-error-language-id-required": "Setidaknya satu ID bahasa diperlukan", "lsp-error-package-required": "Setidaknya satu paket diperlukan", @@ -552,14 +552,14 @@ "lsp-feature-signature": "Bantuan parameter fungsi", "lsp-feature-signature-info": "Tampilkan petunjuk parameter fungsi saat mengetik.", "lsp-feature-state-toast": "{feature} {state}", - "lsp-initialization-options": "Opsi inisiasi", - "lsp-initialization-options-json": "Opsi inisiasi (JSON)", - "lsp-initialization-options-updated": "Opsi inisiasi diperbarui", - "lsp-install-command": "Perintah pasang", - "lsp-install-command-unavailable": "Perintah pasang tidak tersedia", + "lsp-initialization-options": "Opsi Inisialisasi", + "lsp-initialization-options-json": "Opsi Inisialisasi (JSON)", + "lsp-initialization-options-updated": "Opsi inisialisasi diperbarui.", + "lsp-install-command": "Perintah Pasang", + "lsp-install-command-unavailable": "Perintah pasang tidak tersedia.", "lsp-install-info-check-failed": "Acode tidak dapat memverifikasi status pemasangan.", - "lsp-install-info-missing": "Server bahasa tidak terpasang di dalam lingkungan terminal.", - "lsp-install-info-ready": "Server bahasa terpasang dan siap.", + "lsp-install-info-missing": "Server bahasa belum terpasang di dalam lingkungan terminal.", + "lsp-install-info-ready": "Server bahasa terpasang dan siap digunakan.", "lsp-install-info-unknown": "Status pemasangan tidak dapat diperiksa secara otomatis.", "lsp-install-info-version-available": "Versi {version} tersedia.", "lsp-install-notification": "{server} belum terpasang. Ketuk untuk memasang.", @@ -570,8 +570,8 @@ "lsp-install-method-pip": "Paket pip", "lsp-install-method-shell": "Shell kustom", "lsp-install-method-title": "Metode pasang", - "lsp-install-repair": "Pasang / perbaiki", - "lsp-installation-status": "Status pemasangan", + "lsp-install-repair": "Pasang / Perbaiki", + "lsp-installation-status": "Status Pemasangan", "lsp-installed": "Terpasang", "lsp-invalid-timeout": "Nilai timeout tidak valid", "lsp-language-ids": "ID bahasa (dipisah koma)", @@ -582,10 +582,10 @@ "lsp-server-id": "ID server", "lsp-server-label": "Label server", "lsp-server-not-found": "Server tidak ditemukan", - "lsp-server-uninstalled": "Server dicopot pemasangannya", - "lsp-startup-timeout": "Batas waktu mulai", - "lsp-startup-timeout-ms": "Batas waktu mulai (milidetik)", - "lsp-startup-timeout-set": "Batas waktu mulai diatur ke {timeout} ms", + "lsp-server-uninstalled": "Server dicopot pemasangannya.", + "lsp-startup-timeout": "Batas Waktu Mulai", + "lsp-startup-timeout-ms": "Batas Waktu Mulai (Milidetik)", + "lsp-startup-timeout-set": "Batas waktu mulai diatur ke {timeout} ms.", "lsp-state-disabled": "dinonaktifkan", "lsp-state-enabled": "diaktifkan", "lsp-status": "Status", @@ -596,14 +596,14 @@ "lsp-status-not-installed": "Tidak terpasang", "lsp-status-unknown": "Tidak diketahui", "lsp-timeout-ms": "{timeout} ms", - "lsp-uninstall-command-unavailable": "Perintah copot pemasangan tidak tersedia", + "lsp-uninstall-command-unavailable": "Perintah copot pemasangan tidak tersedia.", "lsp-uninstall-notification": "Ketuk untuk menghapus {server}.", - "lsp-uninstall-server": "Copot pemasangan server", + "lsp-uninstall-server": "Copot Pemasangan Server", "lsp-update-command-optional": "Perintah perbarui (opsional)", "lsp-update-command-unavailable": "Perintah perbarui tidak tersedia", - "lsp-update-server": "Perbarui server", + "lsp-update-server": "Perbarui Server", "lsp-version-line": "Versi: {version}", - "lsp-view-initialization-options": "Lihat opsi inisiasi", + "lsp-view-initialization-options": "Lihat Opsi Inisialisasi", "settings-category-about-acode": "Tentang Acode", "settings-category-discover-apps": "Temukan lebih banyak aplikasi", "settings-category-advanced": "Lanjutan", @@ -632,63 +632,63 @@ "settings-category-support-acode": "Dukung Acode", "settings-category-text-layout": "Teks & tampilan", "settings-info-app-animation": "Kendalikan animasi transisi di seluruh aplikasi.", - "settings-info-app-check-files": "Segarkan ulang editor ketika berkas berubah di luar Acode.", + "settings-info-app-check-files": "Segarkan editor saat berkas berubah di luar Acode.", "settings-info-app-clean-install-state": "Hapus status instalasi yang tersimpan yang digunakan oleh alur orientasi dan pengaturan.", "settings-info-app-confirm-on-exit": "Tanyakan sebelum menutup aplikasi.", - "settings-info-app-console": "Pilih mana integrasi konsol debug yang Acode gunakan.", + "settings-info-app-console": "Pilih integrasi konsol debug yang digunakan Acode.", "settings-info-app-default-file-encoding": "Enkoding bawaan ketika membuka atau membuat berkas.", "settings-info-app-exclude-folders": "Lewati folder dan pola ketika mencari atau memindai.", "settings-info-app-floating-button": "Tampilkan tombol aksi cepat yang melayang.", - "settings-info-app-font-manager": "Pasang, kelola, atau menghapus font aplikasi.", - "settings-info-app-fullscreen": "Sembunyikan bar status sistem ketika menggunakan Acode.", + "settings-info-app-font-manager": "Pasang, kelola, atau hapus font aplikasi.", + "settings-info-app-fullscreen": "Sembunyikan bilah status sistem saat menggunakan Acode.", "settings-info-app-keybindings": "Edit berkas pemetaan tombol atau atur ulang pintasan.", - "settings-info-app-keyboard-mode": "Pilih bagaimana papan ketik perangkat lunak berperilaku ketika mengedit.", + "settings-info-app-keyboard-mode": "Pilih perilaku papan ketik perangkat lunak saat mengedit.", "settings-info-app-language": "Pilih bahasa aplikasi dan label yang diterjemahkan.", - "settings-info-app-open-file-list-position": "Pilih dimana daftar berkas aktif muncul.", - "settings-info-app-quick-tools-settings": "Urutkan ulang dan kustomisaikan pintasan alat cepat.", - "settings-info-app-quick-tools-trigger-mode": "Pilih bagaimana alat cepat terbuka saat ditekan atau disentuh.", - "settings-info-app-remember-files": "Buka ulang berkas yang dibuka terakhir kali.", - "settings-info-app-remember-folders": "Buka ulang folder dari sesi sebelumnya.", - "settings-info-app-retry-remote-fs": "Ulangi lagi operasi berkas jarak jauh setelah transfer gagal.", + "settings-info-app-open-file-list-position": "Pilih di mana daftar berkas aktif muncul.", + "settings-info-app-quick-tools-settings": "Urutkan ulang dan sesuaikan pintasan alat cepat.", + "settings-info-app-quick-tools-trigger-mode": "Pilih cara alat cepat terbuka saat ditekan atau disentuh.", + "settings-info-app-remember-files": "Buka kembali berkas yang terakhir dibuka.", + "settings-info-app-remember-folders": "Buka kembali folder dari sesi sebelumnya.", + "settings-info-app-retry-remote-fs": "Ulangi operasi berkas jarak jauh setelah transfer gagal.", "settings-info-app-side-buttons": "Tampilkan tombol aksi ekstra di samping editor.", "settings-info-app-sponsor-sidebar": "Tampilkan entri sponsor di bar samping.", - "settings-info-app-touch-move-threshold": "Pergerakan minimum sebelum penyeretan sentuh terdeteksi.", - "settings-info-app-vibrate-on-tap": "Aktifkan umpan balik getar untuk tekan dan kendali.", + "settings-info-app-touch-move-threshold": "Pergerakan minimum sebelum gestur seret sentuh terdeteksi.", + "settings-info-app-vibrate-on-tap": "Aktifkan umpan balik getar untuk ketukan dan kontrol.", "settings-info-editor-autosave": "Simpan perubahan secara otomatis setelah jeda.", - "settings-info-editor-color-preview": "Pratinjau nilai warna langsung di dalam editor.", - "settings-info-editor-fade-fold-widgets": "Redupkan penanda lipatan hingga dibutuhkan.", + "settings-info-editor-color-preview": "Pratinjau nilai warna secara langsung di dalam editor.", + "settings-info-editor-fade-fold-widgets": "Redupkan penanda lipatan hingga diperlukan.", "settings-info-editor-font-family": "Pilih tipe font yang digunakan di dalam editor.", "settings-info-editor-font-size": "Atur ukuran teks di editor.", - "settings-info-editor-format-on-save": "Jalankan pemformat ketika sebuah berkas tersimpan.", - "settings-info-editor-hard-wrap": "Masukkan pemotong baris asli daripada hanya membungkusnya secara visual.", - "settings-info-editor-indent-guides": "Tampilkan baris panduan indentasi.", - "settings-info-editor-line-height": "Atur jarak vertikal diantara baris.", + "settings-info-editor-format-on-save": "Jalankan pemformat saat berkas disimpan.", + "settings-info-editor-hard-wrap": "Sisipkan pemotong baris asli daripada hanya membungkusnya secara visual.", + "settings-info-editor-indent-guides": "Tampilkan garis panduan indentasi.", + "settings-info-editor-line-height": "Atur jarak vertikal antarbaris.", "settings-info-editor-line-numbers": "Tampilkan nomor baris di dalam gutter.", "settings-info-editor-lint-gutter": "Tampilkan alat diagnostik dan penanda lint di gutter.", "settings-info-editor-live-autocomplete": "Tampilkan saran ketika Anda mengetik.", - "settings-info-editor-rainbow-brackets": "Warna menyamakan kurung dari kedalaman bersarang.", + "settings-info-editor-rainbow-brackets": "Warnai tanda kurung berdasarkan kedalaman bersarang.", "settings-info-editor-relative-line-numbers": "Tampilkan jarak dari baris saat ini.", - "settings-info-editor-rtl-text": "Ganti perilaku kanan-ke-kiri setiap baris.", - "settings-info-editor-scroll-settings": "Atur ukuran bar gulir, kecepatan, dan perilaku gestur.", - "settings-info-editor-shift-click-selection": "Perluas pemilihan dengan Shift + tekan atau klik.", - "settings-info-editor-show-spaces": "Tampilkan penanda spasi dan jeda baris yang terlihat.", - "settings-info-editor-soft-tab": "Masukkan spasi daripada karakter tab.", - "settings-info-editor-tab-size": "Atur seberapa banyak spasi setiap langkah tab digunakan.", + "settings-info-editor-rtl-text": "Ganti perilaku kanan-ke-kiri per baris.", + "settings-info-editor-scroll-settings": "Atur ukuran bilah gulir, kecepatan, dan perilaku gestur.", + "settings-info-editor-shift-click-selection": "Perluas pemilihan dengan Shift + ketuk atau klik.", + "settings-info-editor-show-spaces": "Tampilkan penanda spasi dan pemotong baris yang terlihat.", + "settings-info-editor-soft-tab": "Sisipkan spasi sebagai pengganti karakter tab.", + "settings-info-editor-tab-size": "Atur jumlah spasi yang digunakan setiap langkah tab.", "settings-info-editor-teardrop-size": "Atur ukuran penangan kursor untuk pengeditan sentuh.", "settings-info-editor-text-wrap": "Bungkus baris panjang di dalam editor.", - "settings-info-lsp-add-custom-server": "Daftarkan server bahasa kustom dengan perintah pasang, perbarui, dan luncur.", - "settings-info-lsp-edit-init-options": "Edit opsi inisiasi sebagai JSON.", + "settings-info-lsp-add-custom-server": "Daftarkan server bahasa kustom dengan perintah pasang, perbarui, dan luncurkan.", + "settings-info-lsp-edit-init-options": "Edit opsi inisialisasi sebagai JSON.", "settings-info-lsp-install-server": "Pasang atau perbaiki server bahasa ini.", "settings-info-lsp-server-enabled": "Aktifkan atau nonaktifkan server bahasa ini.", - "settings-info-lsp-startup-timeout": "Atur seberapa lama Acode menunggu untuk server memulai.", + "settings-info-lsp-startup-timeout": "Atur durasi tunggu Acode untuk server mulai.", "settings-info-lsp-uninstall-server": "Hapus paket terpasang atau biner dari server ini.", - "settings-info-lsp-update-server": "Perbarui server bahasa ini jika alur pembaruan tersedia.", - "settings-info-lsp-view-init-options": "Lihat opsi inisiasi efektif sebagai JSON.", + "settings-info-lsp-update-server": "Perbarui server bahasa ini jika jalur pembaruan tersedia.", + "settings-info-lsp-view-init-options": "Lihat opsi inisialisasi efektif sebagai JSON.", "settings-info-main-ad-rewards": "Tonton iklan untuk membuka akses bebas iklan sementara.", "settings-info-main-app-settings": "Bahasa, perilaku aplikasi, dan alat akses cepat.", - "settings-info-main-backup-restore": "Ekspor pengaturan ke pencadangan atau atur ulang mereka nanti.", - "settings-info-main-changelog": "Lihat perbaruan saat ini dan catatan rilis.", - "settings-info-main-edit-settings": "Edit berkas mentah settings.json secara langsung.", + "settings-info-main-backup-restore": "Ekspor pengaturan ke cadangan atau pulihkan nanti.", + "settings-info-main-changelog": "Lihat pembaruan saat ini dan catatan rilis.", + "settings-info-main-edit-settings": "Edit berkas settings.json secara langsung.", "settings-info-main-editor-settings": "Font, tab, saran, dan tampilan editor.", "settings-info-main-formatter": "Pilih pemformat untuk setiap bahasa yang didukung.", "settings-info-main-lsp-settings": "Konfigurasi server bahasa dan kecerdasan editor.", @@ -697,25 +697,25 @@ "settings-info-main-rateapp": "Nilai Acode di Google Play.", "settings-info-main-remove-ads": "Buka akses permanen bebas iklan.", "settings-info-main-reset": "Atur ulang Acode ke konfigurasi bawaannya.", - "settings-info-main-sponsors": "Mendukung pengembangan Acode yang berkelanjutan.", + "settings-info-main-sponsors": "Dukung pengembangan Acode secara berkelanjutan.", "settings-info-main-terminal-settings": "Tema Terminal, font, kursor, dan perilaku sesi.", "settings-info-main-theme": "Tema aplikasi, kontras, dan warna kustom.", "settings-info-preview-disable-cache": "Selalu muat ulang konten di dalam peramban-dalam-aplikasi.", "settings-info-preview-host": "Nama host yang digunakan ketika membuka URL pratinjau.", - "settings-info-preview-mode": "Pilih dimana pratinjau dibuka ketika Anda meluncurkannya.", + "settings-info-preview-mode": "Pilih di mana pratinjau dibuka saat Anda meluncurkannya.", "settings-info-preview-preview-port": "Port yang digunakan oleh server pratinjau langsung.", "settings-info-preview-server-port": "Port yang digunakan oleh server internal aplikasi.", "settings-info-preview-show-console-toggler": "Tampilkan tombol konsol di dalam pratinjau.", "settings-info-preview-use-current-file": "Utamakan berkas saat ini ketika memulai pratinjau.", - "settings-info-terminal-convert-eol": "Konversikan akhiran baris saat menempelkan atau menampilkan output terminal.", + "settings-info-terminal-convert-eol": "Konversikan akhir baris saat menempel atau menampilkan keluaran terminal.", "settings-note-formatter-settings": "Tetapkan pemformat untuk setiap bahasa. Pasang plugin pemformat untuk membuka lebih banyak opsi.", - "settings-note-lsp-settings": "Server bahasa menambahkan penyelesaian otomatis, diagnostik, detail melayang, dan sebagainya. Mereka bekerja lebih baik dengan folder yang bisa diakses langsung oleh terminal bawaan Acode, seperti folder terminal/publik. Lokasi SAF, eksternal, dan jarak jauh dilewati secara default karena mereka mungkin menggunakan jalur yang di-cache atau virtual; aktifkan opsi kompatibilitas hanya jika Anda ingin mencobanya.", + "settings-note-lsp-settings": "Server bahasa menambahkan penyelesaian otomatis, diagnostik, informasi saat kursor diarahkan, dan sebagainya. Server bekerja lebih baik dengan folder yang dapat diakses langsung oleh terminal bawaan Acode, seperti folder terminal/publik. Lokasi SAF, eksternal, dan jarak jauh dilewati secara bawaan karena mungkin menggunakan jalur yang di-cache atau virtual; aktifkan opsi kompatibilitas hanya jika Anda ingin mencobanya.", "search result label singular": "hasil", "search result label plural": "hasil", "pin tab": "Sematkan tab", "unpin tab": "Lepas sematan tab", "pinned tab": "Tab yang tersematkan", - "unpin tab before closing": "Lepas sematan tab sebelum ditutup.", + "unpin tab before closing": "Lepas sematan tab sebelum menutupnya.", "app font": "Font Aplikasi", "app icon": "App icon", "app icon changed": "App icon changed", @@ -724,52 +724,52 @@ "lsp-transport-method-stdio": "STDIO (luncurkan perintah biner)", "lsp-transport-method-websocket": "WebSocket (hubungkan ke sebuah URL ws/wss)", "lsp-websocket-url": "URL WebSocket", - "lsp-websocket-server-managed-externally": "Server ini dikelola secara eksternal lewat WebSocket.", - "lsp-error-websocket-url-invalid": "URL WebSocket harus berawalan ws:// atau wss://", - "lsp-error-websocket-url-required": "URL WebSocket diperlukan", + "lsp-websocket-server-managed-externally": "Server ini dikelola secara eksternal melalui WebSocket.", + "lsp-error-websocket-url-invalid": "URL WebSocket harus diawali dengan ws:// atau wss://.", + "lsp-error-websocket-url-required": "URL WebSocket diperlukan.", "lsp-remove-custom-server": "Hapus server kustom", "lsp-remove-custom-server-confirm": "Hapus server bahasa kustom {server}?", "lsp-custom-server-removed": "Server kustom dihapus", "settings-info-lsp-remove-custom-server": "Hapus server bahasa kustom ini dari Acode.", - "unsaved selected tabs warning": "Beberapa tab terpilih tidak disimpan. Pilih apa yang harus dilakukan.", + "unsaved selected tabs warning": "Beberapa tab yang dipilih belum disimpan. Pilih tindakan yang akan dilakukan.", "save selected tabs": "Simpan tab terpilih", "close selected tabs": "Tutup tab terpilih", - "save selected tabs warning": "Apakah Anda yakin ingin menyimpan dan menutup tab terpilih?", - "close selected tabs warning": "Apakah Anda yakin ingin menutup tab terpilih? Anda akan kehilangan perubahan yang belum disimpan dan aksi ini tidak dapat dibatalkan.", + "save selected tabs warning": "Apakah Anda yakin ingin menyimpan dan menutup tab yang dipilih?", + "close selected tabs warning": "Apakah Anda yakin ingin menutup tab yang dipilih? Anda akan kehilangan perubahan yang belum disimpan dan tindakan ini tidak dapat diurungkan.", "close tabs to right": "Tutup Kanan", "close tabs to left": "Tutup Kiri", "close other tabs": "Tutup Lainnya", "auto close tags": "Penutup tag otomatis", - "settings-info-editor-auto-close-tags": "Menyisipkan tag penutup di berkas HTML, XML, Vue, Angular, dan templat PHP secara otomatis.", + "settings-info-editor-auto-close-tags": "Sisipkan tag penutup secara otomatis di berkas HTML, XML, Vue, Angular, dan templat PHP.", "ui zoom": "Pembesaran UI", "settings-info-app-ui-zoom": "Skalakan teks di seluruh antarmuka Acode.", "show share button": "Tampilkan tombol bagikan", "settings-info-editor-show-share-button": "Tampilkan tombol bagikan di menu pemilihan.", "plugin-not-supported": "Plugin tidak didukung", "plugin-not-supported-info": "Plugin dibuat untuk versi lama dari Acode.", - "login-to-view": "Mohon login untuk melihat ini...", + "login-to-view": "Mohon masuk untuk melihat ini...", "iap-plugin-purchase-warning": "Plugin yang dibeli tidak disinkronkan ke akun Acode Anda. Gunakan akun Google yang sama di Play Store untuk memulihkan pembelian Anda.", "iap-pro-purchase-warning": "Pembelian ini tidak akan disinkronkan ke akun Acode Anda. Gunakan akun Google yang sama di Play Store untuk memulihkan pembelian Anda.", "confirm-login": "Anda belum masuk ke Acode, masuk sekarang?", "local word completion": "Penyelesaian kata lokal", "language package completion": "Penyelesaian paket bahasa", "settings-info-editor-local-word-completion": "Sarankan kata dari berkas saat ini.", - "settings-info-editor-language-completion": "Sarankan kata kunci, snippet, dan penyelesaian lainnya dari paket bahasa CodeMirror.", + "settings-info-editor-language-completion": "Sarankan kata kunci, cuplikan, dan penyelesaian lainnya dari paket bahasa CodeMirror.", "terminal:failsafe": "Mode FailSafe", - "terminal:failsafe-info": "Mulai terminal dengan shell sistem", + "terminal:failsafe-info": "Mulai terminal dengan shell sistem.", "auto rename tags": "Ubah nama tag otomatis", - "settings-info-editor-auto-rename-tags": "Ubah nama tag pembuka atau penutup yang sama ketika mengedit tag yang mirip HTML.", + "settings-info-editor-auto-rename-tags": "Ubah nama tag pembuka atau penutup yang berpasangan saat mengedit tag mirip HTML.", "copying items": "Menyalin {count} item...", - "cannot paste folder into itself": "Tidak bisa menempelkan folder ke dalam dirinya sendiri", + "cannot paste folder into itself": "Tidak dapat menempelkan folder ke dalam dirinya sendiri.", "folder already exists": "Folder sudah ada", "file already exists force named": "'{name}' sudah ada. Timpa?", "lsp-allow-non-terminal-workspace": "Jalankan LSP di folder eksternal", - "settings-info-lsp-allow-non-terminal-workspace": "Izinkan server bahasa untuk lokasi SAF, eksternal, dan jarak jauh. LSP berjalan di terminal bawaan Acode, yang tidak dapat mengakses lokasi tersebut, jadi fitur-fitur mungkin tidak dapat bekerja dengan benar. Karena itu akan terhubung ke jalur virtual atau lokasi cache.", + "settings-info-lsp-allow-non-terminal-workspace": "Izinkan server bahasa untuk lokasi SAF, eksternal, dan jarak jauh. LSP berjalan di terminal bawaan Acode yang tidak dapat mengakses lokasi tersebut, sehingga beberapa fitur mungkin tidak dapat bekerja dengan benar karena akan terhubung ke jalur virtual atau lokasi cache.", "don't ask again": "Jangan tanyakan lagi", "scrollbar height": "Tinggi bilah gulir", "full": "Penuh", "scroll past end": "Gulir melewati akhir", - "settings-info-scroll-past-end": "Menambahkan spasi kosong ekstra di bawah editor, memungkinkan Anda untuk gulir baris terakhir ke atas.", + "settings-info-scroll-past-end": "Menambahkan ruang kosong tambahan di bawah editor, sehingga Anda dapat menggulirkan baris terakhir ke atas.", "compact": "Ringkas", "off": "Mati", "quick tools height": "Tinggi alat cepat", @@ -778,9 +778,9 @@ "recommend extensions": "Rekomendasikan ekstensi", "settings-info-editor-recommend-extensions": "Sarankan plugin saat file dibuka sebagai teks biasa karena mode bahasa tidak tersedia.", "extension recommendation title": "Ekstensi yang tersedia untuk {extension}", - "extension recommendation message": "Tidak ada mode sintaksis yang diinstal untuk {extension}. Cari plugin untuk \"{keyword}\".", + "extension recommendation message": "Tidak ada mode sintaksis yang terpasang untuk {extension}. Cari plugin untuk \"{keyword}\".", "extension request title": "Ekstensi tidak ditemukan untuk {extension}", - "extension request message": "Minta plugin agar Acode dapat menyoroti jenis file ini.", + "extension request message": "Minta plugin agar Acode dapat menyoroti jenis berkas ini.", "search plugins": "Cari plugin", "request plugin": "Minta plugin", "terminal:block": "Blok", @@ -836,11 +836,43 @@ "info-terminal-show-scrollbar": "Tampilkan bilah gulir xterm di samping terminal.", "terminal:show scrollbar": "Tampilkan Bilah Gulir", "apply exclusions when copying": "Terapkan pengecualian saat menyalin", - "settings-info-app-use-file-operation-exclusions": "Lewati file dan folder yang cocok dengan pola pengecualian selama operasi salin dan tempel.", + "settings-info-app-use-file-operation-exclusions": "Lewati berkas dan folder yang cocok dengan pola pengecualian selama operasi salin dan tempel.", "horizontal scroll margin": "Margin gulir horizontal", - "settings-info-horizontal-scroll-margin": "Menambahkan ruang kosong setelah baris terpanjang saat pembungkusan kata (word wrap) nonaktif. Masukkan nilai piksel utuh non-negatif apa pun.", + "settings-info-horizontal-scroll-margin": "Menambahkan ruang kosong setelah baris terpanjang saat pembungkus kata (word wrap) dinonaktifkan. Masukkan nilai piksel bilangan bulat non-negatif.", "confirm app icon reward": "Tonton satu iklan berhadiah untuk menerapkan ikon aplikasi ini?", "rewarded ad unavailable": "Iklan berhadiah saat ini tidak tersedia. Silakan coba lagi.", "rewarded ad failed": "Iklan tidak dapat diselesaikan. Silakan coba lagi.", - "rewarded ad incomplete": "Tonton iklan hingga selesai untuk mendapatkan hadiah." + "rewarded ad incomplete": "Tonton iklan hingga selesai untuk mendapatkan hadiah.", + "plugin-review:dialog-label": "Ulasan plugin", + "plugin-review:account-check-failed": "Akun Anda tidak dapat diperiksa. Coba lagi.", + "plugin-review:sign-in": "Masuk untuk memberi ulasan", + "plugin-review:edit": "Edit ulasan Anda", + "plugin-review:add": "Tambahkan ulasan...", + "plugin-review:placeholder": "Bagikan pengalaman Anda...", + "plugin-review:input-label": "Ulasan plugin", + "plugin-review:vote-group-label": "Suara", + "plugin-review:thumbs-up": "Suka", + "plugin-review:thumbs-down": "Tidak suka", + "plugin-review:delete": "Hapus ulasan", + "plugin-review:load-failed": "Ulasan tidak dapat dimuat.", + "plugin-review:retry": "Coba lagi", + "plugin-review:empty-title": "Belum ada ulasan", + "plugin-review:empty-description": "Jadilah yang pertama membagikan pengalaman Anda.", + "plugin-review:yours": "Ulasan Anda", + "plugin-review:community": "Ulasan komunitas", + "plugin-review:no-other-reviews": "Belum ada ulasan lain.", + "plugin-review:login-incomplete": "Proses masuk tidak selesai.", + "plugin-review:sign-in-failed": "Tidak dapat masuk.", + "plugin-review:session-expired-review": "Sesi Anda telah berakhir. Masuk lagi untuk memberi ulasan.", + "plugin-review:save-failed": "Ulasan tidak dapat disimpan.", + "plugin-review:delete-confirmation": "Hapus ulasan Anda? Tindakan ini tidak dapat dibatalkan.", + "plugin-review:session-expired-continue": "Sesi Anda telah berakhir. Masuk lagi untuk melanjutkan.", + "plugin-review:delete-failed": "Ulasan tidak dapat dihapus.", + "plugin-review:you": "Anda", + "plugin-review:edit-action": "Edit ulasan", + "plugin-review:recommended": "Merekomendasikan plugin ini", + "plugin-review:error-max-length": "Ulasan harus terdiri dari {max} karakter atau kurang.", + "plugin-review:error-downvote-comment": "Beri tahu developer apa yang dapat ditingkatkan.", + "plugin-review:error-empty": "Tambahkan komentar atau pilih Suka.", + "plugin-review:unrated": "Belum dinilai" } diff --git a/src/lang/index.d.ts b/src/lang/index.d.ts index 84a5387d7c..b8291061ed 100644 --- a/src/lang/index.d.ts +++ b/src/lang/index.d.ts @@ -846,6 +846,38 @@ declare type LangStrings = { "rewarded ad unavailable": string; "rewarded ad failed": string; "rewarded ad incomplete": string; + "plugin-review:dialog-label": string; + "plugin-review:account-check-failed": string; + "plugin-review:sign-in": string; + "plugin-review:edit": string; + "plugin-review:add": string; + "plugin-review:placeholder": string; + "plugin-review:input-label": string; + "plugin-review:vote-group-label": string; + "plugin-review:thumbs-up": string; + "plugin-review:thumbs-down": string; + "plugin-review:delete": string; + "plugin-review:load-failed": string; + "plugin-review:retry": string; + "plugin-review:empty-title": string; + "plugin-review:empty-description": string; + "plugin-review:yours": string; + "plugin-review:community": string; + "plugin-review:no-other-reviews": string; + "plugin-review:login-incomplete": string; + "plugin-review:sign-in-failed": string; + "plugin-review:session-expired-review": string; + "plugin-review:save-failed": string; + "plugin-review:delete-confirmation": string; + "plugin-review:session-expired-continue": string; + "plugin-review:delete-failed": string; + "plugin-review:you": string; + "plugin-review:edit-action": string; + "plugin-review:recommended": string; + "plugin-review:error-max-length": string; + "plugin-review:error-downvote-comment": string; + "plugin-review:error-empty": string; + "plugin-review:unrated": string; }; declare var strings: LangStrings; diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json index c1ef78a612..8d7957a6f7 100644 --- a/src/lang/ir-fa.json +++ b/src/lang/ir-fa.json @@ -842,5 +842,37 @@ "confirm app icon reward": "برای اعمال این نماد برنامه، یک تبلیغ پاداش‌دار تماشا می‌کنید؟", "rewarded ad unavailable": "تبلیغات پاداش‌دار در حال حاضر در دسترس نیستند. لطفاً دوباره تلاش کنید.", "rewarded ad failed": "تبلیغ کامل نشد. لطفاً دوباره تلاش کنید.", - "rewarded ad incomplete": "برای دریافت پاداش، تبلیغ را تا پایان تماشا کنید." + "rewarded ad incomplete": "برای دریافت پاداش، تبلیغ را تا پایان تماشا کنید.", + "plugin-review:dialog-label": "نظرهای افزونه", + "plugin-review:account-check-failed": "امکان بررسی حساب شما نبود. دوباره تلاش کنید.", + "plugin-review:sign-in": "برای ثبت نظر وارد شوید", + "plugin-review:edit": "نظر خود را ویرایش کنید", + "plugin-review:add": "افزودن نظر...", + "plugin-review:placeholder": "تجربهٔ خود را به اشتراک بگذارید...", + "plugin-review:input-label": "نظر افزونه", + "plugin-review:vote-group-label": "رأی", + "plugin-review:thumbs-up": "پسندیدم", + "plugin-review:thumbs-down": "نپسندیدم", + "plugin-review:delete": "حذف نظر", + "plugin-review:load-failed": "بارگیری نظرها ممکن نبود.", + "plugin-review:retry": "تلاش دوباره", + "plugin-review:empty-title": "هنوز نظری ثبت نشده است", + "plugin-review:empty-description": "نخستین نفری باشید که تجربهٔ خود را به اشتراک می‌گذارد.", + "plugin-review:yours": "نظر شما", + "plugin-review:community": "نظرهای کاربران", + "plugin-review:no-other-reviews": "هنوز نظر دیگری ثبت نشده است.", + "plugin-review:login-incomplete": "ورود کامل نشد.", + "plugin-review:sign-in-failed": "ورود ممکن نبود.", + "plugin-review:session-expired-review": "نشست شما منقضی شده است. برای ثبت نظر دوباره وارد شوید.", + "plugin-review:save-failed": "ذخیرهٔ نظر ممکن نبود.", + "plugin-review:delete-confirmation": "نظر شما حذف شود؟ این کار قابل بازگشت نیست.", + "plugin-review:session-expired-continue": "نشست شما منقضی شده است. برای ادامه دوباره وارد شوید.", + "plugin-review:delete-failed": "حذف نظر ممکن نبود.", + "plugin-review:you": "شما", + "plugin-review:edit-action": "ویرایش نظر", + "plugin-review:recommended": "این افزونه را پیشنهاد کرده است", + "plugin-review:error-max-length": "نظر باید حداکثر {max} نویسه باشد.", + "plugin-review:error-downvote-comment": "به توسعه‌دهنده بگویید چه چیزی می‌تواند بهتر شود.", + "plugin-review:error-empty": "یک دیدگاه بنویسید یا «پسندیدم» را انتخاب کنید.", + "plugin-review:unrated": "بدون امتیاز" } diff --git a/src/lang/it-it.json b/src/lang/it-it.json index 775c346e91..9d09694c3c 100644 --- a/src/lang/it-it.json +++ b/src/lang/it-it.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Guardare un annuncio con ricompensa per applicare questa icona dell’app?", "rewarded ad unavailable": "Gli annunci con ricompensa non sono disponibili al momento. Riprova.", "rewarded ad failed": "Non è stato possibile completare l’annuncio. Riprova.", - "rewarded ad incomplete": "Guarda l’annuncio fino alla fine per ottenere la ricompensa." + "rewarded ad incomplete": "Guarda l’annuncio fino alla fine per ottenere la ricompensa.", + "plugin-review:dialog-label": "Recensioni del plugin", + "plugin-review:account-check-failed": "Impossibile verificare il tuo account. Riprova.", + "plugin-review:sign-in": "Accedi per lasciare una recensione", + "plugin-review:edit": "Modifica la tua recensione", + "plugin-review:add": "Aggiungi una recensione…", + "plugin-review:placeholder": "Condividi la tua esperienza…", + "plugin-review:input-label": "Recensione del plugin", + "plugin-review:vote-group-label": "Voto", + "plugin-review:thumbs-up": "Mi piace", + "plugin-review:thumbs-down": "Non mi piace", + "plugin-review:delete": "Elimina recensione", + "plugin-review:load-failed": "Impossibile caricare le recensioni.", + "plugin-review:retry": "Riprova", + "plugin-review:empty-title": "Ancora nessuna recensione", + "plugin-review:empty-description": "Condividi per primo la tua esperienza.", + "plugin-review:yours": "La tua recensione", + "plugin-review:community": "Recensioni della community", + "plugin-review:no-other-reviews": "Ancora nessun'altra recensione.", + "plugin-review:login-incomplete": "Accesso non completato.", + "plugin-review:sign-in-failed": "Impossibile accedere.", + "plugin-review:session-expired-review": "La sessione è scaduta. Accedi di nuovo per lasciare una recensione.", + "plugin-review:save-failed": "Impossibile salvare la recensione.", + "plugin-review:delete-confirmation": "Eliminare la tua recensione? Questa azione non può essere annullata.", + "plugin-review:session-expired-continue": "La sessione è scaduta. Accedi di nuovo per continuare.", + "plugin-review:delete-failed": "Impossibile eliminare la recensione.", + "plugin-review:you": "Tu", + "plugin-review:edit-action": "Modifica recensione", + "plugin-review:recommended": "Consiglia questo plugin", + "plugin-review:error-max-length": "La recensione deve contenere al massimo {max} caratteri.", + "plugin-review:error-downvote-comment": "Spiega allo sviluppatore cosa potrebbe essere migliorato.", + "plugin-review:error-empty": "Aggiungi un commento o scegli Mi piace.", + "plugin-review:unrated": "Non valutato" } diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json index 326b525fc2..9901ac78ac 100644 --- a/src/lang/ja-jp.json +++ b/src/lang/ja-jp.json @@ -842,5 +842,37 @@ "confirm app icon reward": "リワード広告を1本視聴して、このアプリアイコンを適用しますか?", "rewarded ad unavailable": "現在リワード広告を利用できません。もう一度お試しください。", "rewarded ad failed": "広告を完了できませんでした。もう一度お試しください。", - "rewarded ad incomplete": "報酬を獲得するには、広告を最後まで視聴してください。" + "rewarded ad incomplete": "報酬を獲得するには、広告を最後まで視聴してください。", + "plugin-review:dialog-label": "プラグインのレビュー", + "plugin-review:account-check-failed": "アカウントを確認できませんでした。もう一度お試しください。", + "plugin-review:sign-in": "ログインしてレビュー", + "plugin-review:edit": "レビューを編集", + "plugin-review:add": "レビューを追加…", + "plugin-review:placeholder": "使用した感想を共有…", + "plugin-review:input-label": "プラグインのレビュー", + "plugin-review:vote-group-label": "評価", + "plugin-review:thumbs-up": "高評価", + "plugin-review:thumbs-down": "低評価", + "plugin-review:delete": "レビューを削除", + "plugin-review:load-failed": "レビューを読み込めませんでした。", + "plugin-review:retry": "再試行", + "plugin-review:empty-title": "まだレビューはありません", + "plugin-review:empty-description": "最初のレビューを投稿しましょう。", + "plugin-review:yours": "あなたのレビュー", + "plugin-review:community": "コミュニティのレビュー", + "plugin-review:no-other-reviews": "ほかのレビューはまだありません。", + "plugin-review:login-incomplete": "ログインが完了しませんでした。", + "plugin-review:sign-in-failed": "ログインできませんでした。", + "plugin-review:session-expired-review": "セッションの有効期限が切れました。もう一度ログインしてレビューしてください。", + "plugin-review:save-failed": "レビューを保存できませんでした。", + "plugin-review:delete-confirmation": "レビューを削除しますか?この操作は元に戻せません。", + "plugin-review:session-expired-continue": "セッションの有効期限が切れました。続行するにはもう一度ログインしてください。", + "plugin-review:delete-failed": "レビューを削除できませんでした。", + "plugin-review:you": "あなた", + "plugin-review:edit-action": "レビューを編集", + "plugin-review:recommended": "このプラグインをおすすめしています", + "plugin-review:error-max-length": "レビューは {max} 文字以内で入力してください。", + "plugin-review:error-downvote-comment": "改善してほしい点を開発者に伝えてください。", + "plugin-review:error-empty": "コメントを追加するか、高評価を選んでください。", + "plugin-review:unrated": "未評価" } diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json index b24526e9f9..1e1a369da5 100644 --- a/src/lang/ko-kr.json +++ b/src/lang/ko-kr.json @@ -842,5 +842,37 @@ "confirm app icon reward": "보상형 광고 한 편을 시청하고 이 앱 아이콘을 적용할까요?", "rewarded ad unavailable": "현재 보상형 광고를 이용할 수 없습니다. 다시 시도해 주세요.", "rewarded ad failed": "광고를 완료하지 못했습니다. 다시 시도해 주세요.", - "rewarded ad incomplete": "보상을 받으려면 광고를 끝까지 시청하세요." + "rewarded ad incomplete": "보상을 받으려면 광고를 끝까지 시청하세요.", + "plugin-review:dialog-label": "플러그인 리뷰", + "plugin-review:account-check-failed": "계정을 확인할 수 없습니다. 다시 시도하세요.", + "plugin-review:sign-in": "로그인하고 리뷰 작성", + "plugin-review:edit": "내 리뷰 수정", + "plugin-review:add": "리뷰 추가...", + "plugin-review:placeholder": "사용 경험을 공유하세요...", + "plugin-review:input-label": "플러그인 리뷰", + "plugin-review:vote-group-label": "평가", + "plugin-review:thumbs-up": "좋아요", + "plugin-review:thumbs-down": "싫어요", + "plugin-review:delete": "리뷰 삭제", + "plugin-review:load-failed": "리뷰를 불러올 수 없습니다.", + "plugin-review:retry": "다시 시도", + "plugin-review:empty-title": "아직 리뷰가 없습니다", + "plugin-review:empty-description": "첫 번째로 사용 경험을 공유해 보세요.", + "plugin-review:yours": "내 리뷰", + "plugin-review:community": "커뮤니티 리뷰", + "plugin-review:no-other-reviews": "아직 다른 리뷰가 없습니다.", + "plugin-review:login-incomplete": "로그인이 완료되지 않았습니다.", + "plugin-review:sign-in-failed": "로그인할 수 없습니다.", + "plugin-review:session-expired-review": "세션이 만료되었습니다. 다시 로그인하고 리뷰를 작성하세요.", + "plugin-review:save-failed": "리뷰를 저장할 수 없습니다.", + "plugin-review:delete-confirmation": "리뷰를 삭제할까요? 이 작업은 되돌릴 수 없습니다.", + "plugin-review:session-expired-continue": "세션이 만료되었습니다. 계속하려면 다시 로그인하세요.", + "plugin-review:delete-failed": "리뷰를 삭제할 수 없습니다.", + "plugin-review:you": "나", + "plugin-review:edit-action": "리뷰 수정", + "plugin-review:recommended": "이 플러그인을 추천함", + "plugin-review:error-max-length": "리뷰는 {max}자 이하여야 합니다.", + "plugin-review:error-downvote-comment": "개발자에게 개선할 점을 알려 주세요.", + "plugin-review:error-empty": "댓글을 추가하거나 좋아요를 선택하세요.", + "plugin-review:unrated": "평가 없음" } diff --git a/src/lang/ln-ln.json b/src/lang/ln-ln.json new file mode 100644 index 0000000000..b86fe9d345 --- /dev/null +++ b/src/lang/ln-ln.json @@ -0,0 +1,846 @@ +{ + "lang": "Lingala", + "about": "Mpo na yango", + "active files": "Ba fichier efungwami", + "alert": "Likebisi", + "app theme": "Motó ya application", + "autocorrect": "Pesa nzela na bobongisi ya automatique ?", + "autosave": "Kobomba yango moko", + "cancel": "Tika", + "change language": "Bobongola monoko", + "choose color": "Pona langi moko", + "clear": "Longola", + "close app": "Kanga app ?", + "commit message": "Nsango ya commit", + "console": "Konsole", + "copy": "Kopi", + "create folder error": "Ekoki, te kosala dossier ya sika.", + "cut": "Kata", + "delete": "Longola", + "dependencies": "Ba dépendance", + "delay": "Ntango ya kozela na millisecondes", + "editor settings": "Paramɛtrɛ ya mobongisi", + "editor theme": "Motó ya mobongisi", + "enter file name": "Koma nkombo ya fichier", + "enter folder name": "Koma nkombo ya dossier", + "empty folder message": "Dossier ezali mpamba", + "enter line number": "Koma nimero ya ligne", + "error": "Libunga", + "failed": "Elongi te", + "file already exists": "Fichier ezali déjà", + "file already exists force": "Fichier ezali déjà. Kokoma lisusu?", + "file changed": " has been changed, reload file?", + "file deleted": "Fichier elongolami", + "file is not supported": "Fichier oyo esungami te", + "file not supported": "Lolenge ya fichier oyo esungami te.", + "file too large": "Fichier ezali monene mingi mpo na kosalela yango. Bonene ya likolo ezali {size}", + "file renamed": "Nkombo ya fichier ebongwani", + "file saved": "Fichier ebombami", + "folder added": "Dossier ebakisami", + "folder already added": "Dossier ebakisami déjà", + "font size": "Bonene ya makomi", + "goto": "Kende na ligne", + "icons definition": "Ndimbola ya bilembo", + "info": "Sango", + "invalid value": "Valeur ezali malamu te", + "language changed": "Monoko ebongwani malamu", + "linting": "Tala libunga ya syntaxe", + "logout": "Bima", + "loading": "Ezali kokɔtisa", + "my profile": "Profil na ngai", + "new file": "Fichier ya sika", + "new folder": "Dossier ya sika", + "no": "Te", + "no editor message": "Fungola to sala fichier mpe dossier ya sika na menu", + "not set": "Etamwisami te", + "unsaved files close app": "Ba fichiers mosusu ebombami nanu te. Kanga application?", + "notice": "Mayebisi", + "open file": "Fungola fichier", + "open files and folders": "Fungola ba fichiers mpe ba dossiers", + "open folder": "Fungola dossier", + "open recent": "Fungola oyo euti kosalelama sika", + "ok": "OK", + "overwrite": "Koma likolo", + "paste": "Kangisa", + "preview mode": "Mode ya botali liboso", + "read only file": "Ekoki te kobomba fichier ya kotanga kaka. Meká Bomba lokola", + "reload": "Zongisa", + "rename": "Pesa kombo mosusu", + "replace": "Zongisa na esika", + "required": "Esika oyo esengeli kotondisama", + "run your web app": "Tambwisa application web na yo", + "save": "Bomba", + "saving": "Ezali kobomba", + "save as": "Bomba lokola", + "save file to run": "Bomba fichier oyo liboso ya kotambwisa yango na navigateur", + "search": "Luka", + "see logs and errors": "Tala ba logs mpe mabunga", + "select folder": "Pona dossier", + "settings": "Paramɛtrɛ", + "settings saved": "Paramɛtrɛ ebombami", + "show line numbers": "Lakisa mituya ya ba lignes", + "show hidden files": "Lakisa ba fichiers oyo ebombami", + "show spaces": "Lakisa ba espaces", + "soft tab": "Tab ya pete", + "sort by name": "Tanda na kotalela kombo", + "success": "Esalemi malamu", + "tab size": "Bonene ya tab", + "text wrap": "Kokanga milongo ya makomi", + "theme": "Motema ya app", + "title-listfiles": "Tanga ba fichiers", + "Ekoki te kolongola fichier": "unable to delete file", + "unable to open file": "Limbisa, ekoki te kofungola fichier", + "unable to open folder": "Limbisa, ekoki te kofungola dossier", + "unable to save file": "Limbisa, ekoki te kobomba fichier", + "unable to rename": "Limbisa, ekoki te kobongola kombo", + "unsaved file": "Fichier oyo ebombami te, kanga yango kaka?", + "warning": "Likebisi", + "use emmet": "Salela Emmet", + "use quick tools": "Salela bisaleli ya mbangu", + "yes": "Iyo", + "encoding": "Encodage ya makomi", + "syntax highlighting": "Kopesa balangi na syntaxe", + "read only": "Kotanga kaka", + "select all": "Pona nyonso", + "select branch": "Pona branche", + "create new branch": "Sala branche ya sika", + "use branch": "Salela branche", + "new branch": "Branche ya sika", + "branch": "Branch", + "key bindings": "Ba raccourcis ya clavier", + "edit": "Bobongisi", + "reset": "Zongisa na ebandeli", + "color": "Langi", + "select word": "Pona liloba", + "quick tools": "Bisaleli ya mbangu", + "select": "Pona", + "editor font": "Police ya éditeur", + "new project": "Projet ya sika", + "format": "Lolenge", + "project name": "Kombo ya projet", + "unsupported device": "Appareil na yo endimi thème te.", + "vibrate on tap": "Vibrer ntango ozali kofina", + "copy command is not supported by ftp.": "Commande ya kopi esungami te na FTP.", + "support title": "Sunga Acode", + "fullscreen": "Ekran mobimba", + "animation": "Botambwisi", + "backup": "Kopi ya libateli", + "restore": "Zongisa", + "backup successful": "Backup esalemi malamu", + "invalid backup file": "Fichier ya backup ezali malamu te", + "add path": "Bakisa nzela", + "live autocompletion": "Autocomplétion ya mbala moko", + "file properties": "Bizaleli ya fichier", + "path": "Nzela", + "type": "Lolenge", + "word count": "Motango ya maloba", + "line count": "Motango ya milɔngɔ", + "last modified": "Ebongisami mbala ya nsuka", + "size": "Bonene", + "share": "Kabola", + "show print margin": "Lakisa marge ya impression", + "login": "Kota", + "scrollbar size": "Bonene ya barre ya kokitisa", + "cursor controller size": "Bonene ya contrôleur ya curseur", + "none": "Eloko moko te", + "small": "Moke", + "large": "Monene", + "confirm on exit": "Kondimisa liboso ya kobima", + "show console": "Lakisa console", + "image": "Elilingi", + "insert file": "Kotisa fichier", + "insert color": "Kotisa langi", + "powersave mode warning": "Kanga mode ya kobomba nguya mpo na kotala na navigateur ya libanda.", + "exit": "Bima", + "custom": "Ya moto", + "reset warning": "Oza na ntembe te ete olingi kozongisa thème na ebandeli?", + "theme type": "Lolenge ya thème", + "light": "Pole", + "dark": "Molili", + "file browser": "Navigateur ya ba fichiers", + "operation not permitted": "Opération epesami nzela te", + "no such file or directory": "Fichier to dossier yango ezali te", + "input/output error": "Libunga ya entrée/sortie", + "permission denied": "Ndingisa eboyami", + "bad address": "Adresse ezali malamu te", + "file exists": "Fichier ezali", + "not a directory": "Ezali dossier te", + "is a directory": "Ezali dossier", + "invalid argument": "Argument ezali malamu te", + "too many open files in system": "Ba fichiers mingi efungwami na système", + "too many open files": "Ba fichiers mingi efungwami", + "text file busy": "Fichier ya makomi ezali kosalelama", + "no space left on device": "Esika etikali te na appareil", + "read-only file system": "Système ya fichiers ya kotanga kaka", + "file name too long": "Kombo ya fichier ezali molai mingi", + "too many users": "Basaleli bazali mingi", + "connection timed out": "Ntango ya connexion esili", + "connection refused": "Connexion eboyami", + "owner died": "Nkolo akufi", + "an error occurred": "Libunga moko esalemi", + "add ftp": "Bakisa FTP", + "add sftp": "Bakisa SFTP", + "save file": "Bomba fichier", + "save file as": "Bomba fichier lokola", + "files": "Ba fichiers", + "help": "Lisungi", + "file has been deleted": "{file} has been deleted!", + "feature not available": "Makoki oyo ezali te.", + "feature available in paid version": "Makoki oyo ezali kaka na version ya kofuta ya application.", + "deleted file": "Fichier elongolami", + "line height": "Molai ya ligne", + "preview info": "Soki olingi kosala fichier oyo ezali kosala, finá mpe simbá elembo ya kobɛta.", + "manage all files": "Pesa Acode nzela ya kokamba ba fichiers nyonso na paramètres mpo na kobongisa ba fichiers na appareil na yo na pete.", + "close file": "Kanga fichier", + "reset connections": "Zongisa ba connexions", + "check file changes": "Tala mbongwana ya fichier", + "open in browser": "Fungola na navigateur", + "desktop mode": "Mode ordinateur", + "toggle console": "Bongola console", + "new line mode": "Mode ya ligne ya sika", + "add a storage": "Bakisa esika ya kobomba", + "rate acode": "Pesa Acode note", + "support": "Lisungi", + "downloading file": "Ezali kokitisa {file}", + "downloading...": "Ezali kokɔtisa...", + "folder name": "Kombo ya dossier", + "keyboard mode": "Mode ya clavier", + "normal": "Ya momesano", + "app settings": "Paramɛtrɛ ya application", + "disable in-app-browser caching": "Kanga cache ya navigateur ya kati ya application", + "copied to clipboard": "Ekopedami na presse-papier", + "clipboard not available": "Clipboard ezali te.", + "remember opened files": "Kanisa ba fichiers oyo efungwamaki", + "remember opened folders": "Kanisa ba dossiers oyo efungwamaki", + "no suggestions": "Ba suggestions ezali te", + "no suggestions aggressive": "Ba suggestions ya makasi ezali te", + "install": "Tia", + "installing": "Ezali kotia...", + "plugins": "Ba plugins", + "recently used": "Esalelami kala mingi te", + "update": "Bongisa", + "uninstall": "Longola", + "download acode pro": "Kokitisa Acode Pro", + "loading plugins": "Ezali kokɔtisa ba plugins", + "diagonal scrolling": "Kokita na diagonal", + "reverse scrolling": "Kokita na ngámbo ya inverse", + "formatter": "Formatter", + "format on save": "Sala format tango ya kobomba", + "remove ads": "Longola bapub", + "faqs": "Mituna oyo etunamaka mingi", + "feedback": "Makanisi", + "header": "Motó ya likoló", + "sidebar": "Barre ya pembeni", + "inapp": "Inapp", + "browser": "Navigateur", + "fast": "Nokí", + "slow": "Malɛmbɛ", + "scroll settings": "Paramɛtrɛ ya kokita", + "scroll speed": "Mbangu ya kokita", + "loading...": "Ezali kokɔtisa...", + "no plugins found": "Plugin moko te ezwami", + "name": "Kombo", + "username": "Kombo ya mosaleli", + "ekoki kozala te": "optional", + "hostname": "Hostname", + "password": "Liloba ya sekele", + "security type": "Lolenge ya libateli", + "connection mode": "Mode ya connexion", + "port": "Port", + "key file": "Fichier ya fungola", + "select key file": "Pona fichier ya fungola", + "passphrase": "Maloba ya sekele", + "connecting...": "Ezali kokangisa...", + "type filename": "Koma kombo ya fichier", + "unable to load files": "Ekoki te kokɔtisa ba fichiers", + "preview port": "Port ya botali liboso", + "find file": "Luka fichier", + "system": "Sistɛmi", + "please select a formatter": "Pona formatter moko", + "case sensitive": "Kotalela makomi minene mpe mike", + "regular expression": "Regular expression", + "whole word": "Liloba mobimba", + "edit with": "Bongisa na", + "open with": "Fungola na", + "no app found to handle this file": "Application moko te ezwami mpo na kofungola fichier oyo", + "restore default settings": "Zongisa ba paramɛtrɛ ya liboso", + "server port": "Port ya serveur", + "preview settings": "Ba paramɛtrɛ ya botali liboso", + "preview settings note": "Soki port ya preview mpe port ya serveur ekeseni, application ekobanda serveur te mpe ekofungola https://: na navigateur to navigateur ya kati ya application. Yango ezali na tina soki ozali kosalela serveur esika mosusu.", + "backup/restore note": "It will only backup your settings, custom theme, installed plugins and key bindings. It will not backup your FTP/SFTP or App state.", + "host": "Host", + "retry ftp/sftp when fail": "Meka FTP/SFTP lisusu soki elongi te", + "more": "Mosusu", + "thank you :)": "Matondi :)", + "Kosomba ezali kozela": "Kosomba ezali kozela", + "Ebengami": "Ebengami", + "local": "Ya mboka", + "remote": "Ya mosika", + "show console toggler": "Lakisa bouton ya console", + "binary file": "Fichier oyo ezali na ba données binaires, olingi kofungola yango?", + "relative line numbers": "Mituya ya ba lignes na kotalela ligne oyo ezali sikoyo", + "elastic tabstops": "Ba tab stops oyo ebongwanaka", + "line based rtl switching": "Kobongola RTL na kotalela ligne", + "hard wrap": "Kokanga ligne na makasi", + "spellcheck": "Kotala mabunga ya makomi", + "wrap method": "Lolenge ya kokanga milongo", + "use textarea for ime": "Salela textarea mpo na IME", + "invalid plugin": "Plugin ezali malamu te", + "type command": "Koma command", + "plugin": "Plugin", + "quicktools trigger mode": "Lolenge ya kofungola bisaleli ya mbangu", + "print margin": "Marge ya impression", + "touch move threshold": "Limite ya mouvement ya touch", + "info-retryremotefsafterfail": "Meka lisusu connexion FTP/SFTP soki elongi te.", + "info-fullscreen": "Bomba barre ya motó na écran ya ebandeli.", + "info-checkfiles": "Tala mbongwana ya ba fichiers ntango application ezali na nsima.", + "info-console": "Pona console ya JavaScript. Console Legacy ezali ya liboso, mpe Eruda ezali console ya bato mosusu.", + "info-keyboardmode": "Keyboard mode for text input, no suggestions will hide suggestions and auto correct. If no suggestions does not work, try to change value to no suggestions aggressive.", + "info-rememberfiles": "Kanisa ba fichiers oyo efungwami ntango application ekangami.", + "info-rememberfolders": "Kanisa ba dossiers oyo efungwami ntango application ekangami.", + "info-floatingbutton": "Lakisa to bomba bouton flottant ya bisaleli ya mbangu.", + "info-openfilelistpos": "Esika ya kolakisa liste ya ba fichiers oyo ezali kosala.", + "info-touchmovethreshold": "Soki sensibilite ya touch ya appareil na yo ezali makasi mingi, bakisa motuya oyo mpo na kopekisa mouvement ya touch oyo esalemi na libunga.", + "info-scroll-settings": "Ba paramɛtrɛ oyo ezali na ba paramètres ya kokita, bakisa mpe kokanga milongo ya makomi.", + "info-animation": "Soki application ezali kosala malɛmbɛ, kangá animation.", + "info-quicktoolstriggermode": "Soki bouton ya bisaleli ya mbangu ezali kosala te, meká kobongola motuya oyo.", + "info-checkForAppUpdates": "Tala automatiquement soki ba mises à jour ya application ezali.", + "info-quickTools": "Lakisa to bomba ba outils ya noki.", + "info-showHiddenFiles": "Lakisa ba fichiers mpe ba dossiers oyo ebombami. (Bandaka na .)", + "info-listFiles": "Tanga automatiquement ba fichiers nyonso ntango dossier efungwami", + "info-all_file_access": "Pesa terminal accès na /sdcard mpe /storage.", + "info-fontSize": "Bonene ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-fontFamily": "Lolenge ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-theme": "Motó ya couleur ya terminal.", + "info-cursorStyle": "Lolenge ya curseur ntango terminal ezali na focus.", + "info-cursorInactiveStyle": "Lolenge ya curseur ntango terminal ezali na focus te.", + "info-fontWeight": "Bonene ya makomi oyo esalelamaka mpo na makomi oyo ezali minene te.", + "info-cursorBlink": "Soki curseur ekoti mpe ebimi.", + "info-scrollback": "Motango ya milongo oyo ebombamaka na terminal ntango ozali kokita.", + "info-tabStopWidth": "Bonene ya ba tab stops na terminal.", + "info-letterSpacing": "Esika oyo ezali kati ya makomi.", + "info-imageSupport": "Soki terminal ekoki kosala na bililingi.", + "info-fontLigatures": "Soki ba ligatures ya makomi efungwami na terminal.", + "info-confirmTabClose": "Senga kondimisa liboso ya kokanga ba onglets ya terminal.", + "info-backup": "Sala backup ya terminal.", + "info-restore": "Zongisa backup ya terminal.", + "info-uninstall": "Longola terminal.", + "owned": "Ezali ya ngai", + "api_error": "Serveur ya API ezali kosala te, meká lisusu nsima ya mwa ntango.", + "installed": "Etyami", + "all": "Nyonso", + "medium": "Ya kati-kati", + "refund": "Kozongisa mbongo", + "product not available": "Produit ezali te", + "no-product-info": "Produit oyo ezali te na mboka na yo sikoyo, meká lisusu na nsima.", + "close": "Kanga", + "explore": "Tala makambo mosusu", + "key bindings updated": "Ba raccourcis ya clavier ebongwani", + "search in files": "Luka na kati ya ba fichiers", + "exclude files": "Longola ba fichiers", + "include files": "Bakisa ba fichiers", + "search result": "{matches} ba résultats na {files} ba fichiers.", + "invalid regex": "Regex ezali na libunga: {message}.", + "bottom": "Na nse", + "save all": "Bomba nyonso", + "close all": "Kanga nyonso", + "unsaved files warning": "Ba fichiers mosusu ebombami nanu te. Finá 'OK' pona kopona nini osala, to 'Cancel' pona kozonga.", + "save all warning": "Oza na ntembe te ete olingi kobomba ba fichiers nyonso mpe kokanga yango? Likambo oyo ekoki kozongisama nsima te.", + "save all changes warning": "Oza na ntembe te ete olingi kobomba mbongwana nyonso ya ba fichiers?", + "close all warning": "Oza na ntembe te ete olingi kokanga ba fichiers nyonso? Mbongwana oyo ebombami te ekobunga mpe likambo oyo ekoki kozongisama nsima te.", + "refresh": "Zongisa", + "shortcut buttons": "Ba boutons ya raccourci", + "no result": "Eyano ezali te", + "searching...": "Koluka...", + "quicktools:ctrl-key": "Fungola ya Control/Command", + "quicktools:tab-key": "Fungola tab", + "quicktools:shift-key": "Fungola Shift", + "quicktools:undo": "Zongisa nsima", + "quicktools:redo": "Zongisa lisusu", + "quicktools:search": "Luka na fichier", + "quicktools:save": "Bomba fichier", + "quicktools:esc-key": "Fungola Escape", + "quicktools:curlybracket": "Kotisa ba accolade", + "quicktools:squarebracket": "Kotisa ba parenthèses carrées", + "quicktools:parentheses": "Kotisa ba parenthèse", + "quicktools:anglebracket": "Kotisa ba parenthèses angulaires", + "quicktools:left-arrow-key": "Flèche ya mwasi", + "quicktools:right-arrow-key": "Flèche ya mobali", + "quicktools:up-arrow-key": "Flèche likolo", + "quicktools:down-arrow-key": "Flèche na nse", + "quicktools:moveline-up": "Tombola ligne likolo", + "quicktools:moveline-down": "Kitisa ligne na nse", + "quicktools:copyline-up": "Kopi ligne likolo", + "quicktools:copyline-down": "Kopi ligne na nse", + "quicktools:semicolon": "Kotisa elembo ya point-virgule", + "quicktools:quotation": "Kotisa elembo ya citation", + "quicktools:and": "Kotisa elembo ya mpe", + "quicktools:bar": "Kotisa elembo ya barre", + "quicktools:equal": "Kotisa elembo ya ekokani", + "quicktools:slash": "Kotisa elembo ya slash", + "quicktools:exclamation": "Kotisa elembo ya exclamation", + "quicktools:alt-key": "Alt", + "quicktools:meta-key": "Windows/Meta", + "quicktools:search-prev": "Match oyo eleki", + "quicktools:search-next": "Match oyo elandi", + "quicktools:search-settings": "Ba paramɛtrɛ ya boluki", + "quicktools:search-replace": "Zongisa", + "quicktools:search-replace-all": "Zongisa nyonso", + "info-quicktoolssettings": "Bongisa ba boutons ya shortcuts mpe ba touches ya clavier na esika ya Quicktools oyo ezali na nse ya éditeur mpo na kobongisa ndenge ya kosala code.", + "info-excludefolders": "Salelá modèle **/node_modules/** mpo na koboya ba fichiers nyonso ya dossier node_modules. Ba fichiers yango ekomonana te na liste mpe ekosala te na boluki ya ba fichiers.", + "missed files": "Ba fichiers {count} etalelami nsima ya kobanda boluki mpe ekotisami te na boluki.", + "remove": "Longola", + "quicktools:command-palette": "Palette ya mitindo", + "default file encoding": "Encodage ya fichier ya liboso", + "remove entry": "Oza na ntembe te ete olingi kolongola '{name}' na ba chemins oyo ebombami? Koboma chemin yango moko te.", + "delete entry": "Ndima koboma: '{name}'. Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "change encoding": "Fungola lisusu '{file}' na encodage '{encoding}'? Likambo oyo ekobungisa mbongwana nyonso oyo ebombami nanu te. Olingi kokoba?", + "reopen file": "Oza na ntembe te ete olingi kofungola lisusu '{file}'? Mbongwana nyonso oyo ebombami nanu te ekobunga.", + "plugin min version": "{name} ezali kaka na Acode - {v-code} mpe ba versions ya likolo. Finá awa mpo na kosala mbongwana.", + "color preview": "Botali liboso ya langi", + "confirm": "Kondimisa", + "problems": "Mikakatano", + "show side buttons": "Lakisa ba boutons ya pembeni", + "bug_report": "Tinda rapɔ́rɛ ya libunga", + "verified publisher": "Mobimisi oyo andimami", + "most_downloaded": "Ekitisami mingi", + "newly_added": "Ebakisami sika", + "top_rated": "Oyo etangami malamu mingi", + "rename not supported": "Kobongola kombo na dossier ya Termux yango esungami te", + "compress": "Kokitisa bonene", + "copy uri": "Kopi URI", + "delete entries": "Oza na ntembe te ete olingi kolongola biloko {count}?", + "deleting items": "Kolongola biloko {count}...", + "import project zip": "Kokɔtisa projet (zip)", + "changelog": "Mbongwana ya version", + "notifications": "Mayebisi", + "no_unread_notifications": "Ezali na ba notifications oyo etángami te te", + "should_use_current_file_for_preview": "Esengeli kosalela fichier oyo ezali sikoyo mpo na preview na esika ya index.html ya liboso.", + "fade fold widgets": "Kokitisa polele ba widgets ya fold", + "quicktools:home-key": "Home", + "quicktools:end-key": "End", + "quicktools:pageup-key": "PageUp", + "quicktools:pagedown-key": "PageDown", + "quicktools:delete-key": "Longola", + "quicktools:tilde": "Kotisa elembo ya tilde", + "quicktools:backtick": "Kotisa backtick", + "quicktools:hash": "Kotisa elembo ya hash", + "quicktools:dollar": "Kotisa elembo ya dollar", + "quicktools:modulo": "Kotisa elembo ya modulo/pourcentage", + "quicktools:caret": "Kotisa elembo ya caret", + "plugin_enabled": "Plugin efungwami", + "plugin_disabled": "Plugin ekangami", + "enable_plugin": "Fungola plugin oyo", + "disable_plugin": "Kanga plugin oyo", + "open_source": "Open source", + "terminal settings": "Paramɛtrɛ ya terminal", + "font ligatures": "Ba ligatures ya makomi", + "letter spacing": "Espace kati ya balɛ́tɛ́lɛ", + "terminal:tab stop width": "Bonene ya tab stop", + "terminal:scrollback": "Milongo ya scrollback", + "terminal:cursor blink": "Kongenga ya curseur", + "terminal:font weight": "Bonene ya makomi", + "terminal:cursor inactive style": "Lolenge ya curseur oyo ezali inactif", + "terminal:cursor style": "Lolenge ya curseur", + "terminal:font family": "Libota ya makomi", + "terminal:convert eol": "Bongola suka ya ligne", + "terminal:confirm tab close": "Ndima kokanga onglet ya terminal", + "terminal:image support": "Lisungi ya bililingi", + "terminal": "Terminal", + "terminal not installed prompt": "Terminal etyá te. Olingi kobanda yango sikawa ?", + "terminal first launch prompt": "Environnement ya terminal etyá te. Ezali kopesa yo nzela ya kosalela ba commands, SSH mpe ba scripts. Olingi kotya yango sikawa ?", + "allFileAccess": "Accès na ba fichiers nyonso", + "fonts": "Makomi", + "sponsor": "Kosalisa", + "downloads": "Ba téléchargements", + "reviews": "Ba avis", + "overview": "Botali ya mobimba", + "contributors": "Bato oyo basalisaki", + "quicktools:hyphen": "Kotisa trait d'union", + "check for app updates": "Tala ba mises à jour ya application", + "prompt update check consent message": "Acode ekoki kotala ba mises à jour ya application ntango ozali na internet. Olingi kofungola botali ya ba mises à jour?", + "keywords": "Maloba ya ntina", + "author": "Mokomi", + "filtered by": "Eponami na", + "clean install state": "Ezalela ya installation ya pamba", + "backup created": "Backup esalemi", + "restore completed": "Zongisi esili", + "restore will include": "Oyo ekozongisa", + "restore warning": "Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "reload to apply": "Zongisa mpo na kosalela mbongwana?", + "reload app": "Kozongisa application", + "preparing backup": "Kobongisa backup", + "collecting settings": "Kozwa ba paramɛtrɛ", + "collecting key bindings": "Kozwa ba raccourcis", + "collecting plugins": "Kozwa makambo ya ba plugin", + "creating backup": "Kosala fichier ya backup", + "validating backup": "Kotalela backup", + "restoring key bindings": "Kozongisa ba raccourcis", + "restoring plugins": "Kozongisa ba plugins", + "restoring settings": "Kozongisa ba paramɛtrɛ", + "legacy backup warning": "Oyo ezali format ya backup ya kala. Ba fonctionnalités mosusu ekoki kozala limitées.", + "checksum mismatch": "Makambo ya checksum ekokani te - fichier ya backup ekoki kozala ebongisami to ebebisami.", + "plugin not found": "Plugin ezwami te na registre", + "paid plugin skipped": "Plugin ya kofuta - kosomba ezwami te", + "source not found": "Fichier source ezali lisusu te", + "restored": "Ezongisami", + "skipped": "Eleki", + "backup not valid object": "Fichier ya backup ezali objet ya malamu te", + "backup no data": "Fichier ya backup ezali na ba données ya kozongisa te", + "backup legacy warning": "Oyo ezali format ya backup ya kala (v1). Ba fonctionnalités mosusu ekoki kozala limitées.", + "backup missing metadata": "Ba informations ya backup ezali te - makambo mosusu ekoki kozanga.", + "backup checksum mismatch": "Checksum ekokani te - fichier ya backup ekoki kozala ebongwani to ebebi. Keba liboso ya kokoba.", + "backup checksum verify failed": "Kotalisa checksum elongi te", + "backup invalid settings": "Format ya ba paramɛtrɛ ezali na libunga", + "backup invalid keybindings": "Format ya ba keyboard shortcuts ezali na libunga", + "backup invalid plugins": "Format ya ba plugins oyo etiemami ezali na libunga", + "issues found": "Mikakatano emonani", + "error details": "Makambo ya libunga", + "active tools": "Bisaleli oyo ezali kosala", + "available tools": "Ba outils oyo ezali", + "recent": "Ba fichiers ya sika", + "command palette": "Fungola menu ya ba commandes", + "change theme": "Bobongola motó", + "documentation": "Mikanda ya lisungi", + "open in terminal": "Fungola na terminal", + "developer mode": "Mode ya developer", + "info-developermode": "Fungola ba outils ya developer (Eruda) pona ko déboguer ba plugins mpe kotala ezalela ya application. Inspecteur ekofungwama tango application ebandi.", + "developer mode enabled": "Mode ya developer efungwami. Salela palette ya mitindo mpo na kofungola to kokanga inspecteur (Ctrl+Shift+I).", + "developer mode disabled": "Mode ya developer ekangami", + "copy relative path": "Kopi nzela relatif", + "shortcut request sent": "Bosengi ya raccourci etindami. Finá Ajouter mpo na kosilisa.", + "add to home screen": "Bakisa na écran d'accueil", + "pin shortcuts not supported": "Ba shortcuts ya écran d'accueil esimbami te na appareil oyo.", + "save file before home shortcut": "Bomba fichier liboso ya kobakisa yango na écran d'accueil.", + "terminal_required_message_for_lsp": "Terminal ezali installed te. Install terminal liboso mpo na kosalela ba serveurs LSP.", + "shift click selection": "Poná na Shift + click", + "earn ad-free time": "Zwa ntango kozanga bapub", + "indent guides": "Ba guide ya kokɔtisa molɔngɔ", + "language servers": "Ba serveurs ya monoko", + "lint gutter": "Lakisa ba erreurs ya lint", + "rainbow brackets": "Ba parenthèses ya balangi", + "lsp-add-custom-server": "Bakisa serveur personnalisé", + "lsp-binary-args": "Ba arguments ya binaire (JSON array)", + "lsp-binary-command": "Command ya binaire", + "lsp-binary-path-optional": "Nzela ya binaire (ekoki kozala te)", + "lsp-check-command-optional": "Command ya kotala (option ya kobongola)", + "lsp-checking-installation-status": "Kotala ezalela ya installation...", + "lsp-configured": "Ebongisami", + "lsp-custom-server-added": "Serveur personnalisé ebakisami", + "lsp-default": "Ya liboso", + "lsp-details-line": "Makambo: {details}", + "lsp-edit-initialization-options": "Bongola ba options ya kobanda", + "lsp-empty": "Ezali mpamba", + "lsp-enabled": "Efongwami", + "lsp-error-add-server-failed": "Ekoki te kobakisa serveur.", + "lsp-error-args-must-be-array": "Ba arguments esengeli kozala tableau ya JSON", + "lsp-error-binary-command-required": "Command binary esengeli", + "lsp-error-language-id-required": "Esengeli kozala na ID moko ya monoko ata moko", + "lsp-error-package-required": "Esengeli kozala na package ata moko", + "lsp-error-server-id-required": "ID ya serveur esengeli", + "lsp-feature-completion": "Kosilisa code automatiquement", + "lsp-feature-completion-info": "Fungola ba suggestions ya autocomplete oyo ewutaka na serveur.", + "lsp-feature-diagnostics": "Botali mabunga", + "lsp-feature-diagnostics-info": "Lakisa ba erreurs mpe ba avertissements oyo ewutaka na serveur ya langue.", + "lsp-feature-formatting": "Bobongisi format", + "lsp-feature-formatting-info": "Fungola formatage ya code oyo ewutaka na serveur ya langue.", + "lsp-feature-hover": "Makambo ya code", + "lsp-feature-hover-info": "Lakisa ba informations ya type mpe documentation tango ozali kosala hover.", + "lsp-feature-inlay-hints": "Bilembo ya lisungi", + "lsp-feature-inlay-hints-info": "Lakisa ba informations ya lolenge ya code na kati ya éditeur.", + "lsp-feature-signature": "Lisungi ya signature", + "lsp-feature-signature-info": "Lakisa ba indications ya ba paramɛtrɛ ya fonction tango ozali kokoma.", + "lsp-feature-state-toast": "{feature} {state}", + "lsp-initialization-options": "Ba options ya kobanda", + "lsp-initialization-options-json": "Ba options ya kobanda (JSON)", + "lsp-initialization-options-updated": "Ba options ya kobanda ebongwani", + "lsp-install-command": "Command ya installation", + "lsp-install-command-unavailable": "Command ya installation ezali te.", + "lsp-install-info-check-failed": "Acode ekoki te kotala soki installation esili malamu.", + "lsp-install-info-missing": "Serveur ya monoko etiemami te na environnement ya terminal.", + "lsp-install-info-ready": "Serveur ya monoko etiemami mpe ezali prêt.", + "lsp-install-info-unknown": "Ezalela ya installation ekoki kotala yango automatiquement te.", + "lsp-install-info-version-available": "Version {version} ezali.", + "lsp-install-notification": "{server} language server is not installed. Tap to install.", + "lsp-install-method-apk": "Package APK", + "lsp-install-method-cargo": "Package Cargo", + "lsp-install-method-manual": "Binaire ya mabɔkɔ", + "lsp-install-method-npm": "Package npm", + "lsp-install-method-pip": "Package pip", + "lsp-install-method-shell": "Shell personnalisé", + "lsp-install-method-title": "Lolenge ya installation", + "lsp-install-repair": "Kotia / kobongisa", + "lsp-installation-status": "Ezalela ya installation", + "lsp-installed": "Eteni", + "lsp-invalid-timeout": "Motuya ya timeout ezali na libunga", + "lsp-language-ids": "Ba ID ya monoko (ekabolami na virgule)", + "lsp-packages-prompt": "Ba packages {method} (ekabwani na virgule)", + "lsp-remove-installed-files": "Longola ba fichiers installés pona {server}?", + "lsp-server-disabled-toast": "Serveur ekangami", + "lsp-server-enabled-toast": "Serveur efungwami", + "lsp-server-id": "ID ya serveur", + "lsp-server-label": "Kombo ya serveur", + "lsp-server-not-found": "Serveur ezwami te", + "lsp-server-uninstalled": "Serveur elongolami", + "lsp-startup-timeout": "Ntango ya kozela na ebandeli", + "lsp-startup-timeout-ms": "Ntango ya kozela na ebandeli (millisecondes)", + "lsp-startup-timeout-set": "Ntango ya kozela etiamisami na {timeout} ms", + "lsp-state-disabled": "ekangami", + "lsp-state-enabled": "efungwami", + "lsp-status": "Ezalela", + "lsp-status-check-failed": "Kotalela elongi te", + "lsp-status-installed": "Eteni", + "lsp-status-installed-version": "Etyami ({version})", + "lsp-status-line": "Ezali: {status}", + "lsp-status-not-installed": "Etyami te", + "lsp-status-unknown": "Eyebani te", + "lsp-timeout-ms": "{timeout} ms", + "lsp-uninstall-command-unavailable": "Command ya kolongola ezali te", + "lsp-uninstall-notification": "Finá mpo na kolongola serveur ya monoko {server}.", + "lsp-uninstall-server": "Longola serveur", + "lsp-update-command-optional": "Command ya mbongwana (option ya kobongisa)", + "lsp-update-command-unavailable": "Command ya mbongwana ezali te.", + "lsp-update-server": "Mbongwana ya serveur", + "lsp-version-line": "Version: {version}", + "lsp-view-initialization-options": "Talá ba options ya kobanda", + "settings-category-about-acode": "Mpo na Acode", + "settings-category-discover-apps": "Tala ba applications mosusu", + "settings-category-advanced": "Ya likolo", + "settings-category-assistance": "Lisungi", + "settings-category-core": "Paramɛtrɛ ya moboko", + "settings-category-cursor": "Curseur", + "settings-category-cursor-selection": "Curseur mpe kopona", + "settings-category-custom-servers": "Ba serveurs oyo ebongisami na moto", + "settings-category-customization-tools": "Bobongisi mpe bisaleli", + "settings-category-display": "Emoniseli", + "settings-category-editing": "Bobongisi", + "settings-category-features": "Makoki", + "settings-category-files-sessions": "Ba fichiers mpe ba sessions", + "settings-category-fonts": "Makomi", + "settings-category-general": "Ya monene", + "settings-category-guides-indicators": "Ba guides mpe bilembo", + "settings-category-installation": "Botie", + "settings-category-interface": "Interface", + "settings-category-maintenance": "Bobongisi mpe bobateli", + "settings-category-permissions": "Ndingisa", + "settings-category-preview": "Botali liboso", + "settings-category-scrolling": "Kokita", + "settings-category-server": "Serveur", + "settings-category-servers": "Ba serveurs", + "settings-category-session": "Session", + "settings-category-support-acode": "Sunga Acode", + "settings-category-text-layout": "Bobongisi ya makomi", + "settings-info-app-animation": "Kamba ba animation ya transition na kati ya application nyonso.", + "settings-info-app-check-files": "Zongisa ba éditeur soki ba fichier ebongwani libanda ya Acode.", + "settings-info-app-clean-install-state": "Longola ezalela ya installation oyo ebombami mpo na setup.", + "settings-info-app-confirm-on-exit": "Senga kondimisa liboso ya kokanga application.", + "settings-info-app-console": "Pona console ya débogage oyo Acode esalela.", + "settings-info-app-default-file-encoding": "Encodage ya liboso tango ya kofungola to kosala ba fichier.", + "settings-info-app-exclude-folders": "Longola ba dossier mpe ba modèle tango ya koluka.", + "settings-info-app-floating-button": "Lakisa bouton flottant ya ba actions ya noki.", + "settings-info-app-font-manager": "Kotia, kokamba to kolongola ba polices ya application.", + "settings-info-app-fullscreen": "Bomba barre ya système ntango ozali kosalela Acode.", + "settings-info-app-keybindings": "Bongola fichier ya ba raccourcis to zongisa yango na ndenge ya liboso.", + "settings-info-app-keyboard-mode": "Pona ndenge clavier ya logiciel esalaka ntango ozali kobongisa code.", + "settings-info-app-language": "Pona monoko ya application mpe ba labels oyo ebongolami.", + "settings-info-app-open-file-list-position": "Pona esika liste ya ba fichiers actifs ekomonana.", + "settings-info-app-quick-tools-settings": "Bongola molongo mpe ndenge ya ba raccourcis ya ba outils ya mbangu.", + "settings-info-app-quick-tools-trigger-mode": "Pona ndenge ba outils ya noki efungwamaka na touche to na kosimba écran.", + "settings-info-app-remember-files": "Fungola lisusu ba fichiers oyo ezalaki ya kofungwama mbala ya suka.", + "settings-info-app-remember-folders": "Fungola lisusu ba dossiers ya session oyo eleki.", + "settings-info-app-retry-remote-fs": "Meka lisusu ba opérations ya fichiers distants nsima ya transfert oyo elongi te.", + "settings-info-app-side-buttons": "Lakisa ba boutons ya actions ya kobakisa pembeni ya éditeur.", + "settings-info-app-sponsor-sidebar": "Lakisa sponsor na sidebar.", + "settings-info-app-touch-move-threshold": "Mouvement moke oyo esengeli liboso ya koyeba déplacement ya touch.", + "settings-info-app-vibrate-on-tap": "Fungola vibration ya appareil tango ozali kosimba ba boutons mpe ba contrôles.", + "settings-info-editor-autosave": "Bomba mbongwana automatiquement nsima ya mwa ntango.", + "settings-info-editor-color-preview": "Tala ba valeur ya langi na kati ya éditeur.", + "settings-info-editor-fade-fold-widgets": "Kitisa pole ya bilembo ya fold soki esengeli te.", + "settings-info-editor-font-family": "Pona lolenge ya police oyo esalelami na éditeur.", + "settings-info-editor-font-size": "Bongola bonene ya makomi ya éditeur.", + "settings-info-editor-format-on-save": "Sala formatage tango nyonso fichier ebombami.", + "settings-info-editor-hard-wrap": "Kotisa ba saut ya ligne ya solo na esika ya kaka kokanga yango na komona.", + "settings-info-editor-indent-guides": "Lakisa ba lignes ya guide ya indentation.", + "settings-info-editor-line-height": "Bongola espace ya likolo mpe ya se kati ya ba ligne.", + "settings-info-editor-line-numbers": "Lakisa mituya ya ba lignes pembeni ya éditeur.", + "settings-info-editor-lint-gutter": "Lakisa ba erreurs, ba diagnostics mpe ba marqueurs ya lint pembeni ya éditeur.", + "settings-info-editor-live-autocomplete": "Lakisa ba suggestions ntango ozali kokoma.", + "settings-info-editor-rainbow-brackets": "Pesa balangisi ya langi na ba crochet oyo ekokani na profondeur.", + "settings-info-editor-relative-line-numbers": "Lakisa distance uta na ligne oyo ozali kosalela.", + "settings-info-editor-rtl-text": "Bongola ndenge ya kokoma droite na gauche mpo na ligne moko na moko.", + "settings-info-editor-scroll-settings": "Bongola bonene ya barre ya défilement, vitesse mpe ndenge ya kosalela yango.", + "settings-info-editor-shift-click-selection": "Bakisa sélection na Shift + kosimba to kofina.", + "settings-info-editor-show-spaces": "Lakisa bilembo oyo emonisaka ba espaces mpe ba saut ya ligne.", + "settings-info-editor-soft-tab": "Kotisa ba espaces na esika ya ba caractères tab.", + "settings-info-editor-tab-size": "Pona motango ya ba espaces oyo tab moko esalela.", + "settings-info-editor-teardrop-size": "Bongola bonene ya poignée ya curseur mpo na édition na touch.", + "settings-info-editor-text-wrap": "Kanga ba ligne milayi na kati ya éditeur.", + "settings-info-lsp-add-custom-server": "Bakisa serveur ya langue personnalisé na ba commandes ya installation, mbongwana mpe lancement.", + "settings-info-lsp-edit-init-options": "Bongola ba options ya kobanda lokola JSON.", + "settings-info-lsp-install-server": "Kotia to kobongisa serveur oyo ya langue.", + "settings-info-lsp-server-enabled": "Kofungola to kokanga serveur oyo ya monoko.", + "settings-info-lsp-startup-timeout": "Pona tango oyo Acode ekoki kozela mpo serveur ebanda.", + "settings-info-lsp-uninstall-server": "Longola ba paquets to ba fichiers exécutables oyo ebombami mpo na serveur oyo.", + "settings-info-lsp-update-server": "Kobongisa serveur oyo ya monoko soki lolenge ya kobongisa ezali.", + "settings-info-lsp-view-init-options": "Tala ba options ya kobanda oyo ezali kosala lokola JSON.", + "settings-info-main-ad-rewards": "Tala ba publicité mpo na kozwa accès sans publicité mpo na mwa tango.", + "settings-info-main-app-settings": "Monoko, ndenge application esalaka mpe ba outils ya accès rapide.", + "settings-info-main-backup-restore": "Bimisa ba paramɛtrɛ na backup to zongisa yango sima.", + "settings-info-main-changelog": "Tala ba mbongwana ya sika mpe ba notes ya version.", + "settings-info-main-edit-settings": "Bongola fichier settings.json brut directement.", + "settings-info-main-editor-settings": "Ba police, ba tabs, ba suggestions mpe ndenge éditeur emonanaka.", + "settings-info-main-formatter": "Pona formatter pona langage moko na moko oyo esungami.", + "settings-info-main-lsp-settings": "Bongisa ba serveur ya monoko mpe mayele ya éditeur.", + "settings-info-main-plugins": "Tambwisa ba plugins oyo etiemi mpe misala na yango.", + "settings-info-main-preview-settings": "Mode ya preview, ba port ya serveur mpe ndenge navigateur esalaka.", + "settings-info-main-rateapp": "Pesa Acode note na Google Play.", + "settings-info-main-remove-ads": "Fungola accès ya libela sans publicité.", + "settings-info-main-reset": "Zongisa Acode na ba paramètres ya liboso.", + "settings-info-main-sponsors": "Sunga bokoli ya Acode oyo ezali kokoba.", + "settings-info-main-terminal-settings": "Motó ya terminal, police, curseur mpe ndenge session esalaka.", + "settings-info-main-theme": "Motó ya application, contraste mpe ba langi oyo ebongisami.", + "settings-info-preview-disable-cache": "Zongisa ntango nyonso makambo ya sika na navigateur ya kati ya application.", + "settings-info-preview-host": "Nkombo ya hôte oyo esalelami ntango URL ya preview efungwami.", + "settings-info-preview-mode": "Pona esika preview ekofungwama ntango obandi yango.", + "settings-info-preview-preview-port": "Port oyo serveur ya preview na tango ya solo esalelaka.", + "settings-info-preview-server-port": "Port oyo serveur ya kati ya application esalelaka.", + "settings-info-preview-show-console-toggler": "Lakisa bouton ya console na preview.", + "settings-info-preview-use-current-file": "Pona liboso fichier oyo ezali sikoyo ntango obandi preview.", + "settings-info-terminal-convert-eol": "Bongola ba suka ya ba lignes ntango ozali kokanga to kolakisa makambo ya terminal.", + "settings-note-formatter-settings": "Pesa formatter na monoko moko na moko. Installer ba plugins ya formatter mpo na kozwa ba options mosusu.", + "settings-note-lsp-settings": "Ba serveurs ya langue ebakisaka autocomplete, diagnostics, ba informations ya hover mpe makambo mosusu. Esalaka malamu mingi na ba dossiers oyo terminal intégré ya Acode ekoki kokoma directement, lokola ba dossiers terminal/public. Ba emplacements SAF, externes mpe distants etikalamaka na libanda automatiquement mpo bakoki kosalela ba chemins ya cache to virtuels; activer option ya compatibilité kaka soki olingi komeka yango.", + "search result label singular": "mbano", + "search result label plural": "mbano", + "pin tab": "Kangisa onglet", + "unpin tab": "Longola onglet na biloko ekangami", + "pinned tab": "Onglet ekangami", + "unpin tab before closing": "Longola tab na pin liboso ya kokanga yango.", + "app font": "Makomi ya application", + "settings-info-app-font-family": "Pona police oyo esalelami na interface mobimba ya application.", + "lsp-transport-method-stdio": "STDIO (bandisa commande ya binaire)", + "lsp-transport-method-websocket": "WebSocket (kota na URL ws/wss)", + "lsp-websocket-url": "URL ya WebSocket", + "lsp-websocket-server-managed-externally": "Serveur oyo etambwisami libanda na nzela ya WebSocket.", + "lsp-error-websocket-url-invalid": "URL ya WebSocket esengeli kobanda na ws:// to wss://", + "lsp-error-websocket-url-required": "URL ya WebSocket esengeli", + "lsp-remove-custom-server": "Longola serveur personnalisé", + "lsp-remove-custom-server-confirm": "Longola serveur personnalisé ya langage {server}?", + "lsp-custom-server-removed": "Serveur personnalisé elongolami", + "settings-info-lsp-remove-custom-server": "Longola serveur ya langue personnalisé oyo na Acode.", + "unsaved selected tabs warning": "Ba tabs mosusu oyo oponi ebombami nanu te. Pona nini osengeli kosala.", + "save selected tabs": "Bomba ba onglets oyo oponi", + "close selected tabs": "Kanga ba onglets oyo oponi", + "save selected tabs warning": "Oza na ntembe te ete olingi kobomba mpe kokanga ba tabs oyo oponi?", + "close selected tabs warning": "Oza na ntembe te ete olingi kokanga ba tabs oyo oponi? Mbongwana oyo ebombami nanu te ekobunga mpe likambo oyo ekoki kozongisama te.", + "close tabs to right": "Kanga oyo ezali na droite", + "close tabs to left": "Kanga oyo ezali na gauche", + "close other tabs": "Kanga ba onglets mosusu", + "auto close tags": "Kanga ba tags automatiquement", + "settings-info-editor-auto-close-tags": "Kotisa automatiquement ba balises ya kokanga na HTML, XML, Vue, Angular mpe PHP.", + "ui zoom": "Zoom ya interface", + "settings-info-app-ui-zoom": "Bongola bonene ya makomi na interface mobimba ya Acode.", + "plugin-not-supported": "Plugin oyo endimami te", + "plugin-not-supported-info": "Plugin esalemaki pona version ya kala ya Acode.", + "login-to-view": "Kota na compte mpo na komona yango...", + "show share button": "Lakisa bouton ya kokabola", + "settings-info-editor-show-share-button": "Lakisa bouton ya partage na menu ya sélection.", + "iap-plugin-purchase-warning": "Ba plugins oyo osombi ebongisami te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "iap-pro-purchase-warning": "Bosombi oyo ekobongisama te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "confirm-login": "Okoti nanu te na Acode, olingi kokota sikoyo?", + "local word completion": "Bobongisi ya maloba ya fichier", + "language package completion": "Bobongisi ya package ya lokota", + "settings-info-editor-local-word-completion": "Pesa ba suggestions ya maloba oyo ezali na fichier oyo ozali kosalela.", + "settings-info-editor-language-completion": "Pesaka ba mots ya ntina, ba snippets mpe ba suggestions ya CodeMirror.", + "terminal:failsafe-info": "Bandisa terminal na shell ya système", + "auto rename tags": "Bongola kombo ya ba tags automatiquement", + "settings-info-editor-auto-rename-tags": "Bongola kombo ya balise oyo ekokani tango ozali kobongisa ba balise ya HTML.", + "copying items": "Kokopa biloko {count}...", + "cannot paste folder into itself": "Okoki te ko coller dossier na kati na yango moko", + "folder already exists": "Dossier ezali déjà", + "file already exists force named": "'{name}' ezali deja. Olingi kokoma likolo na yango?", + "lsp-allow-non-terminal-workspace": "Tika LSP esala na ba dossiers ya libanda", + "settings-info-lsp-allow-non-terminal-workspace": "Pesa nzela na ba serveur ya monoko mpo na SAF, bisika ya libanda mpe bisika ya mosika. LSP esalaka na terminal ya kati ya Acode, yango ekoki kosala ete makambo mosusu esalaka malamu te.", + "don't ask again": "Kotuna lisusu te", + "scrollbar height": "Molai ya barre ya bokitisaka", + "full": "Mobimba", + "scroll past end": "Koba kokita koleka suka", + "settings-info-scroll-past-end": "Bakisa esika ya pamba na nse ya éditeur mpo okoka komema molongo ya suka likolo.", + "compact": "Kokómisa mokuse", + "off": "Ekangami", + "quick tools height": "Molai ya bisaleli ya mbangu", + "quick tools toggler": "Bascule ya bisaleli ya mbangu", + "running processes": "Ba processus oyo ezali kosala", + "recommend extensions": "Tinda ba extensions", + "settings-info-editor-recommend-extensions": "Pesaka ba plugins tango fichier efungwami lokola texte pamba mpo na kozanga mode ya monoko.", + "extension recommendation title": "Ba extensions ezali mpo na {extension}", + "extension recommendation message": "Mode ya syntax etiemami te mpo na {extension}. Luka ba plugins mpo na \"{keyword}\".", + "extension request title": "Extension ezwamaki te mpo na {extension}", + "extension request message": "Senga plugin mpo Acode ekoka kolakisa lolenge oyo ya fichier.", + "search plugins": "Luka ba plugins", + "request plugin": "Senga plugin", + "terminal:block": "Bloc", + "terminal:underline": "Mokomi na nse", + "terminal:bar": "Barre", + "terminal:inactive block": "Bloc", + "terminal:inactive underline": "Mokomi na nse", + "terminal:inactive bar": "Barre", + "terminal:inactive none": "Eloko moko te", + "terminal:normal": "Ya momesano", + "terminal:bold": "Makomi minene", + "quicktools-trigger:click": "Finá", + "quicktools-trigger:touch": "Kosimba", + "settings-info-terminal-uninstall": "Oza na ntembe te ete olingi kolongola terminal?", + "terminal:inactive outline": "Ndelo", + "restored successfully": "Terminal ezongisami na elonga", + "uninstalled successfully": "Terminal elongolami na elonga", + "enter plugin source": "Kota source ya plugin", + "enter keywords": "Kota ba maloba ya ntina", + "enter author name": "Kota kombo ya mokomi", + "update available": "Mbongwana ya sika ezali", + "update available info": "Acode {version} ezali sikoyo! Finá awa mpo na kotala yango.", + "plugin updates": "Ba mbongwana ya ba plugins", + "plugin updates singular": "Plugin 1 ezali na version ya sika.", + "plugin updates plural": "Ba plugins {count} ezali na ba versions ya sika.", + "just now": "Sikawa kaka", + "day singular": "Eleki mokolo {count}", + "hour singular": "Eleki ngonga {count}", + "min singular": "Eleki miniti {count}", + "day plural": "Eleki mikolo {count}", + "hour plural": "Eleki bangonga {count}", + "min plural": "Eleki baminiti {count}", + "settings-category-builtin-servers": "Ba serveurs oyo etongami na kati", + "settings-category-plugin-servers": "Ba serveurs ya ba plugins", + "new name": "Kombo ya sika", + "enter new name": "Koma kombo ya sika", + "code actions": "Misala ya code", + "active processes": "Ba processus oyo ezali kosala", + "total memory": "Mémoire mobimba", + "uptime": "Ntango ya mosala", + "note": "Likebisi", + "acode main process": "Processus monene ya Acode", + "ppid parent": "PPID (Moboti)", + "unknown": "Eyebani te", + "just started": "Ebandi sikawa", + "diff days": "Eleki mikolo {days}, bangonga {hr}", + "diff hr": "Eleki {hr}h {min}m", + "diff min": "Eleki {min}m {sec}s", + "diff sec": "Eleki {sec}s", + "command": "Mitindo", + "managed": "Etambwisami", + "acode service": "Service ya Acode", + "info-terminal-show-scrollbar": "Lakisa scrollbar ya xterm pembeni ya terminal.", + "terminal:show scrollbar": "Lakisa barre ya défilement", + "apply exclusions when copying": "Salela ba exclusions ntango ozali kokopa", + "settings-info-app-use-file-operation-exclusions": "Pusa ba fichier mpe ba dossier oyo ekokani na ba règles ya exclusion tango ya kopiya mpe kokanga.", + "horizontal scroll margin": "Marge ya kokita na ngámbo", + "settings-info-horizontal-scroll-margin": "Bakisa esika ya pamba nsima ya ligne oyo eleki molai ntango retour à la ligne ezali kosalelama te. Tia motuya mobimba ya pixels oyo ezali négatif te.", + "conflict error": "Matata! Zela liboso ya kosala commit mosusu.", + "terminal:failsafe": "Mode FailSafe", + "app icon": "App icon", + "app icon changed": "App icon changed", + "settings-info-app-icon": "Choose the app icon displayed on your device.", + "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", + "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", + "rewarded ad failed": "The ad could not be completed. Please try again.", + "rewarded ad incomplete": "Finish watching the ad to earn the reward." +} diff --git a/src/lang/ml-in.json b/src/lang/ml-in.json index cc44821d8f..d0f3823fea 100644 --- a/src/lang/ml-in.json +++ b/src/lang/ml-in.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ഈ ആപ്പ് ഐക്കൺ ഉപയോഗിക്കാൻ പ്രതിഫലമുള്ള ഒരു പരസ്യം കാണണോ?", "rewarded ad unavailable": "പ്രതിഫലമുള്ള പരസ്യങ്ങൾ ഇപ്പോൾ ലഭ്യമല്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", "rewarded ad failed": "പരസ്യം പൂർത്തിയാക്കാനായില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", - "rewarded ad incomplete": "പ്രതിഫലം ലഭിക്കാൻ പരസ്യം മുഴുവനായി കാണുക." + "rewarded ad incomplete": "പ്രതിഫലം ലഭിക്കാൻ പരസ്യം മുഴുവനായി കാണുക.", + "plugin-review:dialog-label": "പ്ലഗിൻ അവലോകനങ്ങൾ", + "plugin-review:account-check-failed": "നിങ്ങളുടെ അക്കൗണ്ട് പരിശോധിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക.", + "plugin-review:sign-in": "അവലോകനം നൽകാൻ സൈൻ ഇൻ ചെയ്യുക", + "plugin-review:edit": "നിങ്ങളുടെ അവലോകനം തിരുത്തുക", + "plugin-review:add": "അവലോകനം ചേർക്കുക...", + "plugin-review:placeholder": "നിങ്ങളുടെ അനുഭവം പങ്കിടുക...", + "plugin-review:input-label": "പ്ലഗിൻ അവലോകനം", + "plugin-review:vote-group-label": "വോട്ട്", + "plugin-review:thumbs-up": "ഇഷ്ടപ്പെട്ടു", + "plugin-review:thumbs-down": "ഇഷ്ടപ്പെട്ടില്ല", + "plugin-review:delete": "അവലോകനം ഇല്ലാതാക്കുക", + "plugin-review:load-failed": "അവലോകനങ്ങൾ ലോഡ് ചെയ്യാനായില്ല.", + "plugin-review:retry": "വീണ്ടും ശ്രമിക്കുക", + "plugin-review:empty-title": "ഇതുവരെ അവലോകനങ്ങളൊന്നുമില്ല", + "plugin-review:empty-description": "നിങ്ങളുടെ അനുഭവം ആദ്യം പങ്കിടൂ.", + "plugin-review:yours": "നിങ്ങളുടെ അവലോകനം", + "plugin-review:community": "കമ്മ്യൂണിറ്റി അവലോകനങ്ങൾ", + "plugin-review:no-other-reviews": "മറ്റ് അവലോകനങ്ങളൊന്നും ഇതുവരെ ഇല്ല.", + "plugin-review:login-incomplete": "സൈൻ ഇൻ പൂർത്തിയായില്ല.", + "plugin-review:sign-in-failed": "സൈൻ ഇൻ ചെയ്യാനായില്ല.", + "plugin-review:session-expired-review": "നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. അവലോകനം നൽകാൻ വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.", + "plugin-review:save-failed": "അവലോകനം സേവ് ചെയ്യാനായില്ല.", + "plugin-review:delete-confirmation": "നിങ്ങളുടെ അവലോകനം ഇല്ലാതാക്കണോ? ഇത് പഴയപടിയാക്കാനാകില്ല.", + "plugin-review:session-expired-continue": "നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. തുടരാൻ വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.", + "plugin-review:delete-failed": "അവലോകനം ഇല്ലാതാക്കാനായില്ല.", + "plugin-review:you": "നിങ്ങൾ", + "plugin-review:edit-action": "അവലോകനം തിരുത്തുക", + "plugin-review:recommended": "ഈ പ്ലഗിൻ ശുപാർശ ചെയ്തു", + "plugin-review:error-max-length": "അവലോകനം {max} അക്ഷരങ്ങളോ അതിൽ കുറവോ ആയിരിക്കണം.", + "plugin-review:error-downvote-comment": "എന്താണ് മെച്ചപ്പെടുത്താനാകുന്നതെന്ന് ഡെവലപ്പറോട് പറയുക.", + "plugin-review:error-empty": "ഒരു അഭിപ്രായം ചേർക്കുക അല്ലെങ്കിൽ ഇഷ്ടപ്പെട്ടു തിരഞ്ഞെടുക്കുക.", + "plugin-review:unrated": "വിലയിരുത്തിയിട്ടില്ല" } diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json index 2c0ca208c0..9f67ac2983 100644 --- a/src/lang/mm-unicode.json +++ b/src/lang/mm-unicode.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ဤအက်ပ်အိုင်ကွန်ကို အသုံးပြုရန် ဆုရကြော်ငြာတစ်ခုကို ကြည့်မလား။", "rewarded ad unavailable": "ဆုရကြော်ငြာများကို လောလောဆယ် မရနိုင်ပါ။ ထပ်မံကြိုးစားပါ။", "rewarded ad failed": "ကြော်ငြာကို အဆုံးအထိ မပြသနိုင်ခဲ့ပါ။ ထပ်မံကြိုးစားပါ။", - "rewarded ad incomplete": "ဆုရရှိရန် ကြော်ငြာကို အဆုံးအထိ ကြည့်ပါ။" + "rewarded ad incomplete": "ဆုရရှိရန် ကြော်ငြာကို အဆုံးအထိ ကြည့်ပါ။", + "plugin-review:dialog-label": "ပလပ်အင် သုံးသပ်ချက်များ", + "plugin-review:account-check-failed": "သင့်အကောင့်ကို စစ်ဆေး၍မရပါ။ ထပ်မံကြိုးစားပါ။", + "plugin-review:sign-in": "သုံးသပ်ချက်ရေးရန် အကောင့်ဝင်ပါ", + "plugin-review:edit": "သင့်သုံးသပ်ချက်ကို ပြင်ဆင်ပါ", + "plugin-review:add": "သုံးသပ်ချက် ထည့်ရန်...", + "plugin-review:placeholder": "သင့်အတွေ့အကြုံကို မျှဝေပါ...", + "plugin-review:input-label": "ပလပ်အင် သုံးသပ်ချက်", + "plugin-review:vote-group-label": "မဲ", + "plugin-review:thumbs-up": "ကြိုက်သည်", + "plugin-review:thumbs-down": "မကြိုက်ပါ", + "plugin-review:delete": "သုံးသပ်ချက် ဖျက်ရန်", + "plugin-review:load-failed": "သုံးသပ်ချက်များကို ဖွင့်၍မရပါ။", + "plugin-review:retry": "ထပ်မံကြိုးစားပါ", + "plugin-review:empty-title": "သုံးသပ်ချက် မရှိသေးပါ", + "plugin-review:empty-description": "သင့်အတွေ့အကြုံကို ပထမဆုံး မျှဝေပါ။", + "plugin-review:yours": "သင့်သုံးသပ်ချက်", + "plugin-review:community": "အသိုင်းအဝိုင်း သုံးသပ်ချက်များ", + "plugin-review:no-other-reviews": "အခြားသုံးသပ်ချက် မရှိသေးပါ။", + "plugin-review:login-incomplete": "အကောင့်ဝင်ခြင်း မပြီးဆုံးပါ။", + "plugin-review:sign-in-failed": "အကောင့်ဝင်၍မရပါ။", + "plugin-review:session-expired-review": "သင့်အသုံးပြုချိန် ကုန်ဆုံးသွားပါပြီ။ သုံးသပ်ချက်ရေးရန် ပြန်ဝင်ပါ။", + "plugin-review:save-failed": "သုံးသပ်ချက်ကို သိမ်း၍မရပါ။", + "plugin-review:delete-confirmation": "သင့်သုံးသပ်ချက်ကို ဖျက်မလား။ ပြန်ယူ၍မရပါ။", + "plugin-review:session-expired-continue": "သင့်အသုံးပြုချိန် ကုန်ဆုံးသွားပါပြီ။ ဆက်လုပ်ရန် ပြန်ဝင်ပါ။", + "plugin-review:delete-failed": "သုံးသပ်ချက်ကို ဖျက်၍မရပါ။", + "plugin-review:you": "သင်", + "plugin-review:edit-action": "သုံးသပ်ချက် ပြင်ဆင်ရန်", + "plugin-review:recommended": "ဤပလပ်အင်ကို အကြံပြုထားသည်", + "plugin-review:error-max-length": "သုံးသပ်ချက်သည် စာလုံးရေ {max} လုံး သို့မဟုတ် ထိုထက်နည်းရမည်။", + "plugin-review:error-downvote-comment": "မည်သည့်အရာကို ပိုကောင်းအောင်လုပ်နိုင်ကြောင်း developer ကို ပြောပါ။", + "plugin-review:error-empty": "မှတ်ချက်ထည့်ပါ သို့မဟုတ် ကြိုက်သည်ကို ရွေးပါ။", + "plugin-review:unrated": "အဆင့်မသတ်မှတ်ရသေးပါ" } diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json index 0e9f1b919e..de23b6e30c 100644 --- a/src/lang/mm-zawgyi.json +++ b/src/lang/mm-zawgyi.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ဤအက္ပ္အိုင္ကြန္ကို အသုံးျပဳရန္ ဆုရေၾကာ္ျငာတစ္ခုကို ၾကည့္မလား။", "rewarded ad unavailable": "ဆုရေၾကာ္ျငာမ်ားကို ေလာေလာဆယ္ မရႏိုင္ပါ။ ထပ္မံႀကိဳးစားပါ။", "rewarded ad failed": "ေၾကာ္ျငာကို အဆုံးအထိ မျပသႏိုင္ခဲ့ပါ။ ထပ္မံႀကိဳးစားပါ။", - "rewarded ad incomplete": "ဆုရရွိရန္ ေၾကာ္ျငာကို အဆုံးအထိ ၾကည့္ပါ။" + "rewarded ad incomplete": "ဆုရရွိရန္ ေၾကာ္ျငာကို အဆုံးအထိ ၾကည့္ပါ။", + "plugin-review:dialog-label": "ပလပ္အင္ သုံးသပ္ခ်က္မ်ား", + "plugin-review:account-check-failed": "သင့္အေကာင့္ကို စစ္ေဆး၍မရပါ။ ထပ္မံႀကိဳးစားပါ။", + "plugin-review:sign-in": "သုံးသပ္ခ်က္ေရးရန္ အေကာင့္ဝင္ပါ", + "plugin-review:edit": "သင့္သုံးသပ္ခ်က္ကို ျပင္ဆင္ပါ", + "plugin-review:add": "သုံးသပ္ခ်က္ ထည့္ရန္...", + "plugin-review:placeholder": "သင့္အေတြ႕အႀကဳံကို မွ်ေဝပါ...", + "plugin-review:input-label": "ပလပ္အင္ သုံးသပ္ခ်က္", + "plugin-review:vote-group-label": "မဲ", + "plugin-review:thumbs-up": "ႀကိဳက္သည္", + "plugin-review:thumbs-down": "မႀကိဳက္ပါ", + "plugin-review:delete": "သုံးသပ္ခ်က္ ဖ်က္ရန္", + "plugin-review:load-failed": "သုံးသပ္ခ်က္မ်ားကို ဖြင့္၍မရပါ။", + "plugin-review:retry": "ထပ္မံႀကိဳးစားပါ", + "plugin-review:empty-title": "သုံးသပ္ခ်က္ မရွိေသးပါ", + "plugin-review:empty-description": "သင့္အေတြ႕အႀကဳံကို ပထမဆုံး မွ်ေဝပါ။", + "plugin-review:yours": "သင့္သုံးသပ္ခ်က္", + "plugin-review:community": "အသိုင္းအဝိုင္း သုံးသပ္ခ်က္မ်ား", + "plugin-review:no-other-reviews": "အျခားသုံးသပ္ခ်က္ မရွိေသးပါ။", + "plugin-review:login-incomplete": "အေကာင့္ဝင္ျခင္း မၿပီးဆုံးပါ။", + "plugin-review:sign-in-failed": "အေကာင့္ဝင္၍မရပါ။", + "plugin-review:session-expired-review": "သင့္အသုံးျပဳခ်ိန္ ကုန္ဆုံးသြားပါၿပီ။ သုံးသပ္ခ်က္ေရးရန္ ျပန္ဝင္ပါ။", + "plugin-review:save-failed": "သုံးသပ္ခ်က္ကို သိမ္း၍မရပါ။", + "plugin-review:delete-confirmation": "သင့္သုံးသပ္ခ်က္ကို ဖ်က္မလား။ ျပန္ယူ၍မရပါ။", + "plugin-review:session-expired-continue": "သင့္အသုံးျပဳခ်ိန္ ကုန္ဆုံးသြားပါၿပီ။ ဆက္လုပ္ရန္ ျပန္ဝင္ပါ။", + "plugin-review:delete-failed": "သုံးသပ္ခ်က္ကို ဖ်က္၍မရပါ။", + "plugin-review:you": "သင္", + "plugin-review:edit-action": "သုံးသပ္ခ်က္ ျပင္ဆင္ရန္", + "plugin-review:recommended": "ဤပလပ္အင္ကို အႀကံျပဳထားသည္", + "plugin-review:error-max-length": "သုံးသပ္ခ်က္သည္ စာလုံးေရ {max} လုံး သို႔မဟုတ္ ထိုထက္နည္းရမည္။", + "plugin-review:error-downvote-comment": "မည္သည့္အရာကို ပိုေကာင္းေအာင္လုပ္ႏိုင္ေၾကာင္း developer ကို ေျပာပါ။", + "plugin-review:error-empty": "မွတ္ခ်က္ထည့္ပါ သို႔မဟုတ္ ႀကိဳက္သည္ကို ေ႐ြးပါ။", + "plugin-review:unrated": "အဆင့္မသတ္မွတ္ရေသးပါ" } diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json index 843821641a..890c7082b7 100644 --- a/src/lang/pl-pl.json +++ b/src/lang/pl-pl.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Obejrzeć reklamę z nagrodą, aby zastosować tę ikonę aplikacji?", "rewarded ad unavailable": "Reklamy z nagrodą są teraz niedostępne. Spróbuj ponownie.", "rewarded ad failed": "Nie udało się ukończyć reklamy. Spróbuj ponownie.", - "rewarded ad incomplete": "Obejrzyj reklamę do końca, aby otrzymać nagrodę." + "rewarded ad incomplete": "Obejrzyj reklamę do końca, aby otrzymać nagrodę.", + "plugin-review:dialog-label": "Opinie o wtyczce", + "plugin-review:account-check-failed": "Nie udało się sprawdzić Twojego konta. Spróbuj ponownie.", + "plugin-review:sign-in": "Zaloguj się, aby dodać opinię", + "plugin-review:edit": "Edytuj swoją opinię", + "plugin-review:add": "Dodaj opinię…", + "plugin-review:placeholder": "Podziel się swoim doświadczeniem…", + "plugin-review:input-label": "Opinia o wtyczce", + "plugin-review:vote-group-label": "Głos", + "plugin-review:thumbs-up": "Lubię", + "plugin-review:thumbs-down": "Nie lubię", + "plugin-review:delete": "Usuń opinię", + "plugin-review:load-failed": "Nie udało się wczytać opinii.", + "plugin-review:retry": "Spróbuj ponownie", + "plugin-review:empty-title": "Brak opinii", + "plugin-review:empty-description": "Podziel się swoim doświadczeniem jako pierwsza osoba.", + "plugin-review:yours": "Twoja opinia", + "plugin-review:community": "Opinie społeczności", + "plugin-review:no-other-reviews": "Nie ma jeszcze innych opinii.", + "plugin-review:login-incomplete": "Logowanie nie zostało ukończone.", + "plugin-review:sign-in-failed": "Nie udało się zalogować.", + "plugin-review:session-expired-review": "Twoja sesja wygasła. Zaloguj się ponownie, aby dodać opinię.", + "plugin-review:save-failed": "Nie udało się zapisać opinii.", + "plugin-review:delete-confirmation": "Usunąć Twoją opinię? Tej operacji nie można cofnąć.", + "plugin-review:session-expired-continue": "Twoja sesja wygasła. Zaloguj się ponownie, aby kontynuować.", + "plugin-review:delete-failed": "Nie udało się usunąć opinii.", + "plugin-review:you": "Ty", + "plugin-review:edit-action": "Edytuj opinię", + "plugin-review:recommended": "Poleca tę wtyczkę", + "plugin-review:error-max-length": "Opinia może mieć maksymalnie {max} znaków.", + "plugin-review:error-downvote-comment": "Powiedz deweloperowi, co można poprawić.", + "plugin-review:error-empty": "Dodaj komentarz lub wybierz „Lubię”.", + "plugin-review:unrated": "Bez oceny" } diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json index 6ac0faea49..09938cbf79 100644 --- a/src/lang/pt-br.json +++ b/src/lang/pt-br.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Assistir a um anúncio com recompensa para aplicar este ícone do aplicativo?", "rewarded ad unavailable": "Os anúncios com recompensa estão indisponíveis no momento. Tente novamente.", "rewarded ad failed": "Não foi possível concluir o anúncio. Tente novamente.", - "rewarded ad incomplete": "Assista ao anúncio até o fim para receber a recompensa." + "rewarded ad incomplete": "Assista ao anúncio até o fim para receber a recompensa.", + "plugin-review:dialog-label": "Avaliações do plugin", + "plugin-review:account-check-failed": "Não foi possível verificar sua conta. Tente novamente.", + "plugin-review:sign-in": "Entre para avaliar", + "plugin-review:edit": "Editar sua avaliação", + "plugin-review:add": "Adicionar uma avaliação...", + "plugin-review:placeholder": "Compartilhe sua experiência...", + "plugin-review:input-label": "Avaliação do plugin", + "plugin-review:vote-group-label": "Voto", + "plugin-review:thumbs-up": "Gostei", + "plugin-review:thumbs-down": "Não gostei", + "plugin-review:delete": "Excluir avaliação", + "plugin-review:load-failed": "Não foi possível carregar as avaliações.", + "plugin-review:retry": "Tentar novamente", + "plugin-review:empty-title": "Ainda não há avaliações", + "plugin-review:empty-description": "Seja a primeira pessoa a compartilhar sua experiência.", + "plugin-review:yours": "Sua avaliação", + "plugin-review:community": "Avaliações da comunidade", + "plugin-review:no-other-reviews": "Ainda não há outras avaliações.", + "plugin-review:login-incomplete": "O login não foi concluído.", + "plugin-review:sign-in-failed": "Não foi possível entrar.", + "plugin-review:session-expired-review": "Sua sessão expirou. Entre novamente para avaliar.", + "plugin-review:save-failed": "Não foi possível salvar a avaliação.", + "plugin-review:delete-confirmation": "Excluir sua avaliação? Esta ação não pode ser desfeita.", + "plugin-review:session-expired-continue": "Sua sessão expirou. Entre novamente para continuar.", + "plugin-review:delete-failed": "Não foi possível excluir a avaliação.", + "plugin-review:you": "Você", + "plugin-review:edit-action": "Editar avaliação", + "plugin-review:recommended": "Recomendou este plugin", + "plugin-review:error-max-length": "A avaliação deve ter no máximo {max} caracteres.", + "plugin-review:error-downvote-comment": "Diga ao desenvolvedor o que pode ser melhorado.", + "plugin-review:error-empty": "Adicione um comentário ou escolha Gostei.", + "plugin-review:unrated": "Sem avaliação" } diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json index c0030f7bb2..7f29eb6f43 100644 --- a/src/lang/pu-in.json +++ b/src/lang/pu-in.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ਕੀ ਇਸ ਐਪ ਆਈਕਨ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਇੱਕ ਇਨਾਮ ਵਾਲਾ ਇਸ਼ਤਿਹਾਰ ਦੇਖਣਾ ਹੈ?", "rewarded ad unavailable": "ਇਨਾਮ ਵਾਲੇ ਇਸ਼ਤਿਹਾਰ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", "rewarded ad failed": "ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਨਹੀਂ ਹੋ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", - "rewarded ad incomplete": "ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਦੇਖੋ।" + "rewarded ad incomplete": "ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਦੇਖੋ।", + "plugin-review:dialog-label": "ਪਲੱਗਇਨ ਸਮੀਖਿਆਵਾਂ", + "plugin-review:account-check-failed": "ਤੁਹਾਡੇ ਖਾਤੇ ਦੀ ਜਾਂਚ ਨਹੀਂ ਹੋ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", + "plugin-review:sign-in": "ਸਮੀਖਿਆ ਦੇਣ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ", + "plugin-review:edit": "ਆਪਣੀ ਸਮੀਖਿਆ ਸੋਧੋ", + "plugin-review:add": "ਸਮੀਖਿਆ ਸ਼ਾਮਲ ਕਰੋ...", + "plugin-review:placeholder": "ਆਪਣਾ ਅਨੁਭਵ ਸਾਂਝਾ ਕਰੋ...", + "plugin-review:input-label": "ਪਲੱਗਇਨ ਸਮੀਖਿਆ", + "plugin-review:vote-group-label": "ਵੋਟ", + "plugin-review:thumbs-up": "ਪਸੰਦ", + "plugin-review:thumbs-down": "ਨਾਪਸੰਦ", + "plugin-review:delete": "ਸਮੀਖਿਆ ਮਿਟਾਓ", + "plugin-review:load-failed": "ਸਮੀਖਿਆਵਾਂ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀਆਂ।", + "plugin-review:retry": "ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ", + "plugin-review:empty-title": "ਹਾਲੇ ਕੋਈ ਸਮੀਖਿਆ ਨਹੀਂ", + "plugin-review:empty-description": "ਆਪਣਾ ਅਨੁਭਵ ਸਾਂਝਾ ਕਰਨ ਵਾਲੇ ਪਹਿਲੇ ਵਿਅਕਤੀ ਬਣੋ।", + "plugin-review:yours": "ਤੁਹਾਡੀ ਸਮੀਖਿਆ", + "plugin-review:community": "ਭਾਈਚਾਰੇ ਦੀਆਂ ਸਮੀਖਿਆਵਾਂ", + "plugin-review:no-other-reviews": "ਹਾਲੇ ਹੋਰ ਕੋਈ ਸਮੀਖਿਆ ਨਹੀਂ।", + "plugin-review:login-incomplete": "ਸਾਈਨ ਇਨ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ।", + "plugin-review:sign-in-failed": "ਸਾਈਨ ਇਨ ਨਹੀਂ ਹੋ ਸਕਿਆ।", + "plugin-review:session-expired-review": "ਤੁਹਾਡਾ ਸੈਸ਼ਨ ਖਤਮ ਹੋ ਗਿਆ। ਸਮੀਖਿਆ ਦੇਣ ਲਈ ਦੁਬਾਰਾ ਸਾਈਨ ਇਨ ਕਰੋ।", + "plugin-review:save-failed": "ਸਮੀਖਿਆ ਸੰਭਾਲੀ ਨਹੀਂ ਜਾ ਸਕੀ।", + "plugin-review:delete-confirmation": "ਆਪਣੀ ਸਮੀਖਿਆ ਮਿਟਾਉਣੀ ਹੈ? ਇਹ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।", + "plugin-review:session-expired-continue": "ਤੁਹਾਡਾ ਸੈਸ਼ਨ ਖਤਮ ਹੋ ਗਿਆ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਦੁਬਾਰਾ ਸਾਈਨ ਇਨ ਕਰੋ।", + "plugin-review:delete-failed": "ਸਮੀਖਿਆ ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।", + "plugin-review:you": "ਤੁਸੀਂ", + "plugin-review:edit-action": "ਸਮੀਖਿਆ ਸੋਧੋ", + "plugin-review:recommended": "ਇਸ ਪਲੱਗਇਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ", + "plugin-review:error-max-length": "ਸਮੀਖਿਆ {max} ਅੱਖਰਾਂ ਜਾਂ ਇਸ ਤੋਂ ਘੱਟ ਦੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।", + "plugin-review:error-downvote-comment": "ਡਿਵੈਲਪਰ ਨੂੰ ਦੱਸੋ ਕਿ ਕੀ ਸੁਧਾਰਿਆ ਜਾ ਸਕਦਾ ਹੈ।", + "plugin-review:error-empty": "ਟਿੱਪਣੀ ਸ਼ਾਮਲ ਕਰੋ ਜਾਂ ਪਸੰਦ ਚੁਣੋ।", + "plugin-review:unrated": "ਹਾਲੇ ਮੁਲਾਂਕਣ ਨਹੀਂ" } diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json index 3fa063c1db..0453983187 100644 --- a/src/lang/ru-ru.json +++ b/src/lang/ru-ru.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Посмотреть рекламу с вознаграждением, чтобы применить этот значок приложения?", "rewarded ad unavailable": "Реклама с вознаграждением сейчас недоступна. Повторите попытку.", "rewarded ad failed": "Не удалось завершить просмотр рекламы. Повторите попытку.", - "rewarded ad incomplete": "Досмотрите рекламу до конца, чтобы получить награду." + "rewarded ad incomplete": "Досмотрите рекламу до конца, чтобы получить награду.", + "plugin-review:dialog-label": "Отзывы о плагине", + "plugin-review:account-check-failed": "Не удалось проверить вашу учётную запись. Повторите попытку.", + "plugin-review:sign-in": "Войти, чтобы оставить отзыв", + "plugin-review:edit": "Редактировать свой отзыв", + "plugin-review:add": "Добавить отзыв…", + "plugin-review:placeholder": "Поделитесь своим опытом…", + "plugin-review:input-label": "Отзыв о плагине", + "plugin-review:vote-group-label": "Оценка", + "plugin-review:thumbs-up": "Нравится", + "plugin-review:thumbs-down": "Не нравится", + "plugin-review:delete": "Удалить отзыв", + "plugin-review:load-failed": "Не удалось загрузить отзывы.", + "plugin-review:retry": "Повторить", + "plugin-review:empty-title": "Отзывов пока нет", + "plugin-review:empty-description": "Станьте первым, кто поделится своим опытом.", + "plugin-review:yours": "Ваш отзыв", + "plugin-review:community": "Отзывы сообщества", + "plugin-review:no-other-reviews": "Других отзывов пока нет.", + "plugin-review:login-incomplete": "Вход не был завершён.", + "plugin-review:sign-in-failed": "Не удалось войти.", + "plugin-review:session-expired-review": "Сеанс истёк. Войдите снова, чтобы оставить отзыв.", + "plugin-review:save-failed": "Не удалось сохранить отзыв.", + "plugin-review:delete-confirmation": "Удалить ваш отзыв? Это действие нельзя отменить.", + "plugin-review:session-expired-continue": "Сеанс истёк. Войдите снова, чтобы продолжить.", + "plugin-review:delete-failed": "Не удалось удалить отзыв.", + "plugin-review:you": "Вы", + "plugin-review:edit-action": "Редактировать отзыв", + "plugin-review:recommended": "Рекомендует этот плагин", + "plugin-review:error-max-length": "Отзыв должен содержать не более {max} символов.", + "plugin-review:error-downvote-comment": "Расскажите разработчику, что можно улучшить.", + "plugin-review:error-empty": "Добавьте комментарий или выберите «Нравится».", + "plugin-review:unrated": "Нет оценок" } diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json index 2d9d72f94c..3342744dec 100644 --- a/src/lang/tl-ph.json +++ b/src/lang/tl-ph.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Manood ng isang ad na may gantimpala upang gamitin ang icon na ito ng app?", "rewarded ad unavailable": "Hindi available ngayon ang mga ad na may gantimpala. Pakisubukang muli.", "rewarded ad failed": "Hindi nakumpleto ang ad. Pakisubukang muli.", - "rewarded ad incomplete": "Tapusin ang panonood ng ad upang makuha ang gantimpala." + "rewarded ad incomplete": "Tapusin ang panonood ng ad upang makuha ang gantimpala.", + "plugin-review:dialog-label": "Mga review ng plugin", + "plugin-review:account-check-failed": "Hindi masuri ang iyong account. Subukan muli.", + "plugin-review:sign-in": "Mag-sign in para mag-review", + "plugin-review:edit": "I-edit ang iyong review", + "plugin-review:add": "Magdagdag ng review...", + "plugin-review:placeholder": "Ibahagi ang iyong karanasan...", + "plugin-review:input-label": "Review ng plugin", + "plugin-review:vote-group-label": "Boto", + "plugin-review:thumbs-up": "Gusto", + "plugin-review:thumbs-down": "Hindi gusto", + "plugin-review:delete": "I-delete ang review", + "plugin-review:load-failed": "Hindi ma-load ang mga review.", + "plugin-review:retry": "Subukan muli", + "plugin-review:empty-title": "Wala pang review", + "plugin-review:empty-description": "Mauna sa pagbabahagi ng iyong karanasan.", + "plugin-review:yours": "Iyong review", + "plugin-review:community": "Mga review ng komunidad", + "plugin-review:no-other-reviews": "Wala pang ibang review.", + "plugin-review:login-incomplete": "Hindi natapos ang pag-sign in.", + "plugin-review:sign-in-failed": "Hindi makapag-sign in.", + "plugin-review:session-expired-review": "Nag-expire ang iyong session. Mag-sign in muli para mag-review.", + "plugin-review:save-failed": "Hindi mai-save ang review.", + "plugin-review:delete-confirmation": "I-delete ang iyong review? Hindi na ito maibabalik.", + "plugin-review:session-expired-continue": "Nag-expire ang iyong session. Mag-sign in muli para magpatuloy.", + "plugin-review:delete-failed": "Hindi ma-delete ang review.", + "plugin-review:you": "Ikaw", + "plugin-review:edit-action": "I-edit ang review", + "plugin-review:recommended": "Inirerekomenda ang plugin na ito", + "plugin-review:error-max-length": "Dapat {max} character o mas kaunti ang review.", + "plugin-review:error-downvote-comment": "Sabihin sa developer kung ano ang maaaring mapabuti.", + "plugin-review:error-empty": "Magdagdag ng komento o piliin ang Gusto.", + "plugin-review:unrated": "Walang rating" } diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json index 407ca5a8dc..68bc5dafb7 100644 --- a/src/lang/tr-tr.json +++ b/src/lang/tr-tr.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Bu uygulama simgesini kullanmak için bir ödüllü reklam izlensin mi?", "rewarded ad unavailable": "Ödüllü reklamlar şu anda kullanılamıyor. Lütfen tekrar deneyin.", "rewarded ad failed": "Reklam tamamlanamadı. Lütfen tekrar deneyin.", - "rewarded ad incomplete": "Ödülü kazanmak için reklamı sonuna kadar izleyin." + "rewarded ad incomplete": "Ödülü kazanmak için reklamı sonuna kadar izleyin.", + "plugin-review:dialog-label": "Eklenti değerlendirmeleri", + "plugin-review:account-check-failed": "Hesabınız kontrol edilemedi. Tekrar deneyin.", + "plugin-review:sign-in": "Değerlendirmek için oturum açın", + "plugin-review:edit": "Değerlendirmenizi düzenleyin", + "plugin-review:add": "Değerlendirme ekleyin...", + "plugin-review:placeholder": "Deneyiminizi paylaşın...", + "plugin-review:input-label": "Eklenti değerlendirmesi", + "plugin-review:vote-group-label": "Oy", + "plugin-review:thumbs-up": "Beğendim", + "plugin-review:thumbs-down": "Beğenmedim", + "plugin-review:delete": "Değerlendirmeyi sil", + "plugin-review:load-failed": "Değerlendirmeler yüklenemedi.", + "plugin-review:retry": "Tekrar dene", + "plugin-review:empty-title": "Henüz değerlendirme yok", + "plugin-review:empty-description": "Deneyiminizi ilk paylaşan siz olun.", + "plugin-review:yours": "Değerlendirmeniz", + "plugin-review:community": "Topluluk değerlendirmeleri", + "plugin-review:no-other-reviews": "Henüz başka değerlendirme yok.", + "plugin-review:login-incomplete": "Oturum açma tamamlanmadı.", + "plugin-review:sign-in-failed": "Oturum açılamadı.", + "plugin-review:session-expired-review": "Oturumunuzun süresi doldu. Değerlendirmek için tekrar oturum açın.", + "plugin-review:save-failed": "Değerlendirme kaydedilemedi.", + "plugin-review:delete-confirmation": "Değerlendirmeniz silinsin mi? Bu işlem geri alınamaz.", + "plugin-review:session-expired-continue": "Oturumunuzun süresi doldu. Devam etmek için tekrar oturum açın.", + "plugin-review:delete-failed": "Değerlendirme silinemedi.", + "plugin-review:you": "Siz", + "plugin-review:edit-action": "Değerlendirmeyi düzenle", + "plugin-review:recommended": "Bu eklentiyi önerdi", + "plugin-review:error-max-length": "Değerlendirme en fazla {max} karakter olmalıdır.", + "plugin-review:error-downvote-comment": "Geliştiriciye nelerin iyileştirilebileceğini söyleyin.", + "plugin-review:error-empty": "Yorum ekleyin veya Beğendim’i seçin.", + "plugin-review:unrated": "Değerlendirilmedi" } diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json index d4817eb12a..062101b415 100644 --- a/src/lang/uk-ua.json +++ b/src/lang/uk-ua.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Переглянути рекламу з винагородою, щоб застосувати цю піктограму застосунку?", "rewarded ad unavailable": "Реклама з винагородою зараз недоступна. Спробуйте ще раз.", "rewarded ad failed": "Не вдалося завершити перегляд реклами. Спробуйте ще раз.", - "rewarded ad incomplete": "Додивіться рекламу до кінця, щоб отримати винагороду." + "rewarded ad incomplete": "Додивіться рекламу до кінця, щоб отримати винагороду.", + "plugin-review:dialog-label": "Відгуки про плагін", + "plugin-review:account-check-failed": "Не вдалося перевірити ваш обліковий запис. Спробуйте ще раз.", + "plugin-review:sign-in": "Увійти, щоб залишити відгук", + "plugin-review:edit": "Редагувати свій відгук", + "plugin-review:add": "Додати відгук…", + "plugin-review:placeholder": "Поділіться своїм досвідом…", + "plugin-review:input-label": "Відгук про плагін", + "plugin-review:vote-group-label": "Оцінка", + "plugin-review:thumbs-up": "Подобається", + "plugin-review:thumbs-down": "Не подобається", + "plugin-review:delete": "Видалити відгук", + "plugin-review:load-failed": "Не вдалося завантажити відгуки.", + "plugin-review:retry": "Спробувати ще раз", + "plugin-review:empty-title": "Відгуків ще немає", + "plugin-review:empty-description": "Поділіться своїм досвідом першими.", + "plugin-review:yours": "Ваш відгук", + "plugin-review:community": "Відгуки спільноти", + "plugin-review:no-other-reviews": "Інших відгуків ще немає.", + "plugin-review:login-incomplete": "Вхід не було завершено.", + "plugin-review:sign-in-failed": "Не вдалося ввійти.", + "plugin-review:session-expired-review": "Сеанс завершився. Увійдіть знову, щоб залишити відгук.", + "plugin-review:save-failed": "Не вдалося зберегти відгук.", + "plugin-review:delete-confirmation": "Видалити ваш відгук? Цю дію не можна скасувати.", + "plugin-review:session-expired-continue": "Сеанс завершився. Увійдіть знову, щоб продовжити.", + "plugin-review:delete-failed": "Не вдалося видалити відгук.", + "plugin-review:you": "Ви", + "plugin-review:edit-action": "Редагувати відгук", + "plugin-review:recommended": "Рекомендує цей плагін", + "plugin-review:error-max-length": "Відгук має містити не більше {max} символів.", + "plugin-review:error-downvote-comment": "Розкажіть розробнику, що можна покращити.", + "plugin-review:error-empty": "Додайте коментар або виберіть «Подобається».", + "plugin-review:unrated": "Без оцінки" } diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json index da3c2725e4..9b284ee11b 100644 --- a/src/lang/uz-uz.json +++ b/src/lang/uz-uz.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Ushbu ilova belgisini qo‘llash uchun bitta mukofotli reklamani ko‘rasizmi?", "rewarded ad unavailable": "Mukofotli reklamalar hozir mavjud emas. Qayta urinib ko‘ring.", "rewarded ad failed": "Reklamani yakunlab bo‘lmadi. Qayta urinib ko‘ring.", - "rewarded ad incomplete": "Mukofotni olish uchun reklamani oxirigacha tomosha qiling." + "rewarded ad incomplete": "Mukofotni olish uchun reklamani oxirigacha tomosha qiling.", + "plugin-review:dialog-label": "Plagin sharhlari", + "plugin-review:account-check-failed": "Hisobingizni tekshirib bo‘lmadi. Qayta urinib ko‘ring.", + "plugin-review:sign-in": "Sharh qoldirish uchun kiring", + "plugin-review:edit": "Sharhingizni tahrirlash", + "plugin-review:add": "Sharh qo‘shish...", + "plugin-review:placeholder": "Tajribangizni ulashing...", + "plugin-review:input-label": "Plagin sharhi", + "plugin-review:vote-group-label": "Ovoz", + "plugin-review:thumbs-up": "Yoqdi", + "plugin-review:thumbs-down": "Yoqmadi", + "plugin-review:delete": "Sharhni o‘chirish", + "plugin-review:load-failed": "Sharhlarni yuklab bo‘lmadi.", + "plugin-review:retry": "Qayta urinish", + "plugin-review:empty-title": "Hozircha sharhlar yo‘q", + "plugin-review:empty-description": "Tajribangizni birinchi bo‘lib ulashing.", + "plugin-review:yours": "Sharhingiz", + "plugin-review:community": "Hamjamiyat sharhlari", + "plugin-review:no-other-reviews": "Hozircha boshqa sharhlar yo‘q.", + "plugin-review:login-incomplete": "Kirish yakunlanmadi.", + "plugin-review:sign-in-failed": "Tizimga kirib bo‘lmadi.", + "plugin-review:session-expired-review": "Seans muddati tugadi. Sharh qoldirish uchun qayta kiring.", + "plugin-review:save-failed": "Sharhni saqlab bo‘lmadi.", + "plugin-review:delete-confirmation": "Sharhingiz o‘chirilsinmi? Buni ortga qaytarib bo‘lmaydi.", + "plugin-review:session-expired-continue": "Seans muddati tugadi. Davom etish uchun qayta kiring.", + "plugin-review:delete-failed": "Sharhni o‘chirib bo‘lmadi.", + "plugin-review:you": "Siz", + "plugin-review:edit-action": "Sharhni tahrirlash", + "plugin-review:recommended": "Bu plaginni tavsiya qildi", + "plugin-review:error-max-length": "Sharh {max} ta yoki undan kam belgidan iborat bo‘lishi kerak.", + "plugin-review:error-downvote-comment": "Dasturchiga nimani yaxshilash mumkinligini ayting.", + "plugin-review:error-empty": "Izoh qo‘shing yoki “Yoqdi”ni tanlang.", + "plugin-review:unrated": "Baholanmagan" } diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json index 69f567b7ac..131cb3fe91 100644 --- a/src/lang/vi-vn.json +++ b/src/lang/vi-vn.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Xem một quảng cáo có thưởng để áp dụng biểu tượng ứng dụng này?", "rewarded ad unavailable": "Quảng cáo có thưởng hiện không khả dụng. Vui lòng thử lại.", "rewarded ad failed": "Không thể hoàn tất quảng cáo. Vui lòng thử lại.", - "rewarded ad incomplete": "Xem hết quảng cáo để nhận phần thưởng." + "rewarded ad incomplete": "Xem hết quảng cáo để nhận phần thưởng.", + "plugin-review:dialog-label": "Đánh giá plugin", + "plugin-review:account-check-failed": "Không thể kiểm tra tài khoản của bạn. Hãy thử lại.", + "plugin-review:sign-in": "Đăng nhập để đánh giá", + "plugin-review:edit": "Chỉnh sửa đánh giá của bạn", + "plugin-review:add": "Thêm đánh giá...", + "plugin-review:placeholder": "Chia sẻ trải nghiệm của bạn...", + "plugin-review:input-label": "Đánh giá plugin", + "plugin-review:vote-group-label": "Bình chọn", + "plugin-review:thumbs-up": "Thích", + "plugin-review:thumbs-down": "Không thích", + "plugin-review:delete": "Xóa đánh giá", + "plugin-review:load-failed": "Không thể tải các đánh giá.", + "plugin-review:retry": "Thử lại", + "plugin-review:empty-title": "Chưa có đánh giá", + "plugin-review:empty-description": "Hãy là người đầu tiên chia sẻ trải nghiệm.", + "plugin-review:yours": "Đánh giá của bạn", + "plugin-review:community": "Đánh giá từ cộng đồng", + "plugin-review:no-other-reviews": "Chưa có đánh giá nào khác.", + "plugin-review:login-incomplete": "Quá trình đăng nhập chưa hoàn tất.", + "plugin-review:sign-in-failed": "Không thể đăng nhập.", + "plugin-review:session-expired-review": "Phiên của bạn đã hết hạn. Hãy đăng nhập lại để đánh giá.", + "plugin-review:save-failed": "Không thể lưu đánh giá.", + "plugin-review:delete-confirmation": "Xóa đánh giá của bạn? Bạn không thể hoàn tác thao tác này.", + "plugin-review:session-expired-continue": "Phiên của bạn đã hết hạn. Hãy đăng nhập lại để tiếp tục.", + "plugin-review:delete-failed": "Không thể xóa đánh giá.", + "plugin-review:you": "Bạn", + "plugin-review:edit-action": "Chỉnh sửa đánh giá", + "plugin-review:recommended": "Đã đề xuất plugin này", + "plugin-review:error-max-length": "Đánh giá phải có tối đa {max} ký tự.", + "plugin-review:error-downvote-comment": "Hãy cho nhà phát triển biết điều gì có thể được cải thiện.", + "plugin-review:error-empty": "Thêm bình luận hoặc chọn Thích.", + "plugin-review:unrated": "Chưa đánh giá" } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index aaf2d0813f..b5eb3008b8 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -842,5 +842,37 @@ "confirm app icon reward": "观看一条激励广告以应用此应用图标?", "rewarded ad unavailable": "激励广告暂时不可用,请重试。", "rewarded ad failed": "广告未能完成,请重试。", - "rewarded ad incomplete": "请完整观看广告以获得奖励。" + "rewarded ad incomplete": "请完整观看广告以获得奖励。", + "plugin-review:dialog-label": "插件评价", + "plugin-review:account-check-failed": "无法检查你的账户,请重试。", + "plugin-review:sign-in": "登录后评价", + "plugin-review:edit": "编辑你的评价", + "plugin-review:add": "添加评价…", + "plugin-review:placeholder": "分享你的使用体验…", + "plugin-review:input-label": "插件评价", + "plugin-review:vote-group-label": "投票", + "plugin-review:thumbs-up": "赞", + "plugin-review:thumbs-down": "踩", + "plugin-review:delete": "删除评价", + "plugin-review:load-failed": "无法加载评价。", + "plugin-review:retry": "重试", + "plugin-review:empty-title": "暂无评价", + "plugin-review:empty-description": "成为第一个分享使用体验的人。", + "plugin-review:yours": "你的评价", + "plugin-review:community": "社区评价", + "plugin-review:no-other-reviews": "暂无其他评价。", + "plugin-review:login-incomplete": "登录未完成。", + "plugin-review:sign-in-failed": "无法登录。", + "plugin-review:session-expired-review": "会话已过期,请重新登录后评价。", + "plugin-review:save-failed": "无法保存评价。", + "plugin-review:delete-confirmation": "要删除你的评价吗?此操作无法撤销。", + "plugin-review:session-expired-continue": "会话已过期,请重新登录后继续。", + "plugin-review:delete-failed": "无法删除评价。", + "plugin-review:you": "你", + "plugin-review:edit-action": "编辑评价", + "plugin-review:recommended": "推荐了此插件", + "plugin-review:error-max-length": "评价不能超过 {max} 个字符。", + "plugin-review:error-downvote-comment": "告诉开发者哪些地方可以改进。", + "plugin-review:error-empty": "添加评论或选择“赞”。", + "plugin-review:unrated": "暂无评分" } diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json index bf2ac76f22..5de4315970 100644 --- a/src/lang/zh-hant.json +++ b/src/lang/zh-hant.json @@ -842,5 +842,37 @@ "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", "rewarded ad unavailable": "獎勵廣告暫時無法使用,請再試一次。", "rewarded ad failed": "廣告未能完成,請再試一次。", - "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。", + "plugin-review:dialog-label": "外掛評論", + "plugin-review:account-check-failed": "無法檢查你的帳戶,請再試一次。", + "plugin-review:sign-in": "登入以撰寫評論", + "plugin-review:edit": "編輯你的評論", + "plugin-review:add": "新增評論…", + "plugin-review:placeholder": "分享你的使用體驗…", + "plugin-review:input-label": "外掛評論", + "plugin-review:vote-group-label": "投票", + "plugin-review:thumbs-up": "讚", + "plugin-review:thumbs-down": "倒讚", + "plugin-review:delete": "刪除評論", + "plugin-review:load-failed": "無法載入評論。", + "plugin-review:retry": "重試", + "plugin-review:empty-title": "尚無評論", + "plugin-review:empty-description": "成為第一個分享使用體驗的人。", + "plugin-review:yours": "你的評論", + "plugin-review:community": "社群評論", + "plugin-review:no-other-reviews": "尚無其他評論。", + "plugin-review:login-incomplete": "登入未完成。", + "plugin-review:sign-in-failed": "無法登入。", + "plugin-review:session-expired-review": "工作階段已過期,請重新登入以撰寫評論。", + "plugin-review:save-failed": "無法儲存評論。", + "plugin-review:delete-confirmation": "要刪除你的評論嗎?此操作無法復原。", + "plugin-review:session-expired-continue": "工作階段已過期,請重新登入以繼續。", + "plugin-review:delete-failed": "無法刪除評論。", + "plugin-review:you": "你", + "plugin-review:edit-action": "編輯評論", + "plugin-review:recommended": "推薦了此外掛", + "plugin-review:error-max-length": "評論不得超過 {max} 個字元。", + "plugin-review:error-downvote-comment": "告訴開發者哪些地方可以改進。", + "plugin-review:error-empty": "新增留言或選擇「讚」。", + "plugin-review:unrated": "尚未評分" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 1204930d69..1fa59224d3 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -842,5 +842,37 @@ "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", "rewarded ad unavailable": "獎勵廣告目前無法使用,請再試一次。", "rewarded ad failed": "廣告未能完成,請再試一次。", - "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。", + "plugin-review:dialog-label": "外掛評論", + "plugin-review:account-check-failed": "無法檢查你的帳號,請再試一次。", + "plugin-review:sign-in": "登入以撰寫評論", + "plugin-review:edit": "編輯你的評論", + "plugin-review:add": "新增評論…", + "plugin-review:placeholder": "分享你的使用心得…", + "plugin-review:input-label": "外掛評論", + "plugin-review:vote-group-label": "評分", + "plugin-review:thumbs-up": "讚", + "plugin-review:thumbs-down": "倒讚", + "plugin-review:delete": "刪除評論", + "plugin-review:load-failed": "無法載入評論。", + "plugin-review:retry": "重試", + "plugin-review:empty-title": "目前沒有評論", + "plugin-review:empty-description": "成為第一個分享使用心得的人。", + "plugin-review:yours": "你的評論", + "plugin-review:community": "社群評論", + "plugin-review:no-other-reviews": "目前沒有其他評論。", + "plugin-review:login-incomplete": "登入未完成。", + "plugin-review:sign-in-failed": "無法登入。", + "plugin-review:session-expired-review": "工作階段已過期,請重新登入以撰寫評論。", + "plugin-review:save-failed": "無法儲存評論。", + "plugin-review:delete-confirmation": "要刪除你的評論嗎?此動作無法復原。", + "plugin-review:session-expired-continue": "工作階段已過期,請重新登入以繼續。", + "plugin-review:delete-failed": "無法刪除評論。", + "plugin-review:you": "你", + "plugin-review:edit-action": "編輯評論", + "plugin-review:recommended": "推薦這個外掛", + "plugin-review:error-max-length": "評論不得超過 {max} 個字元。", + "plugin-review:error-downvote-comment": "告訴開發者哪些地方可以改進。", + "plugin-review:error-empty": "新增留言或選擇「讚」。", + "plugin-review:unrated": "尚未評分" } diff --git a/src/lib/acode.js b/src/lib/acode.js index 6d9310d245..d5a0f2de62 100644 --- a/src/lib/acode.js +++ b/src/lib/acode.js @@ -718,7 +718,7 @@ class Acode { } get exitAppMessage() { - const numFiles = editorManager.hasUnsavedFiles(); + const numFiles = editorManager?.hasUnsavedFiles?.() ?? 0; if (numFiles) { return strings["unsaved files close app"]; } diff --git a/src/lib/adConsentCoordinator.mjs b/src/lib/adConsentCoordinator.mjs index 5a23de1737..4391e22aac 100644 --- a/src/lib/adConsentCoordinator.mjs +++ b/src/lib/adConsentCoordinator.mjs @@ -35,6 +35,7 @@ export class AdConsentCoordinator { #state = EMPTY_PRIVACY_STATE; #consentPromise; #adStartPromise; + #privacyOptionsPromise; #listeners = new Set(); constructor({ privacy, initializeAds, onError = console.error }) { @@ -51,7 +52,14 @@ export class AdConsentCoordinator { return (this.#consentPromise ??= this.#gatherAndStart()); } - async showPrivacyOptions() { + showPrivacyOptions() { + this.#privacyOptionsPromise ??= this.#showPrivacyOptions().finally(() => { + this.#privacyOptionsPromise = undefined; + }); + return this.#privacyOptionsPromise; + } + + async #showPrivacyOptions() { const state = await this.#privacy.showOptions(); this.#setState(state); await this.#startAdsIfAllowed(); diff --git a/src/lib/bannerVisibilityController.mjs b/src/lib/bannerVisibilityController.mjs index c02df5b80b..517e914d02 100644 --- a/src/lib/bannerVisibilityController.mjs +++ b/src/lib/bannerVisibilityController.mjs @@ -10,6 +10,9 @@ export const BANNER_SUPPRESSION_REASON = Object.freeze({ REWARDED_PASS: "rewarded-pass", }); +const DEFAULT_RETRY_DELAY_MS = 500; +const TRANSIENT_LOAD_ERROR_CODES = new Set([0, 2, 3, 9]); + export class BannerVisibilityController { #banner = null; #registeredPages = new WeakSet(); @@ -20,9 +23,13 @@ export class BannerVisibilityController { #suppressions = new Set(); #nativeVisible = false; #scheduledVisible = false; + #desiredVisible = false; #operation = Promise.resolve(); #revision = 0; #onError; + #retryTimer = null; + #retryUsed = false; + #stopBannerListeners = []; constructor({ getActivePage, @@ -35,9 +42,13 @@ export class BannerVisibilityController { } setBanner(banner) { + this.#stopListeningToBanner(); + this.#resetRetry(); + this.#revision++; this.#banner = banner; this.#nativeVisible = false; this.#scheduledVisible = false; + this.#listenToBanner(banner); this.reconcile(); } @@ -83,6 +94,12 @@ export class BannerVisibilityController { activePage !== null && this.#registeredPages.has(activePage); const shouldShow = pageRequestsBanner && !this.#keyboardVisible; + const eligibilityChanged = shouldShow !== this.#desiredVisible; + this.#desiredVisible = shouldShow; + + if (!shouldShow || eligibilityChanged) { + this.#resetRetry(); + } if (this.#banner) { this.#banner.active = pageRequestsBanner; @@ -98,7 +115,12 @@ export class BannerVisibilityController { dispose() { this.#stopObserving?.(); this.#stopObserving = null; + this.#stopListeningToBanner(); + this.#resetRetry(); this.#banner = null; + this.#desiredVisible = false; + this.#nativeVisible = false; + this.#scheduledVisible = false; this.#revision++; } @@ -107,9 +129,16 @@ export class BannerVisibilityController { this.#stopObserving = this.#observePageChanges(() => this.reconcile()); } - #queueNativeVisibility(shouldShow) { + #queueNativeVisibility(shouldShow, isRetry = false) { const banner = this.#banner; - if (!banner || shouldShow === this.#scheduledVisible) return; + if ( + !banner || + shouldShow === this.#scheduledVisible || + (shouldShow && + (this.#retryTimer !== null || (this.#retryUsed && !isRetry))) + ) { + return; + } this.#scheduledVisible = shouldShow; const revision = ++this.#revision; @@ -124,14 +153,80 @@ export class BannerVisibilityController { } else { await banner.hide?.(); } + if (revision !== this.#revision || banner !== this.#banner) return; this.#nativeVisible = shouldShow; } catch (error) { + if (revision !== this.#revision || banner !== this.#banner) return; this.#nativeVisible = !shouldShow; this.#scheduledVisible = !shouldShow; this.#onError(error); + if (shouldShow) this.#scheduleRetry(); } }); } + + #listenToBanner(banner) { + if (typeof banner?.on !== "function") return; + + for (const [eventName, listener] of [ + ["load", () => this.#handleBannerLoad()], + ["loadfail", (event) => this.#handleBannerLoadFailure(event)], + ]) { + const stopListening = banner.on(eventName, listener); + if (typeof stopListening === "function") { + this.#stopBannerListeners.push(stopListening); + } + } + } + + #stopListeningToBanner() { + for (const stopListening of this.#stopBannerListeners.splice(0)) { + stopListening(); + } + } + + #handleBannerLoad() { + this.#resetRetry(); + if (!this.#desiredVisible) return; + + this.#nativeVisible = true; + this.#scheduledVisible = true; + } + + #handleBannerLoadFailure(event) { + this.#nativeVisible = false; + this.#scheduledVisible = false; + this.#onError(event); + + const errorCode = Number(event?.code); + if (TRANSIENT_LOAD_ERROR_CODES.has(errorCode)) { + this.#scheduleRetry(); + } else { + this.#retryUsed = true; + } + } + + #scheduleRetry() { + if (!this.#desiredVisible || this.#retryTimer !== null || this.#retryUsed) { + return; + } + + this.#retryUsed = true; + const banner = this.#banner; + this.#retryTimer = setTimeout(() => { + this.#retryTimer = null; + if (!this.#desiredVisible || banner !== this.#banner) return; + this.#queueNativeVisibility(true, true); + }, DEFAULT_RETRY_DELAY_MS); + } + + #resetRetry() { + if (this.#retryTimer !== null) { + clearTimeout(this.#retryTimer); + this.#retryTimer = null; + } + this.#retryUsed = false; + } } function getActivePage() { diff --git a/src/lib/console.js b/src/lib/console.js index 3e10948585..35a32cb2b9 100644 --- a/src/lib/console.js +++ b/src/lib/console.js @@ -1,24 +1,112 @@ import "core-js/stable"; import "html-tag-js/dist/polyfill"; import { parse } from "acorn"; +import { VariableVirtualList } from "components/virtualList"; import css from "styles/console.m.scss"; import loadPolyFill from "utils/polyfill"; +import ConsoleExecutor, { + applyConsoleViewport, + executeConsoleCommand, + executeConsoleScript, + resolveConsoleExecutionContext, +} from "./consoleRuntime"; (function () { loadPolyFill.apply(window); let consoleVisible = false; + let isFocused = false; + let isExecuting = false; + let viewportFrame = null; + let viewportObserver = null; + let themeSyncTimer = null; + let themeSyncPending = false; + let themeSignature = null; + const isStandaloneConsole = sessionStorage.getItem("__mode") === "console"; + const themeEndpoint = document.querySelector( + 'meta[name="acode-console-theme-endpoint"]', + )?.content; + const startupScriptUrl = document.querySelector( + 'meta[name="acode-console-executing-script"]', + )?.content; const originalConsole = console; const $input = tag("textarea", { id: "__c-input", + attr: { + rows: "1", + placeholder: "Run JavaScript…", + "aria-label": "JavaScript console input", + spellcheck: "false", + autocomplete: "off", + autocapitalize: "off", + }, + oninput: resizeInput, + onfocus() { + isFocused = true; + virtualMessages.scrollToBottom(); + }, onblur() { setTimeout(() => { isFocused = false; }, 0); }, }); + const $stopExecution = tag("button", { + className: "__c-action __c-action-danger", + textContent: "Stop", + attr: { + type: "button", + "aria-label": "Stop JavaScript execution", + }, + onclick() { + executor.cancel(); + }, + }); + $stopExecution.hidden = true; + const $executionContext = tag("select", { + className: "__c-context", + attr: { + "aria-label": "JavaScript execution context", + title: "Choose isolated Worker execution or live page access", + }, + children: [ + tag("option", { + textContent: "Worker", + attr: { value: "worker" }, + }), + tag("option", { + textContent: "Page (unsafe)", + attr: { value: "page" }, + }), + ], + onchange() { + if (this.value !== "page") return; + log( + "warn", + {}, + "Page mode can access window and document, but it runs on the preview thread and cannot stop infinite code.", + ); + }, + }); + const $output = tag("c-output", { + attr: { + role: "region", + "aria-label": "JavaScript console", + }, + }); const $inputContainer = tag("c-input", { - child: $input, + children: [ + $input, + tag("c-input-actions", { + children: [ + ...(isStandaloneConsole ? [] : [$executionContext]), + $stopExecution, + ], + }), + ], + }); + const virtualMessages = new VariableVirtualList($output, { + footer: $inputContainer, }); const $toggler = tag("c-toggler", { style: { @@ -46,9 +134,13 @@ import loadPolyFill from "utils/polyfill"; }, }); const $console = tag("c-console", { - child: $inputContainer, + child: $output, + attr: { + role: "dialog", + "aria-label": "JavaScript console", + }, onclick(e) { - const el = e.target; + const el = e.target.closest?.("[action]") || e.target; const action = el.getAttribute("action"); switch (action) { @@ -64,9 +156,26 @@ import loadPolyFill from "utils/polyfill"; } }, }); + if (isStandaloneConsole) { + $console.setAttribute("standalone", ""); + document.documentElement.setAttribute("console-only", ""); + startThemeSync(); + window.addEventListener("pagehide", stopThemeSync, { + once: true, + }); + } const counter = {}; const timers = {}; - let isFocused = false; + const executor = new ConsoleExecutor({ + workerUrl: window.__consoleWorkerScript || "build/consoleWorker.js", + onConsole(message) { + if (message.action === "clear") { + window.console.clear(); + return; + } + log(message.level, {}, ...message.args); + }, + }); if (!window.__objs) window.__objs = {}; @@ -77,18 +186,76 @@ import loadPolyFill from "utils/polyfill"; window.addEventListener("error", onError); assignCustomConsole(); - if (sessionStorage.getItem("__mode") === "console") { + if (isStandaloneConsole) { showConsole(); + void runStartupScript(); return; } tag.get("html").append($toggler); - $console.setAttribute("title", "Console"); sessionStorage.setItem("__console_available", true); document.addEventListener("showconsole", showConsole); document.addEventListener("hideconsole", hideConsole); } + function startThemeSync() { + if (!themeEndpoint || themeSyncTimer !== null) return; + void syncTheme(); + themeSyncTimer = setInterval(syncTheme, 1000); + } + + function stopThemeSync() { + if (themeSyncTimer === null) return; + clearInterval(themeSyncTimer); + themeSyncTimer = null; + } + + async function runStartupScript() { + if (!startupScriptUrl) return; + + setExecutionState(true); + const result = await executeConsoleScript({ + scriptUrl: startupScriptUrl, + workerExecutor: executor, + }); + setExecutionState(false); + + if (result?.type === "error") { + log("error", getStack(new Error()), result.value); + } + } + + async function syncTheme() { + if (themeSyncPending) return; + themeSyncPending = true; + + try { + const response = await fetch(themeEndpoint, { cache: "no-store" }); + if (!response.ok) return; + const snapshot = await response.json(); + if (typeof snapshot.css !== "string") return; + + const signature = JSON.stringify([snapshot.type, snapshot.css]); + if (signature === themeSignature) return; + + let $theme = document.getElementById("console-live-theme"); + if (!$theme) { + $theme = tag("style", { id: "console-live-theme" }); + document.head.append($theme); + } + $theme.textContent = snapshot.css; + document.documentElement.setAttribute( + "theme-type", + snapshot.type === "light" ? "light" : "dark", + ); + themeSignature = signature; + } catch { + // Keep the last valid theme if the local endpoint is briefly unavailable. + } finally { + themeSyncPending = false; + } + } + function touchmove(e) { e.preventDefault(); $toggler.style.transform = "translate(" @@ -105,10 +272,7 @@ import loadPolyFill from "utils/polyfill"; } }, clear() { - originalConsole.clear(); - if (isFocused) $input.focus(); - $console.textContent = ""; - $console.appendChild($inputContainer); + clearConsole(); }, count(hash = "default") { originalConsole.count(hash); @@ -207,35 +371,104 @@ import loadPolyFill from "utils/polyfill"; function showConsole() { tag.get("html").append($console); $input.addEventListener("keydown", onCodeInput); + if (!isStandaloneConsole) { + bindViewportListeners(); + updateConsoleViewport(); + } + virtualMessages.invalidate(); } function hideConsole() { $console.remove(); $input.removeEventListener("keydown", onCodeInput); + unbindViewportListeners(); + } + + function bindViewportListeners() { + window.addEventListener("resize", updateConsoleViewport); + window.visualViewport?.addEventListener("resize", updateConsoleViewport); + window.visualViewport?.addEventListener("scroll", updateConsoleViewport); + if (typeof ResizeObserver === "function") { + viewportObserver = new ResizeObserver(updateConsoleViewport); + viewportObserver.observe(document.documentElement); + } + } + + function unbindViewportListeners() { + window.removeEventListener("resize", updateConsoleViewport); + window.visualViewport?.removeEventListener("resize", updateConsoleViewport); + window.visualViewport?.removeEventListener("scroll", updateConsoleViewport); + viewportObserver?.disconnect(); + viewportObserver = null; + if (viewportFrame !== null) cancelAnimationFrame(viewportFrame); + viewportFrame = null; + } + + function updateConsoleViewport() { + if (viewportFrame !== null) cancelAnimationFrame(viewportFrame); + viewportFrame = requestAnimationFrame(() => { + viewportFrame = null; + applyConsoleViewport($console); + virtualMessages.invalidate(); + }); } function onCodeInput(e) { - const key = e.key; isFocused = true; - if (key === "Enter") { - const regex = /[\[|{\(\)\}\]]/g; - let code = this.value.trim(); - let isOdd = (code.length - code.replace(regex, "").length) % 2; - - if (!code || isOdd) return; - e.preventDefault(); - e.stopPropagation(); - e.stopImmediatePropagation(); - - log("code", {}, code); - $input.value = ""; - const res = execute(code); - if (res.type === "error") { - log("error", getStack(new Error()), res.value); - } else { - log("log", getStack(new Error()), res.value); - } + if (e.key !== "Enter" || e.shiftKey) return; + + const code = $input.value.trim(); + const brackets = /[\[|{\(\)\}\]]/g; + const isIncomplete = + (code.length - code.replace(brackets, "").length) % 2 !== 0; + if (!code || isIncomplete) return; + + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + runInputCode(); + } + + async function runInputCode() { + const code = $input.value.trim(); + if (!code) return; + if (isExecuting) { + log("warn", {}, "Another console command is still running."); + return; } + + log("code", {}, code); + $input.value = ""; + resizeInput(); + setExecutionState(true); + const res = await executeCommand(code); + setExecutionState(false); + + if (res.type === "error") { + log("error", getStack(new Error()), res.value); + } else { + log("log", getStack(new Error()), res.value); + } + $input.focus(); + } + + function setExecutionState(running) { + isExecuting = running; + $console.toggleAttribute("running", running); + $stopExecution.hidden = !running || $executionContext.value !== "worker"; + $input.disabled = running; + $executionContext.disabled = running; + } + + function resizeInput() { + $input.style.height = "0px"; + $input.style.height = `${Math.min(120, Math.max(38, $input.scrollHeight))}px`; + } + + function clearConsole() { + originalConsole.clear(); + virtualMessages.clear(); + if (isFocused) $input.focus(); } function getBody(obj, ...keys) { @@ -454,7 +687,7 @@ import loadPolyFill from "utils/polyfill"; let $msg; if (mode === "code") { $msg = tag("c-code"); - $msg.textContent = arg.length > 50 ? arg.substring(0, 50) + "..." : arg; + $msg.textContent = arg; $msg.setAttribute("data-code", arg); $msg.setAttribute("action", "use code"); } else { @@ -486,11 +719,7 @@ import loadPolyFill from "utils/polyfill"; $messages.appendChild($stack); } - $console.insertBefore($messages, $inputContainer); - - while ($console.childElementCount > 100) { - $console.firstElementChild.remove(); - } + virtualMessages.append($messages); } /** @@ -634,6 +863,18 @@ import loadPolyFill from "utils/polyfill"; }; } + function executeCommand(code) { + return executeConsoleCommand({ + context: resolveConsoleExecutionContext( + isStandaloneConsole, + $executionContext.value, + ), + code, + workerExecutor: executor, + pageExecutor: execute, + }); + } + function execute(code) { let res = null; try { diff --git a/src/lib/consoleRuntime.js b/src/lib/consoleRuntime.js new file mode 100644 index 0000000000..5e45e25236 --- /dev/null +++ b/src/lib/consoleRuntime.js @@ -0,0 +1,217 @@ +export const DEFAULT_CONSOLE_TIMEOUT = 30000; + +/** + * Runs console commands in a worker so user code can never block the page UI. + */ +export default class ConsoleExecutor { + constructor({ + workerUrl, + timeout = DEFAULT_CONSOLE_TIMEOUT, + onConsole = () => {}, + WorkerClass = globalThis.Worker, + } = {}) { + this.workerUrl = workerUrl; + this.timeout = timeout; + this.onConsole = onConsole; + this.WorkerClass = WorkerClass; + this.worker = null; + this.pending = null; + this.nextId = 0; + } + + execute(code) { + if (this.pending) { + return Promise.resolve({ + type: "error", + value: new Error("Another console command is still running."), + }); + } + + if (!this.WorkerClass) { + return Promise.resolve({ + type: "error", + value: new Error( + "This WebView does not support isolated console execution.", + ), + }); + } + + let worker; + try { + worker = this.getWorker(); + } catch (error) { + return Promise.resolve({ type: "error", value: error }); + } + const id = ++this.nextId; + + return new Promise((resolve) => { + const timer = setTimeout(() => { + this.finish(id, { + type: "error", + value: new Error( + `Execution stopped after ${this.timeout / 1000} seconds.`, + ), + }); + this.resetWorker(); + }, this.timeout); + + this.pending = { id, resolve, timer }; + try { + worker.postMessage({ id, code }); + } catch (error) { + this.finish(id, { type: "error", value: error }); + this.resetWorker(); + } + }); + } + + getWorker() { + if (this.worker) return this.worker; + + const worker = new this.WorkerClass(this.workerUrl); + worker.onmessage = ({ data }) => this.handleMessage(data); + worker.onerror = (event) => { + const error = new Error(event.message || "Console worker failed."); + this.finish(this.pending?.id, { type: "error", value: error }); + this.resetWorker(); + }; + this.worker = worker; + return worker; + } + + handleMessage(message) { + if (message.type === "console") { + this.onConsole(message); + return; + } + + if (message.type === "result") { + this.finish(message.id, { type: "result", value: message.value }); + return; + } + + if (message.type === "error") { + const error = new Error( + message.error?.message || "Console command failed.", + ); + error.name = message.error?.name || "Error"; + if (message.error?.stack) error.stack = message.error.stack; + this.finish(message.id, { type: "error", value: error }); + } + } + + finish(id, result) { + if (!this.pending || this.pending.id !== id) return; + + const { resolve, timer } = this.pending; + this.pending = null; + clearTimeout(timer); + resolve(result); + } + + resetWorker() { + this.worker?.terminate(); + this.worker = null; + } + + cancel() { + if (!this.pending) return false; + + this.finish(this.pending.id, { + type: "error", + value: new Error("Execution stopped."), + }); + this.resetWorker(); + return true; + } + + destroy() { + if (this.pending) { + this.finish(this.pending.id, { + type: "error", + value: new Error("Console execution was cancelled."), + }); + } + this.resetWorker(); + } +} + +/** + * Returns the actually visible browser rectangle. On mobile this shrinks with + * the software keyboard even when the layout viewport remains full height. + */ +export function getConsoleViewportRect(windowObject = window) { + const viewport = windowObject.visualViewport; + const documentHeight = windowObject.document?.documentElement?.clientHeight; + const visibleHeights = [ + viewport?.height, + windowObject.innerHeight, + documentHeight, + ].filter((height) => Number.isFinite(height) && height > 0); + return { + height: Math.round(Math.min(...visibleHeights)), + width: Math.round(viewport?.width || windowObject.innerWidth), + top: Math.round(viewport?.offsetTop || 0), + left: Math.round(viewport?.offsetLeft || 0), + }; +} + +export function applyConsoleViewport(element, windowObject = window) { + const { height, width, top, left } = getConsoleViewportRect(windowObject); + element.style.setProperty("--console-viewport-height", `${height}px`); + element.style.setProperty("--console-viewport-width", `${width}px`); + element.style.setProperty("--console-viewport-top", `${top}px`); + element.style.setProperty("--console-viewport-left", `${left}px`); +} + +export function resolveConsoleExecutionContext( + isStandaloneConsole, + selectedContext, +) { + return isStandaloneConsole ? "worker" : selectedContext; +} + +/** + * Routes a console command to the isolated worker or the live preview page. + * Page execution is deliberately opt-in because it runs on the preview thread. + */ +export function executeConsoleCommand({ + context, + code, + workerExecutor, + pageExecutor, +}) { + if (context === "page") return Promise.resolve(pageExecutor(code)); + return workerExecutor.execute(code); +} + +/** + * Loads a standalone JavaScript file and executes it in the isolated console + * worker. The file is fetched first so it is never inserted as a page script. + */ +export async function executeConsoleScript({ + scriptUrl, + workerExecutor, + fetchScript = globalThis.fetch, +}) { + if (!scriptUrl) return null; + + try { + if (typeof fetchScript !== "function") { + throw new Error("This WebView cannot load the JavaScript file."); + } + + const response = await fetchScript(scriptUrl, { cache: "no-store" }); + if (!response.ok) { + const status = response.status ? ` (${response.status})` : ""; + throw new Error(`Failed to load JavaScript file${status}.`); + } + + return workerExecutor.execute(await response.text()); + } catch (error) { + return { + type: "error", + value: error instanceof Error ? error : new Error(String(error)), + }; + } +} diff --git a/src/lib/consoleWorker.js b/src/lib/consoleWorker.js new file mode 100644 index 0000000000..c5d911fe8c --- /dev/null +++ b/src/lib/consoleWorker.js @@ -0,0 +1,168 @@ +const MAX_MESSAGES_PER_SECOND = 100; +const MESSAGE_WINDOW_MS = 1000; +const MAX_PROPERTIES = 100; +const MAX_DEPTH = 4; +const MAX_SNAPSHOT_VALUES = 500; + +let activeCommandId = 0; +let messageWindowStartedAt = 0; +let emittedInWindow = 0; +let suppressedInWindow = 0; +const counts = new Map(); +const timers = new Map(); + +function snapshot( + value, + depth = 0, + seen = new WeakSet(), + budget = { remaining: MAX_SNAPSHOT_VALUES }, +) { + const type = typeof value; + + if ( + value === null || + ["boolean", "number", "string", "undefined"].includes(type) + ) { + return value; + } + if (type === "bigint") return `${value}n`; + if (type === "symbol") return value.toString(); + if (type === "function") + return `[Function${value.name ? `: ${value.name}` : ""}]`; + if (budget.remaining-- <= 0) return "[Truncated]"; + if (value instanceof Error) return snapshotError(value); + if (value instanceof Date) return value.toISOString(); + if (value instanceof RegExp) return value.toString(); + if (value instanceof Promise) return "Promise { }"; + if (depth >= MAX_DEPTH) return `[${value.constructor?.name || "Object"}]`; + if (seen.has(value)) return "[Circular]"; + + seen.add(value); + if (Array.isArray(value)) { + const result = value + .slice(0, MAX_PROPERTIES) + .map((item) => snapshot(item, depth + 1, seen, budget)); + if (value.length > MAX_PROPERTIES) result.push("…"); + return result; + } + + const result = {}; + let keys; + try { + keys = Reflect.ownKeys(value).slice(0, MAX_PROPERTIES); + } catch (error) { + return `[Uninspectable: ${error.message}]`; + } + + for (const key of keys) { + const outputKey = typeof key === "symbol" ? key.toString() : key; + try { + result[outputKey] = snapshot(value[key], depth + 1, seen, budget); + } catch (error) { + result[outputKey] = `[Thrown: ${error.message}]`; + } + } + if (Reflect.ownKeys(value).length > MAX_PROPERTIES) result["…"] = "…"; + return result; +} + +function snapshotError(error) { + return { + name: error?.name || "Error", + message: error?.message || String(error), + stack: error?.stack || "", + }; +} + +function discardSuppressedMessages() { + suppressedInWindow = 0; +} + +function emitMessage(message) { + const now = performance.now(); + if (now - messageWindowStartedAt >= MESSAGE_WINDOW_MS) { + discardSuppressedMessages(); + messageWindowStartedAt = now; + emittedInWindow = 0; + } + + if (emittedInWindow >= MAX_MESSAGES_PER_SECOND) { + suppressedInWindow++; + return; + } + + emittedInWindow++; + self.postMessage({ type: "console", id: activeCommandId, ...message }); +} + +function emit(level, args) { + emitMessage({ + level, + args: args.map((value) => snapshot(value)), + }); +} + +self.console = { + assert(condition, ...args) { + if (!condition) emit("error", args.length ? args : ["Assertion failed"]); + }, + clear() { + emitMessage({ action: "clear" }); + }, + count(label = "default") { + const value = (counts.get(label) || 0) + 1; + counts.set(label, value); + emit("log", [`${label}: ${value}`]); + }, + countReset(label = "default") { + counts.delete(label); + }, + debug: (...args) => emit("log", args), + dir: (...args) => emit("log", args), + dirxml: (...args) => emit("log", args), + error: (...args) => emit("error", args), + group: (...args) => emit("log", args), + groupCollapsed: (...args) => emit("log", args), + groupEnd() {}, + info: (...args) => emit("info", args), + log: (...args) => emit("log", args), + table: (...args) => emit("table", args), + time(label = "default") { + timers.set(label, performance.now()); + }, + timeEnd(label = "default") { + if (!timers.has(label)) return emit("warn", [`No such label: ${label}`]); + emit("log", [ + `${label}: ${(performance.now() - timers.get(label)).toFixed(2)}ms`, + ]); + timers.delete(label); + }, + timeLog(label = "default") { + if (!timers.has(label)) return emit("warn", [`No such label: ${label}`]); + emit("log", [ + `${label}: ${(performance.now() - timers.get(label)).toFixed(2)}ms`, + ]); + }, + trace(...args) { + emit("trace", [...args, new Error().stack]); + }, + warn: (...args) => emit("warn", args), +}; + +self.onmessage = ({ data: { id, code } }) => { + activeCommandId = id; + messageWindowStartedAt = performance.now(); + emittedInWindow = 0; + suppressedInWindow = 0; + + try { + // Intentional: this local REPL runs the command in its isolated worker. + // codeql[js/code-injection] + const value = (0, eval)(code); + discardSuppressedMessages(); + self.postMessage({ type: "result", id, value: snapshot(value) }); + } catch (error) { + discardSuppressedMessages(); + self.postMessage({ type: "error", id, error: snapshotError(error) }); + } +}; diff --git a/src/lib/editorFile.js b/src/lib/editorFile.js index 2aee9b500f..e638cdb84b 100644 --- a/src/lib/editorFile.js +++ b/src/lib/editorFile.js @@ -1,17 +1,11 @@ import fsOperation from "fileSystem"; // CodeMirror imports for document state management -import { EditorState } from "@codemirror/state"; +import { EditorSelection, EditorState } from "@codemirror/state"; import { focusEditorIfEditable, reconfigureEditorReadOnly, } from "cm/editorReadOnly"; -import { - clearSelection, - getDocText, - restoreFolds, - restoreSelection, - setScrollPosition, -} from "cm/editorUtils"; +import { clearSelection, getDocText } from "cm/editorUtils"; import { getMode, getModeForPath } from "cm/modelist"; import quickTools from "components/quickTools"; import Sidebar from "components/sidebar"; @@ -37,6 +31,25 @@ import appSettings from "./settings"; let mainCSSStyleSheet = null; +function restoreSessionSelection(state, selection) { + if (!selection?.ranges?.length) return state; + + const docLength = state.doc.length; + const ranges = selection.ranges.map((range) => { + const from = Math.max(0, Math.min(docLength, range.from | 0)); + const to = Math.max(0, Math.min(docLength, range.to | 0)); + return EditorSelection.range(from, to); + }); + const mainIndex = + selection.mainIndex >= 0 && selection.mainIndex < ranges.length + ? selection.mainIndex + : 0; + + return state.update({ + selection: EditorSelection.create(ranges, mainIndex), + }).state; +} + function getMainCSSStyleSheet() { if (mainCSSStyleSheet) return mainCSSStyleSheet; for (const sheet of document.styleSheets) { @@ -330,6 +343,7 @@ function maybeRecommendLanguageModeExtension(file, modeInfo) { * @property {string} [paneId] target editor pane id * @property {object} [pane] target editor pane * @property {boolean} [isPanePlaceholder] temporary empty tab for an empty pane + * @property {boolean} [persistInSession] restore the tab in a future app session * @property {boolean} [highlightStyles] adopt static CodeMirror highlight CSS into the custom tab shadow root */ @@ -445,6 +459,7 @@ export default class EditorFile { * contains information about cursor position, scroll left, scroll top, folds. */ #loadOptions; + #loadPromise = null; /** * Weather file is changed and needs to be saved * @type {boolean} @@ -500,6 +515,11 @@ export default class EditorFile { diskMtime = null; hasDiskConflict = false; isPanePlaceholder = false; + persistInSession = true; + lastScrollTop = 0; + lastScrollLeft = 0; + restoredSelection = null; + restoredFolds = null; /** * @@ -513,6 +533,7 @@ export default class EditorFile { this.hideQuickTools = options?.hideQuickTools || false; this.paneId = options?.paneId || options?.pane?.id || null; this.isPanePlaceholder = !!options?.isPanePlaceholder; + this.persistInSession = options?.persistInSession !== false; // if options are passed if (options) { @@ -699,6 +720,14 @@ export default class EditorFile { folds: options?.folds, editable, }; + this.lastScrollTop = Number.isFinite(options?.scrollTop) + ? options.scrollTop + : 0; + this.lastScrollLeft = Number.isFinite(options?.scrollLeft) + ? options.scrollLeft + : 0; + this.restoredSelection = options?.cursorPos || null; + this.restoredFolds = options?.folds || null; } this.#onFilePosChange = () => { @@ -1554,8 +1583,8 @@ export default class EditorFile { this.#tab.classList.add("active"); this.#tab.scrollIntoView(); - if (this.type === "editor" && !this.loaded && !this.loading) { - this.#loadText(); + if (this.type === "editor" && !this.loaded) { + void this.load(); } syncQuickToolsVisibility(this); @@ -1637,6 +1666,20 @@ export default class EditorFile { } } + /** + * Load this file's document into its stored editor session. + * Reuses an in-flight load so session restoration can safely preload tabs. + */ + load() { + if (this.type !== "editor" || this.loaded) return Promise.resolve(this); + if (this.#loadPromise) return this.#loadPromise; + + this.#loadPromise = this.#loadText().finally(() => { + this.#loadPromise = null; + }); + return this.#loadPromise; + } + /** * Add event listener * @param {string} event @@ -1778,9 +1821,7 @@ export default class EditorFile { const protocol = this.uri ? Url.getProtocol(this.uri) : ""; const isRemoteFile = protocol === "ftp:" || protocol === "sftp:"; - const { cursorPos, scrollLeft, scrollTop, folds, editable } = - this.#loadOptions; - const { editor } = editorManager; + const { cursorPos, editable } = this.#loadOptions; this.#loadOptions = null; @@ -1852,7 +1893,11 @@ export default class EditorFile { const isUnsaved = this.isUnsaved; this.markChanged = false; - this.session = EditorState.create({ doc: value }); + this.session = restoreSessionSelection( + EditorState.create({ doc: value }), + cursorPos, + ); + this.restoredSelection = null; this.__cmSessionReady = false; this.__cmLanguageReady = false; this.__cmLanguageSignature = null; @@ -1871,13 +1916,6 @@ export default class EditorFile { setTimeout(() => { this.#emit("load", createFileEvent(this)); - if (cursorPos) { - restoreSelection(editor, cursorPos); - } - if (scrollTop || scrollLeft) { - setScrollPosition(editor, scrollTop, scrollLeft); - } - restoreFolds(editor, folds); }, 0); } catch (error) { this.#emit("loaderror", createFileEvent(this)); diff --git a/src/lib/editorManager.js b/src/lib/editorManager.js index d719add426..3ce9068465 100644 --- a/src/lib/editorManager.js +++ b/src/lib/editorManager.js @@ -1850,13 +1850,7 @@ async function EditorManager($header, $body) { const col = Math.max(0, Math.min(targetColumn, docLine.length)); const pos = docLine.from + col; - // Move cursor and scroll into view - editor.dispatch({ - selection: { anchor: pos, head: pos }, - effects: EditorView.scrollIntoView(pos, { y: "center" }), - }); - focusEditorIfEditable(editor); - return true; + return revealEditorRange(editor, pos); } catch (error) { console.error("Error in gotoLine:", error); return false; @@ -2181,12 +2175,7 @@ async function EditorManager($header, $body) { const col = Math.max(0, Math.min(targetColumn, docLine.length)); const pos = docLine.from + col; - targetEditor.dispatch({ - selection: { anchor: pos, head: pos }, - effects: EditorView.scrollIntoView(pos, { y: "center" }), - }); - focusEditorIfEditable(targetEditor); - return true; + return revealEditorRange(targetEditor, pos); } catch (error) { console.error("Error in gotoLine:", error); return false; @@ -3018,9 +3007,19 @@ async function EditorManager($header, $body) { // Restore folds from previous state if available try { const folds = prevState ? getAllFolds(prevState) : []; + const canConsumeRestoredFolds = file.loaded && !file.loading; + if ( + !folds.length && + canConsumeRestoredFolds && + file.restoredFolds?.length + ) { + folds.push(...file.restoredFolds); + } if (folds && folds.length) { restoreFolds(editor, folds); + file.session = editor.state; } + if (canConsumeRestoredFolds) file.restoredFolds = null; } catch (error) { warnRecoverable( "Failed to restore folded regions from previous session state.", @@ -3182,6 +3181,9 @@ async function EditorManager($header, $body) { hasUnsavedFiles, getEditorHeight, getEditorWidth, + revealRange(from, to = from, options) { + return revealEditorRange(manager.editor, from, to, options); + }, header: $header, openPreviousEditorFromHistory, openNextEditorFromHistory, @@ -3442,6 +3444,45 @@ async function EditorManager($header, $body) { applyFileToEditor(file, { forceRecreate: true }); } + /** + * Reveal an editor range after a file switch. + * + * File activation restores the tab's saved viewport over two animation + * frames and a short timeout. Explicit navigation must cancel that work or + * it can overwrite CodeMirror's scrollIntoView effect while leaving the new + * selection in place. + */ + function revealEditorRange( + targetEditor, + from, + to = from, + { y = "center", userEvent = "select.reveal" } = {}, + ) { + if (!targetEditor) return false; + + try { + const length = targetEditor.state.doc.length; + const anchor = Math.max(0, Math.min(Number(from) || 0, length)); + const head = Math.max(0, Math.min(Number(to) || 0, length)); + + if (targetEditor === editor) { + cancelPendingScrollRestore(); + clearScrollbarScrollLock(); + } + + targetEditor.dispatch({ + selection: { anchor, head }, + effects: EditorView.scrollIntoView(anchor, { y }), + userEvent, + }); + focusEditorIfEditable(targetEditor); + return true; + } catch (error) { + console.error("Error revealing editor range:", error); + return false; + } + } + appSettings.on("update:tabSize", function () { updateEditorIndentationSettings(); }); diff --git a/src/lib/fileSessionPersistence.js b/src/lib/fileSessionPersistence.js new file mode 100644 index 0000000000..e14c639402 --- /dev/null +++ b/src/lib/fileSessionPersistence.js @@ -0,0 +1,13 @@ +/** + * Promote an open file to durable session persistence when a later open source + * proves that its URI will remain accessible. Less durable sources, such as + * external intents, must not revoke an existing durable grant. + * + * @param {{persistInSession?: boolean}} file + * @param {boolean | undefined} requestedPersistence + */ +export function promoteSessionPersistence(file, requestedPersistence) { + if (requestedPersistence === true) { + file.persistInSession = true; + } +} diff --git a/src/lib/keyBindings.js b/src/lib/keyBindings.js index b252139621..db48a80185 100644 --- a/src/lib/keyBindings.js +++ b/src/lib/keyBindings.js @@ -714,6 +714,12 @@ const APP_BINDING_CONFIG = [ readOnly: true, editorOnly: true, }, + { + name: "acode:showWelcome", + description: "Show Welcome", + key: "Ctrl-Shift-W", + action: "welcome", + }, ]; const APP_KEY_BINDINGS = buildAppBindings(APP_BINDING_CONFIG); diff --git a/src/lib/lang.js b/src/lib/lang.js index b8a2966ab5..b4477e9629 100644 --- a/src/lib/lang.js +++ b/src/lib/lang.js @@ -185,7 +185,41 @@ const langMap = { return await import("../lang/he-il.json"); }, }, + "ln-ln": { + name: "Lingála", + async strings() { + return await import("../lang/ln-ln.json"); + }, + }, +}; + +const intlLocaleOverrides = { + "ir-fa": "fa-IR", + "mm-unicode": "my-MM", + "mm-zawgyi": "my-MM", + "pu-in": "pa-IN", }; +const rtlLanguages = new Set(["ar", "fa", "he"]); + +export function getIntlLocale(code) { + const normalizedCode = code?.toLowerCase(); + const locale = + intlLocaleOverrides[normalizedCode] || + (normalizedCode in langMap + ? normalizedCode + : globalThis.navigator?.language || "en-US"); + + try { + return Intl.getCanonicalLocales(locale)[0]; + } catch { + return "en-US"; + } +} + +export function getLocaleDirection(locale) { + const language = locale?.split("-")[0]?.toLowerCase(); + return rtlLanguages.has(language) ? "rtl" : "ltr"; +} export default { async set(code) { diff --git a/src/lib/loadPlugin.js b/src/lib/loadPlugin.js index 75656082bf..2272163ec8 100644 --- a/src/lib/loadPlugin.js +++ b/src/lib/loadPlugin.js @@ -3,8 +3,16 @@ import Page from "components/page"; import helpers from "utils/helpers"; import Url from "utils/Url"; import actionStack from "./actionStack"; +import generatePluginContext, { connect } from "./pluginContext"; export default async function loadPlugin(pluginId, justInstalled = false) { + // Establish the trusted native session BEFORE any plugin script is appended + // and run. Plugin main.js runs as soon as its - - - + + + - - - \ No newline at end of file + + + diff --git a/tests/admob/adConsentCoordinator.test.js b/tests/admob/adConsentCoordinator.test.js index cb4fe07c70..ecd5a2f7fc 100644 --- a/tests/admob/adConsentCoordinator.test.js +++ b/tests/admob/adConsentCoordinator.test.js @@ -9,6 +9,7 @@ function createHarness({ gatherState, previousState = EMPTY_PRIVACY_STATE, gatherError, + showOptions, }) { let gatherCalls = 0; let getStateCalls = 0; @@ -25,6 +26,7 @@ function createHarness({ return previousState; }, async showOptions() { + if (showOptions) return showOptions(); return gatherState; }, }; @@ -141,12 +143,12 @@ test("deduplicates consent collection and ad initialization", async () => { assert.equal(harness.initializeCalls, 1); }); -test("updates privacy-option visibility and keeps ads single-started", async () => { +test("hides a stale privacy-option entry and keeps ads single-started", async () => { const harness = createHarness({ gatherState: { - consentStatus: "notRequired", + consentStatus: "obtained", canRequestAds: true, - privacyOptionsRequired: false, + privacyOptionsRequired: true, }, }); const states = []; @@ -154,15 +156,15 @@ test("updates privacy-option visibility and keeps ads single-started", async () await harness.coordinator.start(); harness.privacy.showOptions = async () => ({ - consentStatus: "obtained", + consentStatus: "notRequired", canRequestAds: true, - privacyOptionsRequired: true, + privacyOptionsRequired: false, }); await harness.coordinator.showPrivacyOptions(); unsubscribe(); assert.equal(harness.initializeCalls, 1); - assert.equal(states.at(-1).privacyOptionsRequired, true); + assert.equal(states.at(-1).privacyOptionsRequired, false); }); test("normalizes an invalid native state instead of starting ads", async () => { @@ -177,3 +179,62 @@ test("normalizes an invalid native state instead of starting ads", async () => { assert.deepEqual(await harness.coordinator.start(), EMPTY_PRIVACY_STATE); assert.equal(harness.initializeCalls, 0); }); + +test("deduplicates concurrent privacy-option requests", async () => { + let resolveOptions; + let showOptionsCalls = 0; + const optionsResult = new Promise((resolve) => { + resolveOptions = resolve; + }); + const harness = createHarness({ + gatherState: { + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: true, + }, + showOptions() { + showOptionsCalls++; + return optionsResult; + }, + }); + await harness.coordinator.start(); + + const firstRequest = harness.coordinator.showPrivacyOptions(); + const secondRequest = harness.coordinator.showPrivacyOptions(); + assert.equal(firstRequest, secondRequest); + resolveOptions({ + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: false, + }); + + assert.deepEqual(await firstRequest, { + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: false, + }); + assert.equal(showOptionsCalls, 1); +}); + +test("preserves consent state when privacy options reject", async () => { + const gatherState = { + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: true, + }; + const optionsError = new Error("native failure"); + const harness = createHarness({ + gatherState, + showOptions: async () => { + throw optionsError; + }, + }); + await harness.coordinator.start(); + + await assert.rejects( + harness.coordinator.showPrivacyOptions(), + (error) => error === optionsError, + ); + assert.deepEqual(harness.coordinator.state, gatherState); + assert.equal(harness.initializeCalls, 1); +}); diff --git a/tests/admob/bannerVisibilityController.test.js b/tests/admob/bannerVisibilityController.test.js index cb9d52c347..1ad63d396c 100644 --- a/tests/admob/bannerVisibilityController.test.js +++ b/tests/admob/bannerVisibilityController.test.js @@ -1,21 +1,34 @@ import assert from "node:assert/strict"; -import { test } from "vitest"; +import { afterEach, test, vi } from "vitest"; import { BANNER_SUPPRESSION_REASON, BannerVisibilityController, } from "../../src/lib/bannerVisibilityController.mjs"; -function createHarness() { +function createHarness({ show, hide } = {}) { let activePage = null; let notifyPageChange = () => {}; const calls = []; + const errors = []; + const listeners = new Map(); const banner = { active: false, async show() { calls.push("show"); + return show?.(); }, async hide() { calls.push("hide"); + return hide?.(); + }, + on(eventName, listener) { + let eventListeners = listeners.get(eventName); + if (!eventListeners) { + eventListeners = new Set(); + listeners.set(eventName, eventListeners); + } + eventListeners.add(listener); + return () => eventListeners.delete(listener); }, }; const controller = new BannerVisibilityController({ @@ -27,7 +40,7 @@ function createHarness() { }; }, onError(error) { - throw error; + errors.push(error); }, }); controller.setBanner(banner); @@ -36,6 +49,10 @@ function createHarness() { banner, calls, controller, + emit(eventName, event = {}) { + for (const listener of listeners.get(eventName) ?? []) listener(event); + }, + errors, changePage(page) { activePage = page; notifyPageChange(); @@ -46,6 +63,19 @@ function createHarness() { }; } +async function createEligibleHarness(options) { + const harness = createHarness(options); + const page = {}; + harness.setActivePage(page); + harness.controller.registerPage(page); + await harness.controller.whenIdle(); + return { harness, page }; +} + +afterEach(() => { + vi.useRealTimers(); +}); + test("shows only for a registered active page and ignores repeated syncs", async () => { const harness = createHarness(); const page = {}; @@ -234,3 +264,169 @@ test("serializes an in-flight show before the latest hide request", async () => assert.equal(banner.active, false); assert.deepEqual(calls, ["show", "hide"]); }); + +test("retries one transient failure after 500ms and caps requests at two", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 3 }); + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(499); + assert.deepEqual(harness.calls, ["show"]); + await vi.advanceTimersByTimeAsync(1); + await harness.controller.whenIdle(); + + harness.emit("loadfail", { code: 3 }); + harness.controller.reconcile(); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show"]); + assert.equal(harness.errors.length, 3); +}); + +test("successful load restores the retry allowance", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + harness.emit("load"); + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show", "show"]); +}); + +test("cancels a retry on navigation and restores it when the page returns", async () => { + vi.useFakeTimers(); + const { harness, page } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 3 }); + harness.changePage({}); + await harness.controller.whenIdle(); + await vi.advanceTimersByTimeAsync(500); + assert.deepEqual(harness.calls, ["show"]); + + harness.changePage(page); + await harness.controller.whenIdle(); + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show", "show"]); +}); + +test("does not retry non-transient load failures", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 1 }); + harness.controller.reconcile(); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show"]); +}); + +test("retries a rejected native show call", async () => { + vi.useFakeTimers(); + let showCalls = 0; + const { harness } = await createEligibleHarness({ + show() { + showCalls++; + if (showCalls === 1) throw new Error("bridge failure"); + }, + }); + + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show"]); + assert.equal(harness.errors.length, 1); +}); + +test("keeps a rejected hide operation eligible for reconciliation", async () => { + let hideCalls = 0; + const { harness } = await createEligibleHarness({ + hide() { + hideCalls++; + if (hideCalls === 1) throw new Error("bridge failure"); + }, + }); + + harness.controller.setKeyboardVisible(true); + await harness.controller.whenIdle(); + harness.controller.reconcile(); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "hide", "hide"]); + assert.equal(harness.errors.length, 1); +}); + +test("replacement and disposal cancel retries and detach listeners", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + harness.emit("loadfail", { code: 3 }); + + const replacementCalls = []; + const replacementListeners = new Map(); + harness.controller.setBanner({ + active: false, + async hide() { + replacementCalls.push("hide"); + }, + on(eventName, listener) { + replacementListeners.set(eventName, listener); + return () => replacementListeners.delete(eventName); + }, + async show() { + replacementCalls.push("show"); + }, + }); + await harness.controller.whenIdle(); + const errorsBeforeStaleEvent = harness.errors.length; + harness.emit("loadfail", { code: 3 }); + replacementListeners.get("loadfail")({ code: 3 }); + harness.controller.dispose(); + replacementListeners.get("loadfail")?.({ code: 3 }); + await vi.advanceTimersByTimeAsync(500); + + assert.deepEqual(replacementCalls, ["show"]); + assert.equal(harness.errors.length, errorsBeforeStaleEvent + 1); +}); + +test("ignores a stale show rejection after replacing the banner", async () => { + let rejectOldShow; + const harness = createHarness({ + show: () => + new Promise((_, reject) => { + rejectOldShow = reject; + }), + }); + const page = {}; + harness.setActivePage(page); + harness.controller.registerPage(page); + await new Promise((resolve) => setImmediate(resolve)); + + const replacementCalls = []; + harness.controller.setBanner({ + active: false, + async hide() { + replacementCalls.push("hide"); + }, + on() { + return () => {}; + }, + async show() { + replacementCalls.push("show"); + }, + }); + rejectOldShow(new Error("stale bridge failure")); + await harness.controller.whenIdle(); + + assert.deepEqual(replacementCalls, ["show"]); + assert.deepEqual(harness.errors, []); +}); diff --git a/tests/unit/confirm.test.js b/tests/unit/confirm.test.js index 0029941e48..bbcadbda15 100644 --- a/tests/unit/confirm.test.js +++ b/tests/unit/confirm.test.js @@ -1,4 +1,6 @@ -import { Window } from "happy-dom"; +// @vitest-environment happy-dom + +import tag from "html-tag-js"; import { afterEach, beforeEach, expect, it, vi } from "vitest"; vi.mock("lib/settings", () => ({ default: { value: { confirmOnExit: false } }, @@ -9,23 +11,14 @@ vi.mock("components/checkbox", () => ({ })); import confirm from "dialogs/confirm"; import actionStack from "lib/actionStack"; -let window; beforeEach(() => { vi.useFakeTimers(); vi.clearAllMocks(); actionStack.setMark(); - window = new Window(); - vi.stubGlobal("document", window.document); - vi.stubGlobal("app", window.document.body); + document.body.replaceChildren(); + vi.stubGlobal("app", document.body); vi.stubGlobal("strings", { ok: "OK", cancel: "Cancel" }); - vi.stubGlobal("tag", (name, options) => { - const el = document.createElement(name); - for (const [key, value] of Object.entries(options)) { - if (key === "children") el.append(...value); - else if (value !== undefined) el[key] = value; - } - return el; - }); + vi.stubGlobal("tag", tag); }); afterEach(() => { actionStack.clearFromMark(); @@ -33,7 +26,7 @@ afterEach(() => { vi.restoreAllMocks(); vi.useRealTimers(); vi.unstubAllGlobals(); - window.happyDOM.cancelAsync(); + document.body.replaceChildren(); }); it.each([ "back", @@ -44,6 +37,7 @@ it.each([ const result = confirm("Icon", "Watch?", false, { signal: controller.signal, }); + expect(document.querySelector(".confirm").className).toBe("prompt confirm"); if (method === "back") await actionStack.pop(); if (method === "cancel") document.querySelector("button").click(); if (method === "abort") controller.abort(); @@ -52,6 +46,20 @@ it.each([ expect(app.children.length).toBe(0); expect(actionStack.length).toBe(0); }); +it("applies the overlay layer without losing RTL and resolves true", async () => { + const result = confirm("Delete", "Delete this review?", false, { + direction: "rtl", + aboveOverlay: true, + }); + const dialog = document.querySelector(".confirm"); + expect(dialog.className).toBe("prompt confirm above-overlay"); + expect(dialog.dir).toBe("rtl"); + dialog.querySelectorAll("button")[1].click(); + await expect(result).resolves.toBe(true); + vi.runAllTimers(); + expect(app.children.length).toBe(0); + expect(actionStack.length).toBe(0); +}); it("preserves checkbox response and ignores subsequent dismissals", async () => { const push = vi.spyOn(actionStack, "push"); const remove = vi.spyOn(actionStack, "remove"); diff --git a/tests/unit/consoleExecutionContext.test.js b/tests/unit/consoleExecutionContext.test.js new file mode 100644 index 0000000000..3d6a6519e9 --- /dev/null +++ b/tests/unit/consoleExecutionContext.test.js @@ -0,0 +1,111 @@ +import { describe, expect, it } from "vitest"; +import { + executeConsoleCommand, + executeConsoleScript, + resolveConsoleExecutionContext, +} from "lib/consoleRuntime"; + +describe("console execution context", () => { + it("forces standalone menu consoles to use the worker", () => { + expect(resolveConsoleExecutionContext(true, "page")).toBe("worker"); + expect(resolveConsoleExecutionContext(false, "page")).toBe("page"); + }); + + it("uses isolated worker execution by default", async () => { + const calls = []; + const result = await executeConsoleCommand({ + context: "worker", + code: "document.title", + workerExecutor: { + execute(code) { + calls.push(["worker", code]); + return Promise.resolve({ type: "result", value: "isolated" }); + }, + }, + pageExecutor(code) { + calls.push(["page", code]); + }, + }); + + expect(calls).toEqual([["worker", "document.title"]]); + expect(result.value).toBe("isolated"); + }); + + it("restores live page execution when explicitly selected", async () => { + const calls = []; + const result = await executeConsoleCommand({ + context: "page", + code: 'document.querySelector("main")', + workerExecutor: { + execute(code) { + calls.push(["worker", code]); + }, + }, + pageExecutor(code) { + calls.push(["page", code]); + return { type: "result", value: "live page" }; + }, + }); + + expect(calls).toEqual([["page", 'document.querySelector("main")']]); + expect(result.value).toBe("live page"); + }); + + it("loads Run-button scripts and executes them in the worker", async () => { + const calls = []; + const result = await executeConsoleScript({ + scriptUrl: "example.js", + fetchScript: async (url, options) => { + calls.push(["fetch", url, options]); + return { + ok: true, + text: async () => "while (true) {}", + }; + }, + workerExecutor: { + execute(code) { + calls.push(["worker", code]); + return Promise.resolve({ type: "result" }); + }, + }, + }); + + expect(calls).toEqual([ + ["fetch", "example.js", { cache: "no-store" }], + ["worker", "while (true) {}"], + ]); + expect(result).toEqual({ type: "result" }); + }); + + it("does not load a script for an empty menu console", async () => { + let fetched = false; + const result = await executeConsoleScript({ + scriptUrl: null, + fetchScript: async () => { + fetched = true; + }, + }); + + expect(fetched).toBe(false); + expect(result).toBeNull(); + }); + + it("returns a console error when a Run-button script cannot be loaded", async () => { + let executed = false; + const result = await executeConsoleScript({ + scriptUrl: "missing.js", + fetchScript: async () => ({ ok: false, status: 404 }), + workerExecutor: { + execute() { + executed = true; + }, + }, + }); + + expect(executed).toBe(false); + expect(result).toMatchObject({ + type: "error", + value: { message: "Failed to load JavaScript file (404)." }, + }); + }); +}); diff --git a/tests/unit/consoleExecutor.test.js b/tests/unit/consoleExecutor.test.js new file mode 100644 index 0000000000..7dcd45e645 --- /dev/null +++ b/tests/unit/consoleExecutor.test.js @@ -0,0 +1,134 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import ConsoleExecutor from "lib/consoleRuntime"; + +class FakeWorker { + static instances = []; + + constructor(url) { + this.url = url; + this.terminate = vi.fn(); + this.postMessage = vi.fn(); + FakeWorker.instances.push(this); + } + + respond(data) { + this.onmessage({ data }); + } +} + +describe("ConsoleExecutor", () => { + beforeEach(() => { + FakeWorker.instances = []; + vi.useRealTimers(); + }); + + it("returns a worker result and reuses the isolated context", async () => { + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + }); + + const firstResult = executor.execute("1 + 1"); + const worker = FakeWorker.instances[0]; + expect(worker.url).toBe("/console-worker.js"); + expect(worker.postMessage).toHaveBeenCalledWith({ id: 1, code: "1 + 1" }); + + worker.respond({ type: "result", id: 1, value: 2 }); + await expect(firstResult).resolves.toEqual({ type: "result", value: 2 }); + + const secondResult = executor.execute("3 + 4"); + expect(FakeWorker.instances).toHaveLength(1); + worker.respond({ type: "result", id: 2, value: 7 }); + await expect(secondResult).resolves.toEqual({ type: "result", value: 7 }); + }); + + it("forwards console messages from the worker", async () => { + const onConsole = vi.fn(); + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + onConsole, + }); + + const result = executor.execute("console.log('hello')"); + const worker = FakeWorker.instances[0]; + const message = { + type: "console", + id: 1, + level: "log", + args: ["hello"], + }; + worker.respond(message); + worker.respond({ type: "result", id: 1 }); + + expect(onConsole).toHaveBeenCalledWith(message); + await expect(result).resolves.toEqual({ type: "result", value: undefined }); + }); + + it("terminates and replaces a worker when execution times out", async () => { + vi.useFakeTimers(); + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + timeout: 50, + }); + + const timedOutResult = executor.execute("while (true) {}"); + const blockedWorker = FakeWorker.instances[0]; + await vi.advanceTimersByTimeAsync(50); + + const result = await timedOutResult; + expect(result.type).toBe("error"); + expect(result.value.message).toBe("Execution stopped after 0.05 seconds."); + expect(blockedWorker.terminate).toHaveBeenCalledOnce(); + + const nextResult = executor.execute("42"); + expect(FakeWorker.instances).toHaveLength(2); + FakeWorker.instances[1].respond({ type: "result", id: 2, value: 42 }); + await expect(nextResult).resolves.toEqual({ type: "result", value: 42 }); + }); + + it("allows a running command to be stopped immediately", async () => { + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + }); + + const stoppedResult = executor.execute("while (true) {}"); + const blockedWorker = FakeWorker.instances[0]; + + expect(executor.cancel()).toBe(true); + await expect(stoppedResult).resolves.toMatchObject({ + type: "error", + value: { message: "Execution stopped." }, + }); + expect(blockedWorker.terminate).toHaveBeenCalledOnce(); + expect(executor.cancel()).toBe(false); + }); + + it("turns worker errors into console errors", async () => { + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + }); + + const result = executor.execute("missingName"); + FakeWorker.instances[0].respond({ + type: "error", + id: 1, + error: { + name: "ReferenceError", + message: "missingName is not defined", + stack: "worker stack", + }, + }); + + const errorResult = await result; + expect(errorResult.type).toBe("error"); + expect(errorResult.value).toMatchObject({ + name: "ReferenceError", + message: "missingName is not defined", + stack: "worker stack", + }); + }); +}); diff --git a/tests/unit/consoleViewport.test.js b/tests/unit/consoleViewport.test.js new file mode 100644 index 0000000000..218a5bad69 --- /dev/null +++ b/tests/unit/consoleViewport.test.js @@ -0,0 +1,41 @@ +// @vitest-environment happy-dom + +import { describe, expect, it } from "vitest"; +import { + applyConsoleViewport, + getConsoleViewportRect, +} from "lib/consoleRuntime"; + +describe("console visual viewport", () => { + it("uses the visual viewport when the mobile keyboard shrinks the screen", () => { + const windowObject = { + innerHeight: 800, + innerWidth: 400, + visualViewport: { + height: 476.4, + width: 400, + offsetTop: 12.2, + offsetLeft: 0, + }, + }; + + expect(getConsoleViewportRect(windowObject)).toEqual({ + height: 476, + width: 400, + top: 12, + left: 0, + }); + + const element = document.createElement("div"); + applyConsoleViewport(element, windowObject); + expect(element.style.getPropertyValue("--console-viewport-height")).toBe( + "476px", + ); + }); + + it("falls back to the layout viewport", () => { + expect( + getConsoleViewportRect({ innerHeight: 720, innerWidth: 360 }), + ).toEqual({ height: 720, width: 360, top: 0, left: 0 }); + }); +}); diff --git a/tests/unit/editorThemes.test.js b/tests/unit/editorThemes.test.js index 0b2dee35e0..30ccb06aa7 100644 --- a/tests/unit/editorThemes.test.js +++ b/tests/unit/editorThemes.test.js @@ -61,4 +61,16 @@ describe("built-in editor themes", () => { ).not.toThrow(); } }); + + it("keeps active-line backgrounds translucent so selections remain visible", () => { + for (const { id } of getThemes()) { + const activeLine = getThemeConfig(id).activeLine; + if (!activeLine) continue; + + expect(activeLine, `${id} active line`).toMatch(/^#[\da-f]{8}$/i); + expect(Number.parseInt(activeLine.slice(-2), 16), `${id} active line`).toBeLessThan( + 255, + ); + } + }); }); diff --git a/tests/unit/lspExternalWebSocketLifecycle.test.js b/tests/unit/lspExternalWebSocketLifecycle.test.js index 65b66dbcbc..227061a14d 100644 --- a/tests/unit/lspExternalWebSocketLifecycle.test.js +++ b/tests/unit/lspExternalWebSocketLifecycle.test.js @@ -197,6 +197,24 @@ afterEach(async () => { }); describe("LSP client idle lifecycle", () => { + it("advertises lazy code-action edit resolution", async () => { + manager = new LspClientManager(); + await manager.getExtensionsForFile({ + uri: "file:///workspace/main.rs", + rootUri: "file:///workspace", + languageId: LANGUAGE_ID, + view, + }); + + const initialize = TestWebSocket.instances[0].sent + .map((data) => JSON.parse(data)) + .find((message) => message.method === "initialize"); + expect(initialize.params.capabilities.textDocument.codeAction).toEqual({ + dataSupport: true, + resolveSupport: {properties: ["edit"]}, + }); + }); + it("reuses an external WebSocket client when a file attaches during the grace period", async () => { const onClientIdle = vi.fn(({dispose}) => void dispose()); manager = new LspClientManager({onClientIdle}); diff --git a/tests/unit/lspLocationUtils.test.ts b/tests/unit/lspLocationUtils.test.ts new file mode 100644 index 0000000000..8a006dd372 --- /dev/null +++ b/tests/unit/lspLocationUtils.test.ts @@ -0,0 +1,38 @@ +import { normalizeLocations } from "cm/lsp/locationUtils"; +import { describe, expect, it } from "vitest"; + +const targetRange = { + start: { line: 4, character: 1 }, + end: { line: 4, character: 8 }, +}; + +describe("normalizeLocations", () => { + it("keeps Location responses unchanged", () => { + const location = { uri: "file:///project/a.ts", range: targetRange }; + expect(normalizeLocations(location)).toEqual([location]); + }); + + it("uses a LocationLink target selection range when present", () => { + const selection = { + start: { line: 4, character: 3 }, + end: { line: 4, character: 6 }, + }; + expect( + normalizeLocations([ + { + targetUri: "file:///project/a.ts", + targetRange, + targetSelectionRange: selection, + }, + ]), + ).toEqual([{ uri: "file:///project/a.ts", range: selection }]); + }); + + it("falls back to the LocationLink target range", () => { + expect( + normalizeLocations([ + { targetUri: "file:///project/a.ts", targetRange }, + ]), + ).toEqual([{ uri: "file:///project/a.ts", range: targetRange }]); + }); +}); diff --git a/tests/unit/lspPositionUtils.test.ts b/tests/unit/lspPositionUtils.test.ts new file mode 100644 index 0000000000..789e4ff250 --- /dev/null +++ b/tests/unit/lspPositionUtils.test.ts @@ -0,0 +1,28 @@ +import { Text } from "@codemirror/state"; +import { safeLspPositionToOffset } from "cm/lsp/positionUtils"; +import { describe, expect, it } from "vitest"; + +describe("safeLspPositionToOffset", () => { + const doc = Text.of(["alpha", "beta"]); + + it("converts valid positions and clamps oversized characters", () => { + expect(safeLspPositionToOffset(doc, { line: 0, character: 2 })).toBe(2); + expect(safeLspPositionToOffset(doc, { line: 1, character: 99 })).toBe( + doc.length, + ); + }); + + it("accepts the exclusive one-past-EOF position used by LSP edits", () => { + expect( + safeLspPositionToOffset(doc, { line: doc.lines, character: 0 }), + ).toBe(doc.length); + expect( + safeLspPositionToOffset(doc, { line: doc.lines + 10, character: 4 }), + ).toBe(doc.length); + }); + + it("clamps negative lines and characters", () => { + expect(safeLspPositionToOffset(doc, { line: -1, character: 20 })).toBe(0); + expect(safeLspPositionToOffset(doc, { line: 1, character: -4 })).toBe(6); + }); +}); diff --git a/tests/unit/openFileCancellation.test.js b/tests/unit/openFileCancellation.test.js new file mode 100644 index 0000000000..4f8cd26a3b --- /dev/null +++ b/tests/unit/openFileCancellation.test.js @@ -0,0 +1,223 @@ +import fs from "node:fs"; +import ts from "typescript"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +// openFile contains app-specific JSX. Compile the actual module for this +// isolated test, supplying its Cordova/UI dependencies without booting the app. +const source = fs.readFileSync( + new URL("../../src/lib/openFile.js", import.meta.url), + "utf8", +); +const { outputText } = ts.transpileModule(source, { + fileName: "openFile.jsx", + compilerOptions: { + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2020, + jsx: ts.JsxEmit.React, + }, +}); + +function deferred() { + let resolve; + const promise = new Promise((done) => { + resolve = done; + }); + return { promise, resolve }; +} + +describe("openFile cancellation", () => { + let openFile; + let manager; + let stat; + let readFile; + let decode; + let detectEncoding; + let handler; + let createEditor; + let recents; + let controller; + let titleLoader; + let loaderVisible; + + beforeEach(() => { + controller = new AbortController(); + loaderVisible = false; + titleLoader = { + showTitleLoader: vi.fn(() => { + loaderVisible = true; + }), + removeTitleLoader: vi.fn(() => { + loaderVisible = false; + }), + }; + manager = { getFile: vi.fn(), activeFile: null }; + stat = vi.fn().mockResolvedValue({ name: "target.txt", length: 10 }); + readFile = vi.fn().mockResolvedValue("bytes"); + decode = vi.fn().mockResolvedValue("target text"); + detectEncoding = vi.fn().mockResolvedValue("UTF-8"); + handler = { getFileHandler: vi.fn() }; + recents = { addFile: vi.fn() }; + createEditor = vi.fn(function (name, options) { + manager.activeFile = { name, ...options }; + }); + const dependencies = { + fileSystem: { default: () => ({ stat, readFile }) }, + "@codemirror/state": {}, + "components/audioPlayer": {}, + "dialogs/alert": {}, + "dialogs/confirm": {}, + "dialogs/loader": { + default: titleLoader, + }, + "palettes/changeEncoding": {}, + "utils/encodings": { decode, detectEncoding }, + "utils/helpers": { + default: { getStatMtime: () => 0, isBinary: () => false }, + }, + "./editorFile": { default: createEditor }, + "./fileSessionPersistence": { promoteSessionPersistence: vi.fn() }, + "./fileTypeHandler": { default: handler }, + "./recents": { default: recents }, + "./settings": { + default: { value: { maxFileSize: 10, defaultFileEncoding: "auto" } }, + }, + }; + const exports = {}; + new Function("require", "exports", "editorManager", outputText)( + (name) => { + if (!(name in dependencies)) throw new Error(`Unexpected import: ${name}`); + return dependencies[name]; + }, + exports, + manager, + ); + openFile = exports.default; + }); + + it("preserves normal file opening without a signal", async () => { + await openFile("target", { render: true }); + expect(createEditor).toHaveBeenCalledOnce(); + expect(manager.activeFile.text).toBe("target text"); + expect(recents.addFile).toHaveBeenCalledWith("target"); + }); + + it("does not activate an existing file with an already-aborted signal", async () => { + const file = { makeActive: vi.fn() }; + manager.getFile.mockReturnValue(file); + controller.abort(); + await openFile("target", { render: true, signal: controller.signal }); + expect(file.makeActive).not.toHaveBeenCalled(); + }); + + it.each(["stat", "read", "detect", "decode"])( + "does not steal focus when cancelled during %s", + async (stage) => { + const waiting = deferred(); + const operation = { stat, read: readFile, detect: detectEncoding, decode }[ + stage + ]; + operation.mockReturnValueOnce(waiting.promise); + const opening = openFile("obsolete", { + render: true, + signal: controller.signal, + }); + await vi.waitFor(() => expect(operation).toHaveBeenCalledOnce()); + controller.abort(); + + // A newer open completes before the obsolete filesystem work does. + await openFile("latest", { render: true }); + const latest = manager.activeFile; + waiting.resolve( + stage === "stat" ? { name: "obsolete.txt", length: 10 } : "text", + ); + await opening; + expect(manager.activeFile).toBe(latest); + expect(createEditor).toHaveBeenCalledOnce(); + expect(recents.addFile).toHaveBeenCalledExactlyOnceWith("latest"); + }, + ); + + it("guards a custom handler's delayed createEditor callback", async () => { + const waiting = deferred(); + const handleFile = vi.fn(async ({ options }) => { + await waiting.promise; + options.createEditor(false, "obsolete text"); + }); + handler.getFileHandler.mockReturnValue({ handleFile }); + const opening = openFile("obsolete", { signal: controller.signal }); + await vi.waitFor(() => expect(handleFile).toHaveBeenCalledOnce()); + controller.abort(); + waiting.resolve(); + await opening; + expect(createEditor).not.toHaveBeenCalled(); + }); + + it("keeps the latest loader visible when an aborted earlier read settles", async () => { + const obsoleteRead = deferred(); + const latestRead = deferred(); + readFile.mockReturnValueOnce(obsoleteRead.promise); + readFile.mockReturnValueOnce(latestRead.promise); + const obsolete = openFile("obsolete", { signal: controller.signal }); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledTimes(1)); + controller.abort(); + const latest = openFile("latest"); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledTimes(2)); + expect(loaderVisible).toBe(true); + const removals = titleLoader.removeTitleLoader.mock.calls.length; + + obsoleteRead.resolve("obsolete bytes"); + await obsolete; + expect(loaderVisible).toBe(true); + expect(titleLoader.removeTitleLoader).toHaveBeenCalledTimes(removals); + latestRead.resolve("latest bytes"); + await latest; + expect(loaderVisible).toBe(false); + }); + + it.each([0, 1])( + "keeps the indicator until both concurrent opens finish (first to finish: %s)", + async (first) => { + const reads = [deferred(), deferred()]; + readFile.mockReturnValueOnce(reads[0].promise); + readFile.mockReturnValueOnce(reads[1].promise); + const opens = [openFile("one"), openFile("two")]; + await vi.waitFor(() => expect(readFile).toHaveBeenCalledTimes(2)); + reads[first].resolve("bytes"); + await opens[first]; + expect(loaderVisible).toBe(true); + expect(titleLoader.removeTitleLoader).not.toHaveBeenCalled(); + reads[1 - first].resolve("bytes"); + await opens[1 - first]; + expect(loaderVisible).toBe(false); + expect(titleLoader.removeTitleLoader).toHaveBeenCalledOnce(); + }, + ); + + it("releases a cancelled open's loader without waiting for its read", async () => { + const reading = deferred(); + readFile.mockReturnValueOnce(reading.promise); + const opening = openFile("target", { signal: controller.signal }); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledOnce()); + expect(loaderVisible).toBe(true); + controller.abort(); + expect(loaderVisible).toBe(false); + expect(titleLoader.removeTitleLoader).toHaveBeenCalledOnce(); + reading.resolve("bytes"); + await opening; + expect(titleLoader.removeTitleLoader).toHaveBeenCalledOnce(); + }); + + it("does not hide another open's loader when activating an existing tab", async () => { + const reading = deferred(); + readFile.mockReturnValueOnce(reading.promise); + const opening = openFile("loading"); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledOnce()); + manager.getFile.mockReturnValue({ makeActive: vi.fn() }); + await openFile("existing"); + expect(loaderVisible).toBe(true); + expect(titleLoader.removeTitleLoader).not.toHaveBeenCalled(); + reading.resolve("bytes"); + await opening; + expect(loaderVisible).toBe(false); + }); +}); diff --git a/tests/unit/pluginContext.test.js b/tests/unit/pluginContext.test.js new file mode 100644 index 0000000000..2523220c99 --- /dev/null +++ b/tests/unit/pluginContext.test.js @@ -0,0 +1,27 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +afterEach(() => { + vi.resetModules(); + vi.unstubAllGlobals(); +}); + +describe("plugin context Cordova bridge", () => { + it("loads before cordova.exec is mapped", async () => { + const nativeExec = vi.fn((resolve, _reject, _service, action) => { + if (action === "establishConnection") { + resolve("trusted-session"); + } else if (action === "requestToken") { + resolve("plugin-token"); + } + }); + const requireModule = vi.fn(() => nativeExec); + vi.stubGlobal("cordova", { require: requireModule }); + + const pluginContext = await import("lib/pluginContext"); + + expect(requireModule).toHaveBeenCalledWith("cordova/exec"); + expect(cordova.exec).toBeUndefined(); + await expect(pluginContext.connect()).resolves.toBe(true); + await expect(pluginContext.default("example.plugin", "{}")).resolves.toBeTruthy(); + }); +}); diff --git a/tests/unit/pluginReview.test.js b/tests/unit/pluginReview.test.js new file mode 100644 index 0000000000..efb70b1bbc --- /dev/null +++ b/tests/unit/pluginReview.test.js @@ -0,0 +1,183 @@ +import { describe, expect, it } from "vitest"; +import { getIntlLocale, getLocaleDirection } from "lib/lang"; +import { + formatReviewDate, + getRatingClass, + getRatingLabel, + hasReviewChanged, + normalizeReviewDraft, + partitionPluginReviews, + resolveReviewAvatarUrl, + updateReviewStats, + validateReviewDraft, +} from "pages/plugin/reviewUtils"; + +describe("plugin review dates", () => { + it("formats database timestamps as website-style relative dates", () => { + const formatted = formatReviewDate( + "2026-08-26 12:00:00", + Date.parse("2026-08-28T12:00:00Z"), + "en-US", + ); + + expect(formatted?.dateTime).toBe("2026-08-26T12:00:00.000Z"); + expect(formatted?.relative).toBe("2 days ago"); + expect(formatted?.title).toBeTruthy(); + }); + + it("uses the selected locale for relative and absolute dates", () => { + const value = "2026-08-26 12:00:00"; + const now = Date.parse("2026-08-28T12:00:00Z"); + const formatted = formatReviewDate(value, now, "fr-FR"); + const date = new Date("2026-08-26T12:00:00Z"); + + expect(formatted?.relative).toBe( + new Intl.RelativeTimeFormat("fr-FR", { numeric: "auto" }).format( + -2, + "day", + ), + ); + expect(formatted?.title).toBe( + date.toLocaleString("fr-FR", { + dateStyle: "medium", + timeStyle: "short", + }), + ); + }); + + it("normalizes Acode-specific locale codes", () => { + expect(getIntlLocale("pu-in")).toBe("pa-IN"); + expect(getIntlLocale("ir-fa")).toBe("fa-IR"); + expect(getIntlLocale("mm-unicode")).toBe("my-MM"); + expect(getIntlLocale("mm-zawgyi")).toBe("my-MM"); + expect(getLocaleDirection("fa-IR")).toBe("rtl"); + expect(getLocaleDirection("ar-YE")).toBe("rtl"); + expect(getLocaleDirection("he-IL")).toBe("rtl"); + expect(getLocaleDirection("de-DE")).toBe("ltr"); + }); + + it("hides missing or invalid review dates", () => { + expect(formatReviewDate()).toBeNull(); + expect(formatReviewDate("not-a-date")).toBeNull(); + }); +}); + +describe("plugin review avatars", () => { + it("prefers an explicit avatar and falls back to GitHub", () => { + expect( + resolveReviewAvatarUrl({ + avatar_url: " https://example.com/avatar.png ", + github: "acode-foundation", + }), + ).toBe("https://example.com/avatar.png"); + expect(resolveReviewAvatarUrl({ github: " acode-foundation " })).toBe( + "https://avatars.githubusercontent.com/acode-foundation", + ); + }); + + it("uses the local placeholder when no avatar is available", () => { + expect(resolveReviewAvatarUrl()).toBeNull(); + expect(resolveReviewAvatarUrl({ avatar_url: " ", github: " " })).toBeNull(); + }); +}); + +describe("plugin review ordering", () => { + it("pins and deduplicates the current user's review across id types", () => { + const reviews = [ + { id: 1, user_id: 10, comment: "First" }, + { id: 2, user_id: "7", comment: "Mine from the list" }, + { id: 3, user_id: 11, comment: "Second" }, + ]; + const currentReview = { + id: "2", + user_id: 7, + comment: "", + vote: 1, + }; + + expect(partitionPluginReviews(reviews, currentReview, "7")).toEqual({ + ownReview: currentReview, + communityReviews: [reviews[0], reviews[2]], + }); + }); +}); + +describe("plugin review draft", () => { + it("normalizes whitespace and preserves valid votes", () => { + expect(normalizeReviewDraft({ comment: " Very useful ", vote: "1" })).toEqual( + { + comment: "Very useful", + vote: 1, + }, + ); + }); + + it("supports an upvote without text and validates negative feedback", () => { + expect(validateReviewDraft({ vote: 1 })).toEqual({ comment: "", vote: 1 }); + expect(validateReviewDraft({ comment: " ", vote: -1 }).errorKey).toBe( + "plugin-review:error-downvote-comment", + ); + expect(validateReviewDraft({ comment: " ", vote: 0 }).errorKey).toBe( + "plugin-review:error-empty", + ); + }); + + it("enforces the 250 character limit", () => { + expect(validateReviewDraft({ comment: "x".repeat(250), vote: 0 })).toEqual({ + comment: "x".repeat(250), + vote: 0, + }); + expect( + validateReviewDraft({ comment: "x".repeat(251), vote: 0 }).errorKey, + ).toBe("plugin-review:error-max-length"); + }); + + it("compares normalized drafts to prevent duplicate submissions", () => { + expect( + hasReviewChanged( + { comment: "Useful", vote: 1 }, + { comment: " Useful ", vote: "1" }, + ), + ).toBe(false); + expect( + hasReviewChanged( + { comment: "Useful", vote: 1 }, + { comment: "Updated", vote: 1 }, + ), + ).toBe(true); + }); +}); + +describe("plugin review metrics", () => { + it("moves votes and comment counts without inflation", () => { + expect( + updateReviewStats( + { votesUp: 8, votesDown: 2, commentCount: 4 }, + { vote: 1, comment: "Old" }, + { vote: -1, comment: "New" }, + ), + ).toEqual({ votesUp: 7, votesDown: 3, commentCount: 4 }); + }); + + it("handles vote-only reviews and deletion", () => { + const added = updateReviewStats( + { votesUp: 0, votesDown: 0, commentCount: 0 }, + null, + { vote: 1, comment: "" }, + ); + expect(added).toEqual({ votesUp: 1, votesDown: 0, commentCount: 0 }); + expect(updateReviewStats(added, { vote: 1 }, null)).toEqual({ + votesUp: 0, + votesDown: 0, + commentCount: 0, + }); + }); + + it("formats rating labels and visual states", () => { + expect(getRatingLabel(0, 0)).toBe("unrated"); + expect(getRatingLabel(8, 2)).toBe("80%"); + expect(getRatingClass("80%")).toContain("rating-high"); + expect(getRatingClass("50%")).toContain("rating-medium"); + expect(getRatingClass("49%")).toContain("rating-low"); + }); +}); diff --git a/tests/unit/restoreFiles.test.js b/tests/unit/restoreFiles.test.js new file mode 100644 index 0000000000..339a347111 --- /dev/null +++ b/tests/unit/restoreFiles.test.js @@ -0,0 +1,70 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const runtime = vi.hoisted(() => ({ + instances: [], +})); + +vi.mock("lib/editorFile", () => ({ + default: class MockEditorFile { + constructor(filename, options) { + this.filename = filename; + this.options = options; + this.loaded = new Promise((resolve) => { + this.resolveLoad = resolve; + }); + runtime.instances.push(this); + } + + load() { + return this.loaded; + } + }, +})); + +import restoreFiles from "lib/restoreFiles"; + +describe("restored file loading", () => { + beforeEach(() => { + runtime.instances.length = 0; + }); + + it("waits for every local tab and activates the last tab by default", async () => { + let completed = false; + const restoration = restoreFiles([ + { id: "one", filename: "one.js", uri: "file:///one.js" }, + { id: "two", filename: "two.js", uri: "file:///two.js" }, + ]).then(() => { + completed = true; + }); + + expect(runtime.instances).toHaveLength(2); + expect(runtime.instances.map((file) => file.options.render)).toEqual([ + false, + true, + ]); + expect(completed).toBe(false); + + runtime.instances[0].resolveLoad(); + await Promise.resolve(); + expect(completed).toBe(false); + + runtime.instances[1].resolveLoad(); + await restoration; + expect(completed).toBe(true); + }); + + it.each(["ftp", "sftp", "http", "https"])( + "does not block startup on an unresolved %s tab", + async (protocol) => { + await restoreFiles([ + { + id: "remote", + filename: "remote.js", + uri: `${protocol}://example.com/remote.js`, + }, + ]); + + expect(runtime.instances).toHaveLength(1); + }, + ); +}); diff --git a/tests/unit/searchMatchHighlighter.test.ts b/tests/unit/searchMatchHighlighter.test.ts new file mode 100644 index 0000000000..7b4fb5ac23 --- /dev/null +++ b/tests/unit/searchMatchHighlighter.test.ts @@ -0,0 +1,161 @@ +// @vitest-environment happy-dom + +import { + openSearchPanel, + search, + SearchQuery, + setSearchQuery, +} from "@codemirror/search"; +import { EditorSelection, EditorState } from "@codemirror/state"; +import { type DecorationSet, EditorView } from "@codemirror/view"; +import searchMatchHighlighter, { + buildSearchMatchDecorations, +} from "cm/searchMatchHighlighter"; +import { afterEach, describe, expect, it } from "vitest"; + +interface HighlightRange { + from: number; + to: number; + className: string; +} + +const views: EditorView[] = []; + +afterEach(() => { + while (views.length) views.pop()?.destroy(); + document.body.replaceChildren(); +}); + +function searchState( + doc: string, + searchText: string, + selection = EditorSelection.cursor(0), + options: Partial[0]> = {}, +): EditorState { + const state = EditorState.create({ + doc, + selection, + extensions: search(), + }); + return state.update({ + effects: setSearchQuery.of( + new SearchQuery({ search: searchText, ...options }), + ), + }).state; +} + +function highlightRanges( + state: EditorState, + visibleRanges: readonly { from: number; to: number }[], +): HighlightRange[] { + return decorationRanges( + buildSearchMatchDecorations(state, visibleRanges), + state.doc.length, + ); +} + +function decorationRanges( + decorations: DecorationSet, + docLength: number, +): HighlightRange[] { + const ranges: HighlightRange[] = []; + decorations.between(0, docLength, (from, to, decoration) => { + ranges.push({ + from, + to, + className: String(decoration.spec.class ?? ""), + }); + }); + return ranges; +} + +describe("custom search match highlighter", () => { + it("reacts to custom query and selection updates without a native panel", () => { + const view = new EditorView({ + state: EditorState.create({ + doc: "foo foo", + extensions: [search(), searchMatchHighlighter], + }), + parent: document.body, + }); + views.push(view); + + view.dispatch({ + effects: setSearchQuery.of(new SearchQuery({ search: "foo" })), + }); + view.dispatch({ selection: EditorSelection.range(4, 7) }); + + const plugin = view.plugin(searchMatchHighlighter); + expect(plugin).not.toBeNull(); + expect( + decorationRanges(plugin!.decorations, view.state.doc.length), + ).toEqual([ + { from: 0, to: 3, className: "cm-searchMatch" }, + { + from: 4, + to: 7, + className: "cm-searchMatch cm-searchMatch-selected", + }, + ]); + }); + + it("highlights every match in the rendered range and marks the selection", () => { + const state = searchState( + "foo foo foo", + "foo", + EditorSelection.range(4, 7), + ); + + expect(highlightRanges(state, [{ from: 0, to: state.doc.length }])).toEqual( + [ + { from: 0, to: 3, className: "cm-searchMatch" }, + { + from: 4, + to: 7, + className: "cm-searchMatch cm-searchMatch-selected", + }, + { from: 8, to: 11, className: "cm-searchMatch" }, + ], + ); + }); + + it("limits work to the viewport instead of scanning a large document", () => { + const padding = "x".repeat(100_000); + const doc = `needle${padding}needle${padding}needle`; + const middleMatch = 6 + padding.length; + const state = searchState(doc, "needle"); + + expect( + highlightRanges(state, [ + { from: middleMatch - 10, to: middleMatch + 16 }, + ]), + ).toEqual([ + { from: middleMatch, to: middleMatch + 6, className: "cm-searchMatch" }, + ]); + }); + + it("merges nearby viewport windows so matches are not decorated twice", () => { + const state = searchState("foo foo foo", "foo"); + + expect( + highlightRanges(state, [ + { from: 0, to: 5 }, + { from: 6, to: 11 }, + ]), + ).toHaveLength(3); + }); + + it("leaves highlighting to CodeMirror when its native panel is open", () => { + const view = new EditorView({ + state: searchState("foo foo", "foo"), + parent: document.body, + }); + views.push(view); + + openSearchPanel(view); + + expect( + highlightRanges(view.state, [{ from: 0, to: view.state.doc.length }]), + ).toEqual([]); + }); +}); diff --git a/tests/unit/searchResultNavigation.test.js b/tests/unit/searchResultNavigation.test.js new file mode 100644 index 0000000000..ace8ed8972 --- /dev/null +++ b/tests/unit/searchResultNavigation.test.js @@ -0,0 +1,229 @@ +import { EditorState } from "@codemirror/state"; +import openFile from "lib/openFile"; +import navigateToResult from "sidebarApps/searchInFiles/navigateToResult"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +vi.mock("lib/openFile", () => ({ default: vi.fn() })); + +function deferred() { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +} + +const match = { + start: { row: 1, column: 2 }, + end: { row: 1, column: 5 }, +}; + +describe("project search result navigation", () => { + let manager; + let files; + + function addFile(uri, text = "first\n match here\nlast") { + const file = { + uri, + type: "editor", + loaded: true, + loading: false, + session: EditorState.create({ doc: text }), + load: vi.fn().mockResolvedValue(undefined), + }; + files.set(uri, file); + return file; + } + + function activate(file) { + manager.activeFile = file; + manager.editor = { state: file.session }; + } + + beforeEach(() => { + files = new Map(); + manager = { + activeFile: null, + editor: null, + getFile: vi.fn((uri) => files.get(uri)), + revealRange: vi.fn(() => true), + }; + vi.stubGlobal("editorManager", manager); + openFile.mockReset(); + openFile.mockImplementation(async (uri, { signal }) => { + if (signal.aborted) return; + const file = files.get(uri) || addFile(uri); + activate(file); + }); + }); + + afterEach(() => vi.unstubAllGlobals()); + + it.each([false, true])( + "reveals the exact match through the scroll-restore-safe API (existing tab: %s)", + async (existing) => { + if (existing) addFile("target"); + expect(await navigateToResult("target", match)).toBe(true); + expect(openFile).toHaveBeenCalledWith("target", { + render: true, + signal: expect.any(AbortSignal), + }); + expect(manager.revealRange).toHaveBeenCalledWith(8, 11, { + y: "center", + userEvent: "select.search", + }); + }, + ); + + it("waits for a restored tab's final document instead of its preview", async () => { + const file = addFile("target", "preview"); + const loading = deferred(); + file.loaded = false; + file.loading = true; + file.load.mockImplementation(() => loading.promise); + const navigation = navigateToResult("target", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + expect(manager.revealRange).not.toHaveBeenCalled(); + + file.session = EditorState.create({ doc: "first\n match here\nlast" }); + file.loaded = true; + file.loading = false; + activate(file); + loading.resolve(); + expect(await navigation).toBe(true); + expect(manager.revealRange).toHaveBeenCalledWith(8, 11, expect.anything()); + }); + + it("reveals the latest result without waiting for an obsolete open", async () => { + const opening = deferred(); + openFile.mockImplementationOnce(async (uri, { signal }) => { + await opening.promise; + if (!signal.aborted) activate(addFile(uri)); + }); + const first = navigateToResult("slow", match); + await vi.waitFor(() => expect(openFile).toHaveBeenCalledTimes(1)); + const skipped = navigateToResult("intermediate", match); + const last = navigateToResult("latest", match); + await expect(last).resolves.toBe(true); + expect(manager.activeFile.uri).toBe("latest"); + expect(openFile.mock.calls[0][1].signal.aborted).toBe(true); + opening.resolve(); + + expect(await Promise.all([first, skipped, last])).toEqual([ + false, + false, + true, + ]); + expect(openFile.mock.calls.map(([uri]) => uri)).toEqual([ + "slow", + "intermediate", + "latest", + ]); + expect(manager.activeFile.uri).toBe("latest"); + expect(manager.revealRange).toHaveBeenCalledTimes(1); + }); + + it("reveals another file while an obsolete restored tab is still loading", async () => { + const file = addFile("slow"); + const loading = deferred(); + file.loaded = false; + file.loading = true; + file.load.mockImplementation(() => loading.promise); + const first = navigateToResult("slow", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + + await expect(navigateToResult("latest", match)).resolves.toBe(true); + expect(manager.activeFile.uri).toBe("latest"); + file.loaded = true; + file.loading = false; + loading.resolve(); + await expect(first).resolves.toBe(false); + expect(manager.activeFile.uri).toBe("latest"); + expect(manager.revealRange).toHaveBeenCalledTimes(1); + }); + + it("ignores late failures from an obsolete open", async () => { + const opening = deferred(); + openFile.mockImplementationOnce(() => opening.promise); + const first = navigateToResult("slow", match); + await expect(navigateToResult("latest", match)).resolves.toBe(true); + opening.reject(new Error("Obsolete read failed")); + await expect(first).resolves.toBe(false); + expect(manager.activeFile.uri).toBe("latest"); + }); + + it("uses the latest match when the same file is still loading", async () => { + const file = addFile("target"); + const loading = deferred(); + file.load.mockImplementationOnce(() => loading.promise); + const first = navigateToResult("target", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + const last = navigateToResult("target", { + start: { row: 2, column: 0 }, + end: { row: 2, column: 4 }, + }); + loading.resolve(); + expect(await Promise.all([first, last])).toEqual([false, true]); + expect(manager.revealRange).toHaveBeenCalledExactlyOnceWith( + 19, + 23, + expect.anything(), + ); + }); + + it.each(["switched", "closed", "failed"])( + "does not reveal into another document after the target is %s during loading", + async (action) => { + const file = addFile("target"); + const loading = deferred(); + file.load.mockImplementation(() => loading.promise); + const navigation = navigateToResult("target", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + if (action === "switched") activate(addFile("other")); + if (action === "closed") files.delete("target"); + if (action === "failed") file.loaded = false; + loading.resolve(); + expect(await navigation).toBe(false); + expect(manager.revealRange).not.toHaveBeenCalled(); + }, + ); + + it.each(["missing", "image"])( + "does not navigate the previous editor when opening a %s target", + async (type) => { + activate(addFile("previous")); + openFile.mockImplementationOnce(async () => { + if (type === "image") { + const file = addFile("target"); + file.type = "image"; + activate(file); + } + }); + expect(await navigateToResult("target", match)).toBe(false); + expect(manager.revealRange).not.toHaveBeenCalled(); + }, + ); + + it("handles multiline ranges and clamps stale coordinates", async () => { + addFile("target", "abc\ndef"); + await navigateToResult("target", { + start: { row: 0, column: 1 }, + end: { row: 1, column: 2 }, + }); + expect(manager.revealRange).toHaveBeenLastCalledWith(1, 6, expect.anything()); + await navigateToResult("target", { + start: { row: -1, column: -2 }, + end: { row: 100, column: 100 }, + }); + expect(manager.revealRange).toHaveBeenLastCalledWith(0, 7, expect.anything()); + }); + + it("continues navigating after an open rejects", async () => { + openFile.mockRejectedValueOnce(new Error("Read failed")); + await expect(navigateToResult("broken", match)).rejects.toThrow("Read failed"); + expect(await navigateToResult("target", match)).toBe(true); + expect(manager.activeFile.uri).toBe("target"); + }); +}); diff --git a/tests/unit/selectionMenuButton.test.ts b/tests/unit/selectionMenuButton.test.ts new file mode 100644 index 0000000000..47e0b26b1b --- /dev/null +++ b/tests/unit/selectionMenuButton.test.ts @@ -0,0 +1,89 @@ +// @vitest-environment happy-dom + +import { bindSelectionMenuButton } from "cm/selectionMenuUtils"; +import { describe, expect, it, vi } from "vitest"; + +function pointerEvent( + type: string, + pointerId = 7, + position: { x: number; y: number } = { x: 0, y: 0 }, +) { + return new PointerEvent(type, { + bubbles: true, + button: 0, + cancelable: true, + clientX: position.x, + clientY: position.y, + isPrimary: true, + pointerId, + pointerType: "touch", + }); +} + +describe("selection menu button interaction", () => { + it("preserves pointer-down and activates exactly once on release", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + const down = pointerEvent("pointerdown"); + button.dispatchEvent(down); + expect(down.defaultPrevented).toBe(true); + expect(button.classList.contains("is-pressed")).toBe(true); + expect(activate).not.toHaveBeenCalled(); + + button.dispatchEvent(pointerEvent("pointerup")); + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 1 }), + ); + + expect(button.classList.contains("is-pressed")).toBe(false); + expect(activate).toHaveBeenCalledTimes(1); + }); + + it("supports keyboard clicks and cancels interrupted presses", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + button.dispatchEvent(pointerEvent("pointerdown")); + button.dispatchEvent(pointerEvent("pointercancel")); + expect(activate).not.toHaveBeenCalled(); + + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 0 }), + ); + expect(activate).toHaveBeenCalledTimes(1); + }); + + it("does not activate an action when the pointer becomes a scroll gesture", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + button.dispatchEvent(pointerEvent("pointerdown", 7, { x: 10, y: 10 })); + button.dispatchEvent(pointerEvent("pointermove", 7, { x: 10, y: 30 })); + button.dispatchEvent(pointerEvent("pointerup", 7, { x: 10, y: 30 })); + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 1 }), + ); + + expect(button.classList.contains("is-pressed")).toBe(false); + expect(activate).not.toHaveBeenCalled(); + }); + + it("checks final pointer displacement when no move event is delivered", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + button.dispatchEvent(pointerEvent("pointerdown", 7, { x: 10, y: 10 })); + button.dispatchEvent(pointerEvent("pointerup", 7, { x: 30, y: 10 })); + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 1 }), + ); + + expect(button.classList.contains("is-pressed")).toBe(false); + expect(activate).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/unit/selectionMenuUtils.test.ts b/tests/unit/selectionMenuUtils.test.ts index 962f912e94..360fafdc57 100644 --- a/tests/unit/selectionMenuUtils.test.ts +++ b/tests/unit/selectionMenuUtils.test.ts @@ -1,4 +1,7 @@ -import { filterSelectionMenuItems } from "cm/selectionMenuUtils"; +import { + filterSelectionMenuItems, + partitionSelectionMenuItems, +} from "cm/selectionMenuUtils"; import { describe, expect, it } from "vitest"; const items = [ @@ -41,3 +44,32 @@ describe("selection menu filtering", () => { ]); }); }); + +describe("selection menu hierarchy", () => { + it("keeps selection essentials in the compact toolbar", () => { + const pluginItem = { id: "plugin-action", mode: "all" } as const; + const { primary, overflow } = partitionSelectionMenuItems( + [...items, pluginItem], + { hasSelection: true }, + ); + + expect(primary.map((item) => item.id)).toEqual([ + "copy", + "cut", + "paste", + "select-all", + ]); + expect(overflow.map((item) => item.id)).toEqual(["plugin-action"]); + }); + + it("keeps caret actions concise and moves plugins into More", () => { + const pluginItem = { mode: "all" } as const; + const { primary, overflow } = partitionSelectionMenuItems( + [...items, pluginItem], + { hasSelection: false }, + ); + + expect(primary.map((item) => item.id)).toEqual(["paste", "select-all"]); + expect(overflow).toEqual([items[0], items[1], pluginItem]); + }); +}); diff --git a/tests/unit/sessionPersistence.test.js b/tests/unit/sessionPersistence.test.js new file mode 100644 index 0000000000..e096148b65 --- /dev/null +++ b/tests/unit/sessionPersistence.test.js @@ -0,0 +1,198 @@ +// @vitest-environment happy-dom + +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const runtime = vi.hoisted(() => { + const settings = { + value: { + rememberFiles: true, + rememberFolders: false, + }, + }; + + return { + settings, + openFile: vi.fn(), + }; +}); + +vi.mock("cm/editorUtils", () => ({ + getAllFolds: vi.fn(() => []), + getScrollPosition: vi.fn(() => ({ scrollTop: 0, scrollLeft: 0 })), + getSelection: vi.fn(() => ({ + ranges: [{ from: 0, to: 0 }], + mainIndex: 0, + })), +})); +vi.mock("dialogs/alert", () => ({ default: vi.fn() })); +vi.mock("fileSystem", () => ({ default: vi.fn() })); +vi.mock("lib/auth", () => ({ default: {} })); +vi.mock("lib/config", () => ({ + default: { DEFAULT_FILE_SESSION: "default-session" }, +})); +vi.mock("lib/openFile", () => ({ default: runtime.openFile })); +vi.mock("lib/openFolder", () => ({ + default: vi.fn(), + addedFolder: [], +})); +vi.mock("lib/settings", () => ({ default: runtime.settings })); +vi.mock("lib/startAd", () => ({ + BANNER_SUPPRESSION_REASON: {}, + setBannerSuppressed: vi.fn(), +})); +vi.mock("utils/helpers", () => ({ + default: { error: vi.fn(), errorMessage: vi.fn() }, +})); + +import HandleIntent from "handlers/intent"; +import { promoteSessionPersistence } from "lib/fileSessionPersistence"; +import saveState from "lib/saveState"; +import FileBrowser from "pages/fileBrowser"; + +describe("file session persistence", () => { + beforeEach(() => { + runtime.openFile.mockReset(); + localStorage.clear(); + sessionStorage.clear(); + sessionStorage.setItem("isfilesRestored", "true"); + globalThis.editorManager = { + editor: {}, + files: [], + activeFile: null, + getFile(value, type = "id") { + return this.files.find((file) => file[type] === value); + }, + }; + runtime.openFile.mockImplementation(async (uri, options = {}) => { + const existingFile = globalThis.editorManager.getFile(uri, "uri"); + if (existingFile) { + promoteSessionPersistence(existingFile, options.persistInSession); + globalThis.editorManager.activeFile = existingFile; + return; + } + + const file = createOpenFile(uri, options); + globalThis.editorManager.files.push(file); + globalThis.editorManager.activeFile = file; + }); + }); + + it("persists only a picker document with durable URI access", async () => { + const selectedUri = "content://documents/document/selected"; + const unpersistableUri = "content://documents/document/no-grant"; + const intentUri = "content://external-app/shared/temporary"; + + await FileBrowser.openFile({ + type: "file", + url: selectedUri, + name: "selected.js", + mode: "single", + persistedUriPermission: true, + }); + await FileBrowser.openFile({ + type: "file", + url: unpersistableUri, + name: "no-grant.js", + mode: "single", + persistedUriPermission: false, + }); + await HandleIntent({ + action: "android.intent.action.VIEW", + data: intentUri, + }); + await HandleIntent({ + action: "android.intent.action.VIEW", + data: selectedUri, + }); + + saveState(); + + const restoredUris = JSON.parse(localStorage.files).map( + (file) => file.uri, + ); + expect(restoredUris).toEqual([selectedUri]); + }); + + it("promotes an intent tab when the same document is later selected", async () => { + const uri = "content://documents/document/shared"; + + await HandleIntent({ + action: "android.intent.action.VIEW", + data: uri, + }); + await FileBrowser.openFile({ + type: "file", + url: uri, + name: "shared.js", + mode: "single", + persistedUriPermission: true, + }); + + saveState(); + + expect(JSON.parse(localStorage.files).map((file) => file.uri)).toEqual([ + uri, + ]); + }); + + it("keeps restored folds until an inactive tab is first rendered", () => { + const file = createOpenFile("file:///restored.js", {}); + file.restoredFolds = [ + { fromLine: 2, fromCol: 0, toLine: 5, toCol: 1 }, + ]; + globalThis.editorManager.files.push(file); + + saveState(); + + expect(JSON.parse(localStorage.files)[0].folds).toEqual(file.restoredFolds); + }); + + it("keeps the restored cursor while a remote tab is still loading", () => { + const file = createOpenFile("sftp://example.com/restored.js", {}); + file.loaded = false; + file.loading = true; + file.restoredSelection = { + ranges: [{ from: 25, to: 25 }], + mainIndex: 0, + }; + file.lastScrollTop = 120; + file.lastScrollLeft = 8; + globalThis.editorManager.files.push(file); + globalThis.editorManager.activeFile = file; + + saveState(); + + const savedFile = JSON.parse(localStorage.files)[0]; + expect(savedFile.cursorPos).toEqual(file.restoredSelection); + expect(savedFile.scrollTop).toBe(120); + expect(savedFile.scrollLeft).toBe(8); + }); +}); + +function createOpenFile(uri, options) { + return { + id: `file-${globalThis.editorManager.files.length + 1}`, + uri, + type: "editor", + filename: options.name || uri.split("/").pop(), + pinned: false, + isUnsaved: false, + docVersion: 0, + savedVersion: 0, + cacheVersion: 0, + savedMtime: 1, + diskMtime: 1, + hasDiskConflict: false, + readOnly: false, + SAFMode: options.mode, + deletedFile: false, + session: { + selection: { ranges: [{ from: 0, to: 0 }], mainIndex: 0 }, + }, + lastScrollTop: 0, + lastScrollLeft: 0, + editable: true, + encoding: "UTF-8", + persistInSession: options.persistInSession, + }; +} diff --git a/tests/unit/sftpProfiles.test.js b/tests/unit/sftpProfiles.test.js index eb160a629e..b66dab3d9d 100644 --- a/tests/unit/sftpProfiles.test.js +++ b/tests/unit/sftpProfiles.test.js @@ -31,6 +31,9 @@ describe("SFTP secure profiles", () => { expect(url).toBe("sftp://profile-123/project/file.js"); expect(getSftpProfileId(url)).toBe("profile-123"); expect(getSftpProfileId("sftp://user:secret@example.com/project")).toBeNull(); + expect( + getSftpProfileId("sftp://user:secret@profile-server/project"), + ).toBeNull(); }); it("passes transient form credentials to the encrypted native profile store", async () => { @@ -104,7 +107,7 @@ describe("SFTP secure profiles", () => { "sftp://profile-abcd/project/app.js", ); expect(localStorage.getItem("storageList")).not.toContain("p%40ss"); - expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("1"); + expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("2"); const restoredLegacy = "sftp://other:secret@example.net/"; localStorage.setItem("recentFolders", JSON.stringify([restoredLegacy])); @@ -115,21 +118,178 @@ describe("SFTP secure profiles", () => { ); }); - it("fails closed when a legacy URL cannot be encrypted", async () => { + it("reuses the folder profile for legacy expansion-state keys", async () => { + const saveProfile = vi.fn(); + globalThis.sftp = { + saveProfile, + }; + const expandedFolder = + "sftp://user:secret@example.com/project/src/components"; + localStorage.setItem( + "folders", + JSON.stringify([ + { + url: "sftp://profile-existing/project", + opts: { listState: { [expandedFolder]: true } }, + }, + ]), + ); + + await migrateLegacySftpProfiles(); + + const folders = JSON.parse(localStorage.getItem("folders")); + expect(folders[0].opts.listState).toEqual({ + "sftp://profile-existing/project/src/components": true, + }); + expect(saveProfile).not.toHaveBeenCalled(); + expect(localStorage.getItem("folders")).not.toContain("secret"); + }); + + it("uses one new profile for a legacy folder and its expansion state", async () => { + const saveProfile = vi.fn((...args) => args.at(-2)("profile-folder")); + globalThis.sftp = { saveProfile }; + const root = "sftp://user:secret@example.com/project"; + const expandedFolder = + "sftp://user:stale-secret@example.com/project/src"; + localStorage.setItem( + "folders", + JSON.stringify([ + { + opts: { listState: { [expandedFolder]: true } }, + url: root, + }, + ]), + ); + + await migrateLegacySftpProfiles(); + + const folders = JSON.parse(localStorage.getItem("folders")); + expect(folders[0]).toMatchObject({ + url: "sftp://profile-folder/project", + opts: { + listState: { "sftp://profile-folder/project/src": true }, + }, + }); + expect(saveProfile).toHaveBeenCalledTimes(1); + }); + + it("drops URL-shaped object keys when their profile cannot migrate", async () => { globalThis.sftp = { saveProfile: (...args) => args.at(-1)("Keystore unavailable"), }; + const legacyKey = "sftp://user:secret@example.com/project/src"; + localStorage.setItem( + "fileBrowserState", + JSON.stringify([{ [legacyKey]: true }]), + ); + + const result = await migrateLegacySftpProfiles(); + + expect(JSON.parse(localStorage.getItem("fileBrowserState"))).toEqual([{}]); + expect(localStorage.getItem("fileBrowserState")).not.toContain("secret"); + expect(result).toMatchObject({ + removedReferences: 1, + failures: [ + { + hostname: "example.com", + username: "user", + message: "Keystore unavailable", + }, + ], + }); + }); + + it("removes failed connections and recovers unsaved remote files", async () => { + globalThis.sftp = { + saveProfile: (...args) => + args.at(-1)(new Error("Keystore unavailable for secret")), + }; const legacy = "sftp://user:secret@example.com/"; localStorage.setItem( "storageList", JSON.stringify([{ storageType: "sftp", url: legacy }]), ); + localStorage.setItem("recentFiles", JSON.stringify([`${legacy}app.js`])); + localStorage.setItem( + "files", + JSON.stringify([ + { + id: "cached-unsaved-file", + uri: `${legacy}draft.js`, + filename: "draft.js", + isUnsaved: true, + }, + { + id: "clean-remote-file", + uri: `${legacy}saved.js`, + filename: "saved.js", + isUnsaved: false, + }, + ]), + ); + + const result = await migrateLegacySftpProfiles(); + const files = JSON.parse(localStorage.getItem("files")); + + expect(JSON.parse(localStorage.getItem("storageList"))).toEqual([]); + expect(JSON.parse(localStorage.getItem("recentFiles"))).toEqual([]); + expect(files).toHaveLength(1); + expect(files[0]).toMatchObject({ + id: "cached-unsaved-file", + uri: null, + filename: "Recovered draft.js", + isUnsaved: true, + deletedFile: true, + }); + expect(JSON.stringify(files)).not.toContain("secret"); + expect(result).toMatchObject({ + removedReferences: 4, + recoveredFiles: 1, + }); + expect(result.failures).toEqual([ + { + hostname: "example.com", + username: "user", + message: "Keystore unavailable for [redacted]", + }, + ]); + expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("2"); + }); + + it("scrubs malformed legacy SFTP values instead of marking them migrated", async () => { + globalThis.sftp = { saveProfile: vi.fn() }; + localStorage.setItem( + "recentFiles", + JSON.stringify([ + "sftp:///missing-host", + "sftp://user:%E0%A4%A@example.com/bad-encoding", + ]), + ); - await expect(migrateLegacySftpProfiles()).rejects.toThrow( - "SFTP credentials could not be moved to encrypted native storage", + const result = await migrateLegacySftpProfiles(); + + expect(JSON.parse(localStorage.getItem("recentFiles"))).toEqual([]); + expect(result.failures[0].message).toBe( + "The saved SFTP address is incomplete", ); + expect(result.failures[1].message).toBe("URI malformed"); + expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("2"); + }); + + it("deletes an app-owned legacy key copy when its profile cannot migrate", async () => { + globalThis.sftp = { + saveProfile: (...args) => args.at(-1)("Private key is unreadable"), + }; + const legacy = + "sftp://user@example.com/?keyFile=file%3A%2F%2F%2Fdata%2Fid_rsa&passPhrase=key-secret"; + localStorage.setItem( + "storageList", + JSON.stringify([{ storageType: "sftp", url: legacy }]), + ); + + await migrateLegacySftpProfiles(); - expect(JSON.parse(localStorage.getItem("storageList"))[0].url).toBe(legacy); - expect(localStorage.getItem("sftpNativeProfileMigration")).toBeNull(); + expect(JSON.parse(localStorage.getItem("storageList"))).toEqual([]); + expect(deleteMock).toHaveBeenCalledTimes(1); }); }); diff --git a/tests/unit/variableVirtualList.test.js b/tests/unit/variableVirtualList.test.js new file mode 100644 index 0000000000..ed1e0c70d7 --- /dev/null +++ b/tests/unit/variableVirtualList.test.js @@ -0,0 +1,194 @@ +// @vitest-environment happy-dom + +import { describe, expect, it } from "vitest"; +import VariableVirtualList from "components/virtualList/variable"; + +function createList() { + const container = document.createElement("div"); + Object.defineProperty(container, "clientHeight", { + configurable: true, + value: 200, + }); + document.body.append(container); + return { container, list: new VariableVirtualList(container) }; +} + +describe("VariableVirtualList", () => { + it("retains all items while mounting only the viewport window", () => { + const { container, list } = createList(); + const elements = Array.from({ length: 1000 }, (_, index) => { + const element = document.createElement("div"); + element.textContent = `message-${index}`; + list.append(element); + return element; + }); + + list.render(); + + expect(list.length).toBe(1000); + expect(list.mountedCount).toBeLessThan(40); + expect(elements[999].isConnected).toBe(true); + expect(elements[0].isConnected).toBe(false); + + list.stickToBottom = false; + container.scrollTop = 0; + list.render(); + expect(elements[0].isConnected).toBe(true); + expect(elements[999].isConnected).toBe(false); + + list.destroy(); + container.remove(); + }); + + it("updates variable measurements and clears the retained model", () => { + const { container, list } = createList(); + const element = document.createElement("div"); + list.append(element); + list.render(); + + list.updateHeight(list.items[0], 96); + list.rebuildOffsets(); + expect(list.offsets).toEqual([0, 96]); + + list.clear(); + expect(list.length).toBe(0); + expect(list.mountedCount).toBe(0); + expect(container.scrollTop).toBe(0); + + list.destroy(); + container.remove(); + }); + + it("preserves an inline footer outside the virtualized rows", () => { + const container = document.createElement("div"); + Object.defineProperty(container, "clientHeight", { + configurable: true, + value: 200, + }); + document.body.append(container); + const footer = document.createElement("form"); + footer.textContent = "REPL prompt"; + const list = new VariableVirtualList(container, { footer }); + + list.append(document.createElement("div")); + list.render(); + expect(container.lastElementChild).toBe(footer); + + list.clear(); + expect(container.lastElementChild).toBe(footer); + expect(footer.isConnected).toBe(true); + + list.destroy(); + container.remove(); + }); + + it("includes the footer height when pinning and rendering the bottom", () => { + const container = document.createElement("div"); + Object.defineProperties(container, { + clientHeight: { configurable: true, value: 200 }, + scrollHeight: { configurable: true, value: 5304 }, + }); + document.body.append(container); + const footer = document.createElement("form"); + footer.getBoundingClientRect = () => ({ height: 104 }); + const list = new VariableVirtualList(container, { + footer, + overscan: 0, + }); + for (let index = 0; index < 100; index++) { + list.append(document.createElement("div")); + } + + list.render(); + + expect(list.renderedRange.start).toBe(98); + expect(list.renderedRange.end).toBe(100); + expect(container.scrollTop).toBe(5104); + expect(container.lastElementChild).toBe(footer); + + list.destroy(); + container.remove(); + }); + + it("keeps a pinned footer visible when the viewport height changes", () => { + let viewportHeight = 200; + const container = document.createElement("div"); + Object.defineProperties(container, { + clientHeight: { + configurable: true, + get: () => viewportHeight, + }, + scrollHeight: { configurable: true, value: 5304 }, + }); + document.body.append(container); + const footer = document.createElement("form"); + footer.getBoundingClientRect = () => ({ height: 104 }); + const list = new VariableVirtualList(container, { footer }); + for (let index = 0; index < 100; index++) { + list.append(document.createElement("div")); + } + list.render(); + expect(container.scrollTop).toBe(5104); + + viewportHeight = 100; + list.onResize([ + { + target: container, + contentRect: { height: viewportHeight }, + }, + ]); + list.render(); + + expect(list.stickToBottom).toBe(true); + expect(container.scrollTop).toBe(5204); + + list.destroy(); + container.remove(); + }); + + it("pre-paints a larger guard before touch momentum starts", () => { + const { container, list } = createList(); + for (let index = 0; index < 1000; index++) { + list.append(document.createElement("div")); + } + list.stickToBottom = false; + container.scrollTop = 10000; + list.render(); + const idleCount = list.mountedCount; + + container.dispatchEvent(new Event("touchstart")); + + expect(list.dynamicOverscan).toBe(list.activeOverscan); + expect(list.mountedCount).toBeGreaterThan(idleCount); + + list.destroy(); + container.remove(); + }); + + it("keeps overlapping rows mounted during incremental scrolling", () => { + const { container, list } = createList(); + Object.defineProperty(container, "scrollHeight", { + configurable: true, + value: 10400, + }); + const elements = Array.from({ length: 200 }, () => { + const element = document.createElement("div"); + list.append(element); + return element; + }); + list.stickToBottom = false; + container.scrollTop = 520; + list.render(); + const retained = elements[10]; + expect(retained.isConnected).toBe(true); + + container.scrollTop = 624; + container.dispatchEvent(new Event("scroll")); + + expect(retained.isConnected).toBe(true); + expect(list.dynamicOverscan).toBeGreaterThan(list.overscan); + + list.destroy(); + container.remove(); + }); +}); diff --git a/tests/unit/webview.test.js b/tests/unit/webview.test.js new file mode 100644 index 0000000000..2d08ea3a81 --- /dev/null +++ b/tests/unit/webview.test.js @@ -0,0 +1,71 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const { nativeBridge } = vi.hoisted(() => ({ + nativeBridge: { + setMessageCallback: vi.fn(), + create: vi.fn(), + evaluate: vi.fn(), + destroy: vi.fn(), + }, +})); + +vi.mock("../../src/plugins/webview/www/webview", () => ({ + default: nativeBridge, +})); + +import webviewAPI from "lib/webview"; + +describe("WebView lifecycle", () => { + beforeEach(() => { + vi.clearAllMocks(); + nativeBridge.create.mockResolvedValue("webview-1"); + nativeBridge.evaluate.mockResolvedValue("result"); + nativeBridge.destroy.mockResolvedValue(undefined); + }); + + it("keeps the instance usable when native destruction fails", async () => { + const webview = await webviewAPI.create(); + nativeBridge.destroy.mockRejectedValueOnce(new Error("native failure")); + + await expect(webview.destroy()).rejects.toThrow("native failure"); + await expect(webview.evaluate("1 + 1")).resolves.toBe("result"); + expect(nativeBridge.evaluate).toHaveBeenCalledWith("webview-1", "1 + 1"); + + await expect(webview.destroy()).resolves.toBeUndefined(); + expect(nativeBridge.destroy).toHaveBeenCalledTimes(2); + }); + + it("marks the instance destroyed only after native destruction succeeds", async () => { + const webview = await webviewAPI.create(); + + await webview.destroy(); + + await expect(webview.evaluate("1 + 1")).rejects.toThrow( + "WebView has been destroyed", + ); + }); + + it("shares native destruction between concurrent callers", async () => { + let resolveDestroy; + nativeBridge.destroy.mockImplementationOnce( + () => + new Promise((resolve) => { + resolveDestroy = resolve; + }), + ); + const webview = await webviewAPI.create(); + + const firstDestroy = webview.destroy(); + const secondDestroy = webview.destroy(); + + expect(nativeBridge.destroy).toHaveBeenCalledTimes(1); + resolveDestroy(); + await expect(Promise.all([firstDestroy, secondDestroy])).resolves.toEqual([ + undefined, + undefined, + ]); + await expect(webview.evaluate("1 + 1")).rejects.toThrow( + "WebView has been destroyed", + ); + }); +}); diff --git a/webpack.config.js b/webpack.config.js index 8767eaa8f6..2fbead728b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -110,6 +110,7 @@ module.exports = (env, options) => { entry: { main: './src/main.js', console: './src/lib/console.js', + consoleWorker: './src/lib/consoleWorker.js', searchInFilesWorker: './src/sidebarApps/searchInFiles/worker.js', searchIndexWorker: './src/sidebarApps/searchInFiles/indexWorker.js', }, diff --git a/www/index.html b/www/index.html index 07f170909f..78fbbfd2b2 100644 --- a/www/index.html +++ b/www/index.html @@ -141,12 +141,26 @@ ); } + function isStorageError(reason) { + if (!reason) return false; + return ( + reason.name === "FileError" || + reason.name === "NotFoundError" || + reason.name === "SecurityError" || + (typeof window.FileError !== "undefined" && + reason instanceof window.FileError) + ); + } + function handleStartupError(event) { if (!isStartupLoading()) return; var message = event && event.message ? event.message : "Startup error"; setStartupMessage( - "Acode failed to start. Update Android System WebView or Chrome. " + - message + isStorageError(event && event.error) + ? "Acode failed to start: storage is unavailable. Try restarting your device, or clearing the app data. " + + message + : "Acode failed to start. Update Android System WebView or Chrome. " + + message ); } @@ -156,8 +170,11 @@ var message = reason && reason.message ? reason.message : "Startup promise failed"; setStartupMessage( - "Acode failed to start. Update Android System WebView or Chrome. " + - message + isStorageError(reason) + ? "Acode failed to start: storage is unavailable. Try restarting your device, or clearing the app data. " + + message + : "Acode failed to start. Update Android System WebView or Chrome. " + + message ); } From 1c2ee150cf885c01ba39fba3722f87ccf9a45c8d Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Tue, 8 Sep 2026 11:07:47 +0530 Subject: [PATCH 8/9] fix: lang --- src/lang/ln-ln.json | 1722 ++++++++++++++++++++++--------------------- 1 file changed, 877 insertions(+), 845 deletions(-) diff --git a/src/lang/ln-ln.json b/src/lang/ln-ln.json index b86fe9d345..684602f84b 100644 --- a/src/lang/ln-ln.json +++ b/src/lang/ln-ln.json @@ -1,846 +1,878 @@ { - "lang": "Lingala", - "about": "Mpo na yango", - "active files": "Ba fichier efungwami", - "alert": "Likebisi", - "app theme": "Motó ya application", - "autocorrect": "Pesa nzela na bobongisi ya automatique ?", - "autosave": "Kobomba yango moko", - "cancel": "Tika", - "change language": "Bobongola monoko", - "choose color": "Pona langi moko", - "clear": "Longola", - "close app": "Kanga app ?", - "commit message": "Nsango ya commit", - "console": "Konsole", - "copy": "Kopi", - "create folder error": "Ekoki, te kosala dossier ya sika.", - "cut": "Kata", - "delete": "Longola", - "dependencies": "Ba dépendance", - "delay": "Ntango ya kozela na millisecondes", - "editor settings": "Paramɛtrɛ ya mobongisi", - "editor theme": "Motó ya mobongisi", - "enter file name": "Koma nkombo ya fichier", - "enter folder name": "Koma nkombo ya dossier", - "empty folder message": "Dossier ezali mpamba", - "enter line number": "Koma nimero ya ligne", - "error": "Libunga", - "failed": "Elongi te", - "file already exists": "Fichier ezali déjà", - "file already exists force": "Fichier ezali déjà. Kokoma lisusu?", - "file changed": " has been changed, reload file?", - "file deleted": "Fichier elongolami", - "file is not supported": "Fichier oyo esungami te", - "file not supported": "Lolenge ya fichier oyo esungami te.", - "file too large": "Fichier ezali monene mingi mpo na kosalela yango. Bonene ya likolo ezali {size}", - "file renamed": "Nkombo ya fichier ebongwani", - "file saved": "Fichier ebombami", - "folder added": "Dossier ebakisami", - "folder already added": "Dossier ebakisami déjà", - "font size": "Bonene ya makomi", - "goto": "Kende na ligne", - "icons definition": "Ndimbola ya bilembo", - "info": "Sango", - "invalid value": "Valeur ezali malamu te", - "language changed": "Monoko ebongwani malamu", - "linting": "Tala libunga ya syntaxe", - "logout": "Bima", - "loading": "Ezali kokɔtisa", - "my profile": "Profil na ngai", - "new file": "Fichier ya sika", - "new folder": "Dossier ya sika", - "no": "Te", - "no editor message": "Fungola to sala fichier mpe dossier ya sika na menu", - "not set": "Etamwisami te", - "unsaved files close app": "Ba fichiers mosusu ebombami nanu te. Kanga application?", - "notice": "Mayebisi", - "open file": "Fungola fichier", - "open files and folders": "Fungola ba fichiers mpe ba dossiers", - "open folder": "Fungola dossier", - "open recent": "Fungola oyo euti kosalelama sika", - "ok": "OK", - "overwrite": "Koma likolo", - "paste": "Kangisa", - "preview mode": "Mode ya botali liboso", - "read only file": "Ekoki te kobomba fichier ya kotanga kaka. Meká Bomba lokola", - "reload": "Zongisa", - "rename": "Pesa kombo mosusu", - "replace": "Zongisa na esika", - "required": "Esika oyo esengeli kotondisama", - "run your web app": "Tambwisa application web na yo", - "save": "Bomba", - "saving": "Ezali kobomba", - "save as": "Bomba lokola", - "save file to run": "Bomba fichier oyo liboso ya kotambwisa yango na navigateur", - "search": "Luka", - "see logs and errors": "Tala ba logs mpe mabunga", - "select folder": "Pona dossier", - "settings": "Paramɛtrɛ", - "settings saved": "Paramɛtrɛ ebombami", - "show line numbers": "Lakisa mituya ya ba lignes", - "show hidden files": "Lakisa ba fichiers oyo ebombami", - "show spaces": "Lakisa ba espaces", - "soft tab": "Tab ya pete", - "sort by name": "Tanda na kotalela kombo", - "success": "Esalemi malamu", - "tab size": "Bonene ya tab", - "text wrap": "Kokanga milongo ya makomi", - "theme": "Motema ya app", - "title-listfiles": "Tanga ba fichiers", - "Ekoki te kolongola fichier": "unable to delete file", - "unable to open file": "Limbisa, ekoki te kofungola fichier", - "unable to open folder": "Limbisa, ekoki te kofungola dossier", - "unable to save file": "Limbisa, ekoki te kobomba fichier", - "unable to rename": "Limbisa, ekoki te kobongola kombo", - "unsaved file": "Fichier oyo ebombami te, kanga yango kaka?", - "warning": "Likebisi", - "use emmet": "Salela Emmet", - "use quick tools": "Salela bisaleli ya mbangu", - "yes": "Iyo", - "encoding": "Encodage ya makomi", - "syntax highlighting": "Kopesa balangi na syntaxe", - "read only": "Kotanga kaka", - "select all": "Pona nyonso", - "select branch": "Pona branche", - "create new branch": "Sala branche ya sika", - "use branch": "Salela branche", - "new branch": "Branche ya sika", - "branch": "Branch", - "key bindings": "Ba raccourcis ya clavier", - "edit": "Bobongisi", - "reset": "Zongisa na ebandeli", - "color": "Langi", - "select word": "Pona liloba", - "quick tools": "Bisaleli ya mbangu", - "select": "Pona", - "editor font": "Police ya éditeur", - "new project": "Projet ya sika", - "format": "Lolenge", - "project name": "Kombo ya projet", - "unsupported device": "Appareil na yo endimi thème te.", - "vibrate on tap": "Vibrer ntango ozali kofina", - "copy command is not supported by ftp.": "Commande ya kopi esungami te na FTP.", - "support title": "Sunga Acode", - "fullscreen": "Ekran mobimba", - "animation": "Botambwisi", - "backup": "Kopi ya libateli", - "restore": "Zongisa", - "backup successful": "Backup esalemi malamu", - "invalid backup file": "Fichier ya backup ezali malamu te", - "add path": "Bakisa nzela", - "live autocompletion": "Autocomplétion ya mbala moko", - "file properties": "Bizaleli ya fichier", - "path": "Nzela", - "type": "Lolenge", - "word count": "Motango ya maloba", - "line count": "Motango ya milɔngɔ", - "last modified": "Ebongisami mbala ya nsuka", - "size": "Bonene", - "share": "Kabola", - "show print margin": "Lakisa marge ya impression", - "login": "Kota", - "scrollbar size": "Bonene ya barre ya kokitisa", - "cursor controller size": "Bonene ya contrôleur ya curseur", - "none": "Eloko moko te", - "small": "Moke", - "large": "Monene", - "confirm on exit": "Kondimisa liboso ya kobima", - "show console": "Lakisa console", - "image": "Elilingi", - "insert file": "Kotisa fichier", - "insert color": "Kotisa langi", - "powersave mode warning": "Kanga mode ya kobomba nguya mpo na kotala na navigateur ya libanda.", - "exit": "Bima", - "custom": "Ya moto", - "reset warning": "Oza na ntembe te ete olingi kozongisa thème na ebandeli?", - "theme type": "Lolenge ya thème", - "light": "Pole", - "dark": "Molili", - "file browser": "Navigateur ya ba fichiers", - "operation not permitted": "Opération epesami nzela te", - "no such file or directory": "Fichier to dossier yango ezali te", - "input/output error": "Libunga ya entrée/sortie", - "permission denied": "Ndingisa eboyami", - "bad address": "Adresse ezali malamu te", - "file exists": "Fichier ezali", - "not a directory": "Ezali dossier te", - "is a directory": "Ezali dossier", - "invalid argument": "Argument ezali malamu te", - "too many open files in system": "Ba fichiers mingi efungwami na système", - "too many open files": "Ba fichiers mingi efungwami", - "text file busy": "Fichier ya makomi ezali kosalelama", - "no space left on device": "Esika etikali te na appareil", - "read-only file system": "Système ya fichiers ya kotanga kaka", - "file name too long": "Kombo ya fichier ezali molai mingi", - "too many users": "Basaleli bazali mingi", - "connection timed out": "Ntango ya connexion esili", - "connection refused": "Connexion eboyami", - "owner died": "Nkolo akufi", - "an error occurred": "Libunga moko esalemi", - "add ftp": "Bakisa FTP", - "add sftp": "Bakisa SFTP", - "save file": "Bomba fichier", - "save file as": "Bomba fichier lokola", - "files": "Ba fichiers", - "help": "Lisungi", - "file has been deleted": "{file} has been deleted!", - "feature not available": "Makoki oyo ezali te.", - "feature available in paid version": "Makoki oyo ezali kaka na version ya kofuta ya application.", - "deleted file": "Fichier elongolami", - "line height": "Molai ya ligne", - "preview info": "Soki olingi kosala fichier oyo ezali kosala, finá mpe simbá elembo ya kobɛta.", - "manage all files": "Pesa Acode nzela ya kokamba ba fichiers nyonso na paramètres mpo na kobongisa ba fichiers na appareil na yo na pete.", - "close file": "Kanga fichier", - "reset connections": "Zongisa ba connexions", - "check file changes": "Tala mbongwana ya fichier", - "open in browser": "Fungola na navigateur", - "desktop mode": "Mode ordinateur", - "toggle console": "Bongola console", - "new line mode": "Mode ya ligne ya sika", - "add a storage": "Bakisa esika ya kobomba", - "rate acode": "Pesa Acode note", - "support": "Lisungi", - "downloading file": "Ezali kokitisa {file}", - "downloading...": "Ezali kokɔtisa...", - "folder name": "Kombo ya dossier", - "keyboard mode": "Mode ya clavier", - "normal": "Ya momesano", - "app settings": "Paramɛtrɛ ya application", - "disable in-app-browser caching": "Kanga cache ya navigateur ya kati ya application", - "copied to clipboard": "Ekopedami na presse-papier", - "clipboard not available": "Clipboard ezali te.", - "remember opened files": "Kanisa ba fichiers oyo efungwamaki", - "remember opened folders": "Kanisa ba dossiers oyo efungwamaki", - "no suggestions": "Ba suggestions ezali te", - "no suggestions aggressive": "Ba suggestions ya makasi ezali te", - "install": "Tia", - "installing": "Ezali kotia...", - "plugins": "Ba plugins", - "recently used": "Esalelami kala mingi te", - "update": "Bongisa", - "uninstall": "Longola", - "download acode pro": "Kokitisa Acode Pro", - "loading plugins": "Ezali kokɔtisa ba plugins", - "diagonal scrolling": "Kokita na diagonal", - "reverse scrolling": "Kokita na ngámbo ya inverse", - "formatter": "Formatter", - "format on save": "Sala format tango ya kobomba", - "remove ads": "Longola bapub", - "faqs": "Mituna oyo etunamaka mingi", - "feedback": "Makanisi", - "header": "Motó ya likoló", - "sidebar": "Barre ya pembeni", - "inapp": "Inapp", - "browser": "Navigateur", - "fast": "Nokí", - "slow": "Malɛmbɛ", - "scroll settings": "Paramɛtrɛ ya kokita", - "scroll speed": "Mbangu ya kokita", - "loading...": "Ezali kokɔtisa...", - "no plugins found": "Plugin moko te ezwami", - "name": "Kombo", - "username": "Kombo ya mosaleli", - "ekoki kozala te": "optional", - "hostname": "Hostname", - "password": "Liloba ya sekele", - "security type": "Lolenge ya libateli", - "connection mode": "Mode ya connexion", - "port": "Port", - "key file": "Fichier ya fungola", - "select key file": "Pona fichier ya fungola", - "passphrase": "Maloba ya sekele", - "connecting...": "Ezali kokangisa...", - "type filename": "Koma kombo ya fichier", - "unable to load files": "Ekoki te kokɔtisa ba fichiers", - "preview port": "Port ya botali liboso", - "find file": "Luka fichier", - "system": "Sistɛmi", - "please select a formatter": "Pona formatter moko", - "case sensitive": "Kotalela makomi minene mpe mike", - "regular expression": "Regular expression", - "whole word": "Liloba mobimba", - "edit with": "Bongisa na", - "open with": "Fungola na", - "no app found to handle this file": "Application moko te ezwami mpo na kofungola fichier oyo", - "restore default settings": "Zongisa ba paramɛtrɛ ya liboso", - "server port": "Port ya serveur", - "preview settings": "Ba paramɛtrɛ ya botali liboso", - "preview settings note": "Soki port ya preview mpe port ya serveur ekeseni, application ekobanda serveur te mpe ekofungola https://: na navigateur to navigateur ya kati ya application. Yango ezali na tina soki ozali kosalela serveur esika mosusu.", - "backup/restore note": "It will only backup your settings, custom theme, installed plugins and key bindings. It will not backup your FTP/SFTP or App state.", - "host": "Host", - "retry ftp/sftp when fail": "Meka FTP/SFTP lisusu soki elongi te", - "more": "Mosusu", - "thank you :)": "Matondi :)", - "Kosomba ezali kozela": "Kosomba ezali kozela", - "Ebengami": "Ebengami", - "local": "Ya mboka", - "remote": "Ya mosika", - "show console toggler": "Lakisa bouton ya console", - "binary file": "Fichier oyo ezali na ba données binaires, olingi kofungola yango?", - "relative line numbers": "Mituya ya ba lignes na kotalela ligne oyo ezali sikoyo", - "elastic tabstops": "Ba tab stops oyo ebongwanaka", - "line based rtl switching": "Kobongola RTL na kotalela ligne", - "hard wrap": "Kokanga ligne na makasi", - "spellcheck": "Kotala mabunga ya makomi", - "wrap method": "Lolenge ya kokanga milongo", - "use textarea for ime": "Salela textarea mpo na IME", - "invalid plugin": "Plugin ezali malamu te", - "type command": "Koma command", - "plugin": "Plugin", - "quicktools trigger mode": "Lolenge ya kofungola bisaleli ya mbangu", - "print margin": "Marge ya impression", - "touch move threshold": "Limite ya mouvement ya touch", - "info-retryremotefsafterfail": "Meka lisusu connexion FTP/SFTP soki elongi te.", - "info-fullscreen": "Bomba barre ya motó na écran ya ebandeli.", - "info-checkfiles": "Tala mbongwana ya ba fichiers ntango application ezali na nsima.", - "info-console": "Pona console ya JavaScript. Console Legacy ezali ya liboso, mpe Eruda ezali console ya bato mosusu.", - "info-keyboardmode": "Keyboard mode for text input, no suggestions will hide suggestions and auto correct. If no suggestions does not work, try to change value to no suggestions aggressive.", - "info-rememberfiles": "Kanisa ba fichiers oyo efungwami ntango application ekangami.", - "info-rememberfolders": "Kanisa ba dossiers oyo efungwami ntango application ekangami.", - "info-floatingbutton": "Lakisa to bomba bouton flottant ya bisaleli ya mbangu.", - "info-openfilelistpos": "Esika ya kolakisa liste ya ba fichiers oyo ezali kosala.", - "info-touchmovethreshold": "Soki sensibilite ya touch ya appareil na yo ezali makasi mingi, bakisa motuya oyo mpo na kopekisa mouvement ya touch oyo esalemi na libunga.", - "info-scroll-settings": "Ba paramɛtrɛ oyo ezali na ba paramètres ya kokita, bakisa mpe kokanga milongo ya makomi.", - "info-animation": "Soki application ezali kosala malɛmbɛ, kangá animation.", - "info-quicktoolstriggermode": "Soki bouton ya bisaleli ya mbangu ezali kosala te, meká kobongola motuya oyo.", - "info-checkForAppUpdates": "Tala automatiquement soki ba mises à jour ya application ezali.", - "info-quickTools": "Lakisa to bomba ba outils ya noki.", - "info-showHiddenFiles": "Lakisa ba fichiers mpe ba dossiers oyo ebombami. (Bandaka na .)", - "info-listFiles": "Tanga automatiquement ba fichiers nyonso ntango dossier efungwami", - "info-all_file_access": "Pesa terminal accès na /sdcard mpe /storage.", - "info-fontSize": "Bonene ya makomi oyo esalelamaka mpo na kolakisa makomi.", - "info-fontFamily": "Lolenge ya makomi oyo esalelamaka mpo na kolakisa makomi.", - "info-theme": "Motó ya couleur ya terminal.", - "info-cursorStyle": "Lolenge ya curseur ntango terminal ezali na focus.", - "info-cursorInactiveStyle": "Lolenge ya curseur ntango terminal ezali na focus te.", - "info-fontWeight": "Bonene ya makomi oyo esalelamaka mpo na makomi oyo ezali minene te.", - "info-cursorBlink": "Soki curseur ekoti mpe ebimi.", - "info-scrollback": "Motango ya milongo oyo ebombamaka na terminal ntango ozali kokita.", - "info-tabStopWidth": "Bonene ya ba tab stops na terminal.", - "info-letterSpacing": "Esika oyo ezali kati ya makomi.", - "info-imageSupport": "Soki terminal ekoki kosala na bililingi.", - "info-fontLigatures": "Soki ba ligatures ya makomi efungwami na terminal.", - "info-confirmTabClose": "Senga kondimisa liboso ya kokanga ba onglets ya terminal.", - "info-backup": "Sala backup ya terminal.", - "info-restore": "Zongisa backup ya terminal.", - "info-uninstall": "Longola terminal.", - "owned": "Ezali ya ngai", - "api_error": "Serveur ya API ezali kosala te, meká lisusu nsima ya mwa ntango.", - "installed": "Etyami", - "all": "Nyonso", - "medium": "Ya kati-kati", - "refund": "Kozongisa mbongo", - "product not available": "Produit ezali te", - "no-product-info": "Produit oyo ezali te na mboka na yo sikoyo, meká lisusu na nsima.", - "close": "Kanga", - "explore": "Tala makambo mosusu", - "key bindings updated": "Ba raccourcis ya clavier ebongwani", - "search in files": "Luka na kati ya ba fichiers", - "exclude files": "Longola ba fichiers", - "include files": "Bakisa ba fichiers", - "search result": "{matches} ba résultats na {files} ba fichiers.", - "invalid regex": "Regex ezali na libunga: {message}.", - "bottom": "Na nse", - "save all": "Bomba nyonso", - "close all": "Kanga nyonso", - "unsaved files warning": "Ba fichiers mosusu ebombami nanu te. Finá 'OK' pona kopona nini osala, to 'Cancel' pona kozonga.", - "save all warning": "Oza na ntembe te ete olingi kobomba ba fichiers nyonso mpe kokanga yango? Likambo oyo ekoki kozongisama nsima te.", - "save all changes warning": "Oza na ntembe te ete olingi kobomba mbongwana nyonso ya ba fichiers?", - "close all warning": "Oza na ntembe te ete olingi kokanga ba fichiers nyonso? Mbongwana oyo ebombami te ekobunga mpe likambo oyo ekoki kozongisama nsima te.", - "refresh": "Zongisa", - "shortcut buttons": "Ba boutons ya raccourci", - "no result": "Eyano ezali te", - "searching...": "Koluka...", - "quicktools:ctrl-key": "Fungola ya Control/Command", - "quicktools:tab-key": "Fungola tab", - "quicktools:shift-key": "Fungola Shift", - "quicktools:undo": "Zongisa nsima", - "quicktools:redo": "Zongisa lisusu", - "quicktools:search": "Luka na fichier", - "quicktools:save": "Bomba fichier", - "quicktools:esc-key": "Fungola Escape", - "quicktools:curlybracket": "Kotisa ba accolade", - "quicktools:squarebracket": "Kotisa ba parenthèses carrées", - "quicktools:parentheses": "Kotisa ba parenthèse", - "quicktools:anglebracket": "Kotisa ba parenthèses angulaires", - "quicktools:left-arrow-key": "Flèche ya mwasi", - "quicktools:right-arrow-key": "Flèche ya mobali", - "quicktools:up-arrow-key": "Flèche likolo", - "quicktools:down-arrow-key": "Flèche na nse", - "quicktools:moveline-up": "Tombola ligne likolo", - "quicktools:moveline-down": "Kitisa ligne na nse", - "quicktools:copyline-up": "Kopi ligne likolo", - "quicktools:copyline-down": "Kopi ligne na nse", - "quicktools:semicolon": "Kotisa elembo ya point-virgule", - "quicktools:quotation": "Kotisa elembo ya citation", - "quicktools:and": "Kotisa elembo ya mpe", - "quicktools:bar": "Kotisa elembo ya barre", - "quicktools:equal": "Kotisa elembo ya ekokani", - "quicktools:slash": "Kotisa elembo ya slash", - "quicktools:exclamation": "Kotisa elembo ya exclamation", - "quicktools:alt-key": "Alt", - "quicktools:meta-key": "Windows/Meta", - "quicktools:search-prev": "Match oyo eleki", - "quicktools:search-next": "Match oyo elandi", - "quicktools:search-settings": "Ba paramɛtrɛ ya boluki", - "quicktools:search-replace": "Zongisa", - "quicktools:search-replace-all": "Zongisa nyonso", - "info-quicktoolssettings": "Bongisa ba boutons ya shortcuts mpe ba touches ya clavier na esika ya Quicktools oyo ezali na nse ya éditeur mpo na kobongisa ndenge ya kosala code.", - "info-excludefolders": "Salelá modèle **/node_modules/** mpo na koboya ba fichiers nyonso ya dossier node_modules. Ba fichiers yango ekomonana te na liste mpe ekosala te na boluki ya ba fichiers.", - "missed files": "Ba fichiers {count} etalelami nsima ya kobanda boluki mpe ekotisami te na boluki.", - "remove": "Longola", - "quicktools:command-palette": "Palette ya mitindo", - "default file encoding": "Encodage ya fichier ya liboso", - "remove entry": "Oza na ntembe te ete olingi kolongola '{name}' na ba chemins oyo ebombami? Koboma chemin yango moko te.", - "delete entry": "Ndima koboma: '{name}'. Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", - "change encoding": "Fungola lisusu '{file}' na encodage '{encoding}'? Likambo oyo ekobungisa mbongwana nyonso oyo ebombami nanu te. Olingi kokoba?", - "reopen file": "Oza na ntembe te ete olingi kofungola lisusu '{file}'? Mbongwana nyonso oyo ebombami nanu te ekobunga.", - "plugin min version": "{name} ezali kaka na Acode - {v-code} mpe ba versions ya likolo. Finá awa mpo na kosala mbongwana.", - "color preview": "Botali liboso ya langi", - "confirm": "Kondimisa", - "problems": "Mikakatano", - "show side buttons": "Lakisa ba boutons ya pembeni", - "bug_report": "Tinda rapɔ́rɛ ya libunga", - "verified publisher": "Mobimisi oyo andimami", - "most_downloaded": "Ekitisami mingi", - "newly_added": "Ebakisami sika", - "top_rated": "Oyo etangami malamu mingi", - "rename not supported": "Kobongola kombo na dossier ya Termux yango esungami te", - "compress": "Kokitisa bonene", - "copy uri": "Kopi URI", - "delete entries": "Oza na ntembe te ete olingi kolongola biloko {count}?", - "deleting items": "Kolongola biloko {count}...", - "import project zip": "Kokɔtisa projet (zip)", - "changelog": "Mbongwana ya version", - "notifications": "Mayebisi", - "no_unread_notifications": "Ezali na ba notifications oyo etángami te te", - "should_use_current_file_for_preview": "Esengeli kosalela fichier oyo ezali sikoyo mpo na preview na esika ya index.html ya liboso.", - "fade fold widgets": "Kokitisa polele ba widgets ya fold", - "quicktools:home-key": "Home", - "quicktools:end-key": "End", - "quicktools:pageup-key": "PageUp", - "quicktools:pagedown-key": "PageDown", - "quicktools:delete-key": "Longola", - "quicktools:tilde": "Kotisa elembo ya tilde", - "quicktools:backtick": "Kotisa backtick", - "quicktools:hash": "Kotisa elembo ya hash", - "quicktools:dollar": "Kotisa elembo ya dollar", - "quicktools:modulo": "Kotisa elembo ya modulo/pourcentage", - "quicktools:caret": "Kotisa elembo ya caret", - "plugin_enabled": "Plugin efungwami", - "plugin_disabled": "Plugin ekangami", - "enable_plugin": "Fungola plugin oyo", - "disable_plugin": "Kanga plugin oyo", - "open_source": "Open source", - "terminal settings": "Paramɛtrɛ ya terminal", - "font ligatures": "Ba ligatures ya makomi", - "letter spacing": "Espace kati ya balɛ́tɛ́lɛ", - "terminal:tab stop width": "Bonene ya tab stop", - "terminal:scrollback": "Milongo ya scrollback", - "terminal:cursor blink": "Kongenga ya curseur", - "terminal:font weight": "Bonene ya makomi", - "terminal:cursor inactive style": "Lolenge ya curseur oyo ezali inactif", - "terminal:cursor style": "Lolenge ya curseur", - "terminal:font family": "Libota ya makomi", - "terminal:convert eol": "Bongola suka ya ligne", - "terminal:confirm tab close": "Ndima kokanga onglet ya terminal", - "terminal:image support": "Lisungi ya bililingi", - "terminal": "Terminal", - "terminal not installed prompt": "Terminal etyá te. Olingi kobanda yango sikawa ?", - "terminal first launch prompt": "Environnement ya terminal etyá te. Ezali kopesa yo nzela ya kosalela ba commands, SSH mpe ba scripts. Olingi kotya yango sikawa ?", - "allFileAccess": "Accès na ba fichiers nyonso", - "fonts": "Makomi", - "sponsor": "Kosalisa", - "downloads": "Ba téléchargements", - "reviews": "Ba avis", - "overview": "Botali ya mobimba", - "contributors": "Bato oyo basalisaki", - "quicktools:hyphen": "Kotisa trait d'union", - "check for app updates": "Tala ba mises à jour ya application", - "prompt update check consent message": "Acode ekoki kotala ba mises à jour ya application ntango ozali na internet. Olingi kofungola botali ya ba mises à jour?", - "keywords": "Maloba ya ntina", - "author": "Mokomi", - "filtered by": "Eponami na", - "clean install state": "Ezalela ya installation ya pamba", - "backup created": "Backup esalemi", - "restore completed": "Zongisi esili", - "restore will include": "Oyo ekozongisa", - "restore warning": "Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", - "reload to apply": "Zongisa mpo na kosalela mbongwana?", - "reload app": "Kozongisa application", - "preparing backup": "Kobongisa backup", - "collecting settings": "Kozwa ba paramɛtrɛ", - "collecting key bindings": "Kozwa ba raccourcis", - "collecting plugins": "Kozwa makambo ya ba plugin", - "creating backup": "Kosala fichier ya backup", - "validating backup": "Kotalela backup", - "restoring key bindings": "Kozongisa ba raccourcis", - "restoring plugins": "Kozongisa ba plugins", - "restoring settings": "Kozongisa ba paramɛtrɛ", - "legacy backup warning": "Oyo ezali format ya backup ya kala. Ba fonctionnalités mosusu ekoki kozala limitées.", - "checksum mismatch": "Makambo ya checksum ekokani te - fichier ya backup ekoki kozala ebongisami to ebebisami.", - "plugin not found": "Plugin ezwami te na registre", - "paid plugin skipped": "Plugin ya kofuta - kosomba ezwami te", - "source not found": "Fichier source ezali lisusu te", - "restored": "Ezongisami", - "skipped": "Eleki", - "backup not valid object": "Fichier ya backup ezali objet ya malamu te", - "backup no data": "Fichier ya backup ezali na ba données ya kozongisa te", - "backup legacy warning": "Oyo ezali format ya backup ya kala (v1). Ba fonctionnalités mosusu ekoki kozala limitées.", - "backup missing metadata": "Ba informations ya backup ezali te - makambo mosusu ekoki kozanga.", - "backup checksum mismatch": "Checksum ekokani te - fichier ya backup ekoki kozala ebongwani to ebebi. Keba liboso ya kokoba.", - "backup checksum verify failed": "Kotalisa checksum elongi te", - "backup invalid settings": "Format ya ba paramɛtrɛ ezali na libunga", - "backup invalid keybindings": "Format ya ba keyboard shortcuts ezali na libunga", - "backup invalid plugins": "Format ya ba plugins oyo etiemami ezali na libunga", - "issues found": "Mikakatano emonani", - "error details": "Makambo ya libunga", - "active tools": "Bisaleli oyo ezali kosala", - "available tools": "Ba outils oyo ezali", - "recent": "Ba fichiers ya sika", - "command palette": "Fungola menu ya ba commandes", - "change theme": "Bobongola motó", - "documentation": "Mikanda ya lisungi", - "open in terminal": "Fungola na terminal", - "developer mode": "Mode ya developer", - "info-developermode": "Fungola ba outils ya developer (Eruda) pona ko déboguer ba plugins mpe kotala ezalela ya application. Inspecteur ekofungwama tango application ebandi.", - "developer mode enabled": "Mode ya developer efungwami. Salela palette ya mitindo mpo na kofungola to kokanga inspecteur (Ctrl+Shift+I).", - "developer mode disabled": "Mode ya developer ekangami", - "copy relative path": "Kopi nzela relatif", - "shortcut request sent": "Bosengi ya raccourci etindami. Finá Ajouter mpo na kosilisa.", - "add to home screen": "Bakisa na écran d'accueil", - "pin shortcuts not supported": "Ba shortcuts ya écran d'accueil esimbami te na appareil oyo.", - "save file before home shortcut": "Bomba fichier liboso ya kobakisa yango na écran d'accueil.", - "terminal_required_message_for_lsp": "Terminal ezali installed te. Install terminal liboso mpo na kosalela ba serveurs LSP.", - "shift click selection": "Poná na Shift + click", - "earn ad-free time": "Zwa ntango kozanga bapub", - "indent guides": "Ba guide ya kokɔtisa molɔngɔ", - "language servers": "Ba serveurs ya monoko", - "lint gutter": "Lakisa ba erreurs ya lint", - "rainbow brackets": "Ba parenthèses ya balangi", - "lsp-add-custom-server": "Bakisa serveur personnalisé", - "lsp-binary-args": "Ba arguments ya binaire (JSON array)", - "lsp-binary-command": "Command ya binaire", - "lsp-binary-path-optional": "Nzela ya binaire (ekoki kozala te)", - "lsp-check-command-optional": "Command ya kotala (option ya kobongola)", - "lsp-checking-installation-status": "Kotala ezalela ya installation...", - "lsp-configured": "Ebongisami", - "lsp-custom-server-added": "Serveur personnalisé ebakisami", - "lsp-default": "Ya liboso", - "lsp-details-line": "Makambo: {details}", - "lsp-edit-initialization-options": "Bongola ba options ya kobanda", - "lsp-empty": "Ezali mpamba", - "lsp-enabled": "Efongwami", - "lsp-error-add-server-failed": "Ekoki te kobakisa serveur.", - "lsp-error-args-must-be-array": "Ba arguments esengeli kozala tableau ya JSON", - "lsp-error-binary-command-required": "Command binary esengeli", - "lsp-error-language-id-required": "Esengeli kozala na ID moko ya monoko ata moko", - "lsp-error-package-required": "Esengeli kozala na package ata moko", - "lsp-error-server-id-required": "ID ya serveur esengeli", - "lsp-feature-completion": "Kosilisa code automatiquement", - "lsp-feature-completion-info": "Fungola ba suggestions ya autocomplete oyo ewutaka na serveur.", - "lsp-feature-diagnostics": "Botali mabunga", - "lsp-feature-diagnostics-info": "Lakisa ba erreurs mpe ba avertissements oyo ewutaka na serveur ya langue.", - "lsp-feature-formatting": "Bobongisi format", - "lsp-feature-formatting-info": "Fungola formatage ya code oyo ewutaka na serveur ya langue.", - "lsp-feature-hover": "Makambo ya code", - "lsp-feature-hover-info": "Lakisa ba informations ya type mpe documentation tango ozali kosala hover.", - "lsp-feature-inlay-hints": "Bilembo ya lisungi", - "lsp-feature-inlay-hints-info": "Lakisa ba informations ya lolenge ya code na kati ya éditeur.", - "lsp-feature-signature": "Lisungi ya signature", - "lsp-feature-signature-info": "Lakisa ba indications ya ba paramɛtrɛ ya fonction tango ozali kokoma.", - "lsp-feature-state-toast": "{feature} {state}", - "lsp-initialization-options": "Ba options ya kobanda", - "lsp-initialization-options-json": "Ba options ya kobanda (JSON)", - "lsp-initialization-options-updated": "Ba options ya kobanda ebongwani", - "lsp-install-command": "Command ya installation", - "lsp-install-command-unavailable": "Command ya installation ezali te.", - "lsp-install-info-check-failed": "Acode ekoki te kotala soki installation esili malamu.", - "lsp-install-info-missing": "Serveur ya monoko etiemami te na environnement ya terminal.", - "lsp-install-info-ready": "Serveur ya monoko etiemami mpe ezali prêt.", - "lsp-install-info-unknown": "Ezalela ya installation ekoki kotala yango automatiquement te.", - "lsp-install-info-version-available": "Version {version} ezali.", - "lsp-install-notification": "{server} language server is not installed. Tap to install.", - "lsp-install-method-apk": "Package APK", - "lsp-install-method-cargo": "Package Cargo", - "lsp-install-method-manual": "Binaire ya mabɔkɔ", - "lsp-install-method-npm": "Package npm", - "lsp-install-method-pip": "Package pip", - "lsp-install-method-shell": "Shell personnalisé", - "lsp-install-method-title": "Lolenge ya installation", - "lsp-install-repair": "Kotia / kobongisa", - "lsp-installation-status": "Ezalela ya installation", - "lsp-installed": "Eteni", - "lsp-invalid-timeout": "Motuya ya timeout ezali na libunga", - "lsp-language-ids": "Ba ID ya monoko (ekabolami na virgule)", - "lsp-packages-prompt": "Ba packages {method} (ekabwani na virgule)", - "lsp-remove-installed-files": "Longola ba fichiers installés pona {server}?", - "lsp-server-disabled-toast": "Serveur ekangami", - "lsp-server-enabled-toast": "Serveur efungwami", - "lsp-server-id": "ID ya serveur", - "lsp-server-label": "Kombo ya serveur", - "lsp-server-not-found": "Serveur ezwami te", - "lsp-server-uninstalled": "Serveur elongolami", - "lsp-startup-timeout": "Ntango ya kozela na ebandeli", - "lsp-startup-timeout-ms": "Ntango ya kozela na ebandeli (millisecondes)", - "lsp-startup-timeout-set": "Ntango ya kozela etiamisami na {timeout} ms", - "lsp-state-disabled": "ekangami", - "lsp-state-enabled": "efungwami", - "lsp-status": "Ezalela", - "lsp-status-check-failed": "Kotalela elongi te", - "lsp-status-installed": "Eteni", - "lsp-status-installed-version": "Etyami ({version})", - "lsp-status-line": "Ezali: {status}", - "lsp-status-not-installed": "Etyami te", - "lsp-status-unknown": "Eyebani te", - "lsp-timeout-ms": "{timeout} ms", - "lsp-uninstall-command-unavailable": "Command ya kolongola ezali te", - "lsp-uninstall-notification": "Finá mpo na kolongola serveur ya monoko {server}.", - "lsp-uninstall-server": "Longola serveur", - "lsp-update-command-optional": "Command ya mbongwana (option ya kobongisa)", - "lsp-update-command-unavailable": "Command ya mbongwana ezali te.", - "lsp-update-server": "Mbongwana ya serveur", - "lsp-version-line": "Version: {version}", - "lsp-view-initialization-options": "Talá ba options ya kobanda", - "settings-category-about-acode": "Mpo na Acode", - "settings-category-discover-apps": "Tala ba applications mosusu", - "settings-category-advanced": "Ya likolo", - "settings-category-assistance": "Lisungi", - "settings-category-core": "Paramɛtrɛ ya moboko", - "settings-category-cursor": "Curseur", - "settings-category-cursor-selection": "Curseur mpe kopona", - "settings-category-custom-servers": "Ba serveurs oyo ebongisami na moto", - "settings-category-customization-tools": "Bobongisi mpe bisaleli", - "settings-category-display": "Emoniseli", - "settings-category-editing": "Bobongisi", - "settings-category-features": "Makoki", - "settings-category-files-sessions": "Ba fichiers mpe ba sessions", - "settings-category-fonts": "Makomi", - "settings-category-general": "Ya monene", - "settings-category-guides-indicators": "Ba guides mpe bilembo", - "settings-category-installation": "Botie", - "settings-category-interface": "Interface", - "settings-category-maintenance": "Bobongisi mpe bobateli", - "settings-category-permissions": "Ndingisa", - "settings-category-preview": "Botali liboso", - "settings-category-scrolling": "Kokita", - "settings-category-server": "Serveur", - "settings-category-servers": "Ba serveurs", - "settings-category-session": "Session", - "settings-category-support-acode": "Sunga Acode", - "settings-category-text-layout": "Bobongisi ya makomi", - "settings-info-app-animation": "Kamba ba animation ya transition na kati ya application nyonso.", - "settings-info-app-check-files": "Zongisa ba éditeur soki ba fichier ebongwani libanda ya Acode.", - "settings-info-app-clean-install-state": "Longola ezalela ya installation oyo ebombami mpo na setup.", - "settings-info-app-confirm-on-exit": "Senga kondimisa liboso ya kokanga application.", - "settings-info-app-console": "Pona console ya débogage oyo Acode esalela.", - "settings-info-app-default-file-encoding": "Encodage ya liboso tango ya kofungola to kosala ba fichier.", - "settings-info-app-exclude-folders": "Longola ba dossier mpe ba modèle tango ya koluka.", - "settings-info-app-floating-button": "Lakisa bouton flottant ya ba actions ya noki.", - "settings-info-app-font-manager": "Kotia, kokamba to kolongola ba polices ya application.", - "settings-info-app-fullscreen": "Bomba barre ya système ntango ozali kosalela Acode.", - "settings-info-app-keybindings": "Bongola fichier ya ba raccourcis to zongisa yango na ndenge ya liboso.", - "settings-info-app-keyboard-mode": "Pona ndenge clavier ya logiciel esalaka ntango ozali kobongisa code.", - "settings-info-app-language": "Pona monoko ya application mpe ba labels oyo ebongolami.", - "settings-info-app-open-file-list-position": "Pona esika liste ya ba fichiers actifs ekomonana.", - "settings-info-app-quick-tools-settings": "Bongola molongo mpe ndenge ya ba raccourcis ya ba outils ya mbangu.", - "settings-info-app-quick-tools-trigger-mode": "Pona ndenge ba outils ya noki efungwamaka na touche to na kosimba écran.", - "settings-info-app-remember-files": "Fungola lisusu ba fichiers oyo ezalaki ya kofungwama mbala ya suka.", - "settings-info-app-remember-folders": "Fungola lisusu ba dossiers ya session oyo eleki.", - "settings-info-app-retry-remote-fs": "Meka lisusu ba opérations ya fichiers distants nsima ya transfert oyo elongi te.", - "settings-info-app-side-buttons": "Lakisa ba boutons ya actions ya kobakisa pembeni ya éditeur.", - "settings-info-app-sponsor-sidebar": "Lakisa sponsor na sidebar.", - "settings-info-app-touch-move-threshold": "Mouvement moke oyo esengeli liboso ya koyeba déplacement ya touch.", - "settings-info-app-vibrate-on-tap": "Fungola vibration ya appareil tango ozali kosimba ba boutons mpe ba contrôles.", - "settings-info-editor-autosave": "Bomba mbongwana automatiquement nsima ya mwa ntango.", - "settings-info-editor-color-preview": "Tala ba valeur ya langi na kati ya éditeur.", - "settings-info-editor-fade-fold-widgets": "Kitisa pole ya bilembo ya fold soki esengeli te.", - "settings-info-editor-font-family": "Pona lolenge ya police oyo esalelami na éditeur.", - "settings-info-editor-font-size": "Bongola bonene ya makomi ya éditeur.", - "settings-info-editor-format-on-save": "Sala formatage tango nyonso fichier ebombami.", - "settings-info-editor-hard-wrap": "Kotisa ba saut ya ligne ya solo na esika ya kaka kokanga yango na komona.", - "settings-info-editor-indent-guides": "Lakisa ba lignes ya guide ya indentation.", - "settings-info-editor-line-height": "Bongola espace ya likolo mpe ya se kati ya ba ligne.", - "settings-info-editor-line-numbers": "Lakisa mituya ya ba lignes pembeni ya éditeur.", - "settings-info-editor-lint-gutter": "Lakisa ba erreurs, ba diagnostics mpe ba marqueurs ya lint pembeni ya éditeur.", - "settings-info-editor-live-autocomplete": "Lakisa ba suggestions ntango ozali kokoma.", - "settings-info-editor-rainbow-brackets": "Pesa balangisi ya langi na ba crochet oyo ekokani na profondeur.", - "settings-info-editor-relative-line-numbers": "Lakisa distance uta na ligne oyo ozali kosalela.", - "settings-info-editor-rtl-text": "Bongola ndenge ya kokoma droite na gauche mpo na ligne moko na moko.", - "settings-info-editor-scroll-settings": "Bongola bonene ya barre ya défilement, vitesse mpe ndenge ya kosalela yango.", - "settings-info-editor-shift-click-selection": "Bakisa sélection na Shift + kosimba to kofina.", - "settings-info-editor-show-spaces": "Lakisa bilembo oyo emonisaka ba espaces mpe ba saut ya ligne.", - "settings-info-editor-soft-tab": "Kotisa ba espaces na esika ya ba caractères tab.", - "settings-info-editor-tab-size": "Pona motango ya ba espaces oyo tab moko esalela.", - "settings-info-editor-teardrop-size": "Bongola bonene ya poignée ya curseur mpo na édition na touch.", - "settings-info-editor-text-wrap": "Kanga ba ligne milayi na kati ya éditeur.", - "settings-info-lsp-add-custom-server": "Bakisa serveur ya langue personnalisé na ba commandes ya installation, mbongwana mpe lancement.", - "settings-info-lsp-edit-init-options": "Bongola ba options ya kobanda lokola JSON.", - "settings-info-lsp-install-server": "Kotia to kobongisa serveur oyo ya langue.", - "settings-info-lsp-server-enabled": "Kofungola to kokanga serveur oyo ya monoko.", - "settings-info-lsp-startup-timeout": "Pona tango oyo Acode ekoki kozela mpo serveur ebanda.", - "settings-info-lsp-uninstall-server": "Longola ba paquets to ba fichiers exécutables oyo ebombami mpo na serveur oyo.", - "settings-info-lsp-update-server": "Kobongisa serveur oyo ya monoko soki lolenge ya kobongisa ezali.", - "settings-info-lsp-view-init-options": "Tala ba options ya kobanda oyo ezali kosala lokola JSON.", - "settings-info-main-ad-rewards": "Tala ba publicité mpo na kozwa accès sans publicité mpo na mwa tango.", - "settings-info-main-app-settings": "Monoko, ndenge application esalaka mpe ba outils ya accès rapide.", - "settings-info-main-backup-restore": "Bimisa ba paramɛtrɛ na backup to zongisa yango sima.", - "settings-info-main-changelog": "Tala ba mbongwana ya sika mpe ba notes ya version.", - "settings-info-main-edit-settings": "Bongola fichier settings.json brut directement.", - "settings-info-main-editor-settings": "Ba police, ba tabs, ba suggestions mpe ndenge éditeur emonanaka.", - "settings-info-main-formatter": "Pona formatter pona langage moko na moko oyo esungami.", - "settings-info-main-lsp-settings": "Bongisa ba serveur ya monoko mpe mayele ya éditeur.", - "settings-info-main-plugins": "Tambwisa ba plugins oyo etiemi mpe misala na yango.", - "settings-info-main-preview-settings": "Mode ya preview, ba port ya serveur mpe ndenge navigateur esalaka.", - "settings-info-main-rateapp": "Pesa Acode note na Google Play.", - "settings-info-main-remove-ads": "Fungola accès ya libela sans publicité.", - "settings-info-main-reset": "Zongisa Acode na ba paramètres ya liboso.", - "settings-info-main-sponsors": "Sunga bokoli ya Acode oyo ezali kokoba.", - "settings-info-main-terminal-settings": "Motó ya terminal, police, curseur mpe ndenge session esalaka.", - "settings-info-main-theme": "Motó ya application, contraste mpe ba langi oyo ebongisami.", - "settings-info-preview-disable-cache": "Zongisa ntango nyonso makambo ya sika na navigateur ya kati ya application.", - "settings-info-preview-host": "Nkombo ya hôte oyo esalelami ntango URL ya preview efungwami.", - "settings-info-preview-mode": "Pona esika preview ekofungwama ntango obandi yango.", - "settings-info-preview-preview-port": "Port oyo serveur ya preview na tango ya solo esalelaka.", - "settings-info-preview-server-port": "Port oyo serveur ya kati ya application esalelaka.", - "settings-info-preview-show-console-toggler": "Lakisa bouton ya console na preview.", - "settings-info-preview-use-current-file": "Pona liboso fichier oyo ezali sikoyo ntango obandi preview.", - "settings-info-terminal-convert-eol": "Bongola ba suka ya ba lignes ntango ozali kokanga to kolakisa makambo ya terminal.", - "settings-note-formatter-settings": "Pesa formatter na monoko moko na moko. Installer ba plugins ya formatter mpo na kozwa ba options mosusu.", - "settings-note-lsp-settings": "Ba serveurs ya langue ebakisaka autocomplete, diagnostics, ba informations ya hover mpe makambo mosusu. Esalaka malamu mingi na ba dossiers oyo terminal intégré ya Acode ekoki kokoma directement, lokola ba dossiers terminal/public. Ba emplacements SAF, externes mpe distants etikalamaka na libanda automatiquement mpo bakoki kosalela ba chemins ya cache to virtuels; activer option ya compatibilité kaka soki olingi komeka yango.", - "search result label singular": "mbano", - "search result label plural": "mbano", - "pin tab": "Kangisa onglet", - "unpin tab": "Longola onglet na biloko ekangami", - "pinned tab": "Onglet ekangami", - "unpin tab before closing": "Longola tab na pin liboso ya kokanga yango.", - "app font": "Makomi ya application", - "settings-info-app-font-family": "Pona police oyo esalelami na interface mobimba ya application.", - "lsp-transport-method-stdio": "STDIO (bandisa commande ya binaire)", - "lsp-transport-method-websocket": "WebSocket (kota na URL ws/wss)", - "lsp-websocket-url": "URL ya WebSocket", - "lsp-websocket-server-managed-externally": "Serveur oyo etambwisami libanda na nzela ya WebSocket.", - "lsp-error-websocket-url-invalid": "URL ya WebSocket esengeli kobanda na ws:// to wss://", - "lsp-error-websocket-url-required": "URL ya WebSocket esengeli", - "lsp-remove-custom-server": "Longola serveur personnalisé", - "lsp-remove-custom-server-confirm": "Longola serveur personnalisé ya langage {server}?", - "lsp-custom-server-removed": "Serveur personnalisé elongolami", - "settings-info-lsp-remove-custom-server": "Longola serveur ya langue personnalisé oyo na Acode.", - "unsaved selected tabs warning": "Ba tabs mosusu oyo oponi ebombami nanu te. Pona nini osengeli kosala.", - "save selected tabs": "Bomba ba onglets oyo oponi", - "close selected tabs": "Kanga ba onglets oyo oponi", - "save selected tabs warning": "Oza na ntembe te ete olingi kobomba mpe kokanga ba tabs oyo oponi?", - "close selected tabs warning": "Oza na ntembe te ete olingi kokanga ba tabs oyo oponi? Mbongwana oyo ebombami nanu te ekobunga mpe likambo oyo ekoki kozongisama te.", - "close tabs to right": "Kanga oyo ezali na droite", - "close tabs to left": "Kanga oyo ezali na gauche", - "close other tabs": "Kanga ba onglets mosusu", - "auto close tags": "Kanga ba tags automatiquement", - "settings-info-editor-auto-close-tags": "Kotisa automatiquement ba balises ya kokanga na HTML, XML, Vue, Angular mpe PHP.", - "ui zoom": "Zoom ya interface", - "settings-info-app-ui-zoom": "Bongola bonene ya makomi na interface mobimba ya Acode.", - "plugin-not-supported": "Plugin oyo endimami te", - "plugin-not-supported-info": "Plugin esalemaki pona version ya kala ya Acode.", - "login-to-view": "Kota na compte mpo na komona yango...", - "show share button": "Lakisa bouton ya kokabola", - "settings-info-editor-show-share-button": "Lakisa bouton ya partage na menu ya sélection.", - "iap-plugin-purchase-warning": "Ba plugins oyo osombi ebongisami te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", - "iap-pro-purchase-warning": "Bosombi oyo ekobongisama te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", - "confirm-login": "Okoti nanu te na Acode, olingi kokota sikoyo?", - "local word completion": "Bobongisi ya maloba ya fichier", - "language package completion": "Bobongisi ya package ya lokota", - "settings-info-editor-local-word-completion": "Pesa ba suggestions ya maloba oyo ezali na fichier oyo ozali kosalela.", - "settings-info-editor-language-completion": "Pesaka ba mots ya ntina, ba snippets mpe ba suggestions ya CodeMirror.", - "terminal:failsafe-info": "Bandisa terminal na shell ya système", - "auto rename tags": "Bongola kombo ya ba tags automatiquement", - "settings-info-editor-auto-rename-tags": "Bongola kombo ya balise oyo ekokani tango ozali kobongisa ba balise ya HTML.", - "copying items": "Kokopa biloko {count}...", - "cannot paste folder into itself": "Okoki te ko coller dossier na kati na yango moko", - "folder already exists": "Dossier ezali déjà", - "file already exists force named": "'{name}' ezali deja. Olingi kokoma likolo na yango?", - "lsp-allow-non-terminal-workspace": "Tika LSP esala na ba dossiers ya libanda", - "settings-info-lsp-allow-non-terminal-workspace": "Pesa nzela na ba serveur ya monoko mpo na SAF, bisika ya libanda mpe bisika ya mosika. LSP esalaka na terminal ya kati ya Acode, yango ekoki kosala ete makambo mosusu esalaka malamu te.", - "don't ask again": "Kotuna lisusu te", - "scrollbar height": "Molai ya barre ya bokitisaka", - "full": "Mobimba", - "scroll past end": "Koba kokita koleka suka", - "settings-info-scroll-past-end": "Bakisa esika ya pamba na nse ya éditeur mpo okoka komema molongo ya suka likolo.", - "compact": "Kokómisa mokuse", - "off": "Ekangami", - "quick tools height": "Molai ya bisaleli ya mbangu", - "quick tools toggler": "Bascule ya bisaleli ya mbangu", - "running processes": "Ba processus oyo ezali kosala", - "recommend extensions": "Tinda ba extensions", - "settings-info-editor-recommend-extensions": "Pesaka ba plugins tango fichier efungwami lokola texte pamba mpo na kozanga mode ya monoko.", - "extension recommendation title": "Ba extensions ezali mpo na {extension}", - "extension recommendation message": "Mode ya syntax etiemami te mpo na {extension}. Luka ba plugins mpo na \"{keyword}\".", - "extension request title": "Extension ezwamaki te mpo na {extension}", - "extension request message": "Senga plugin mpo Acode ekoka kolakisa lolenge oyo ya fichier.", - "search plugins": "Luka ba plugins", - "request plugin": "Senga plugin", - "terminal:block": "Bloc", - "terminal:underline": "Mokomi na nse", - "terminal:bar": "Barre", - "terminal:inactive block": "Bloc", - "terminal:inactive underline": "Mokomi na nse", - "terminal:inactive bar": "Barre", - "terminal:inactive none": "Eloko moko te", - "terminal:normal": "Ya momesano", - "terminal:bold": "Makomi minene", - "quicktools-trigger:click": "Finá", - "quicktools-trigger:touch": "Kosimba", - "settings-info-terminal-uninstall": "Oza na ntembe te ete olingi kolongola terminal?", - "terminal:inactive outline": "Ndelo", - "restored successfully": "Terminal ezongisami na elonga", - "uninstalled successfully": "Terminal elongolami na elonga", - "enter plugin source": "Kota source ya plugin", - "enter keywords": "Kota ba maloba ya ntina", - "enter author name": "Kota kombo ya mokomi", - "update available": "Mbongwana ya sika ezali", - "update available info": "Acode {version} ezali sikoyo! Finá awa mpo na kotala yango.", - "plugin updates": "Ba mbongwana ya ba plugins", - "plugin updates singular": "Plugin 1 ezali na version ya sika.", - "plugin updates plural": "Ba plugins {count} ezali na ba versions ya sika.", - "just now": "Sikawa kaka", - "day singular": "Eleki mokolo {count}", - "hour singular": "Eleki ngonga {count}", - "min singular": "Eleki miniti {count}", - "day plural": "Eleki mikolo {count}", - "hour plural": "Eleki bangonga {count}", - "min plural": "Eleki baminiti {count}", - "settings-category-builtin-servers": "Ba serveurs oyo etongami na kati", - "settings-category-plugin-servers": "Ba serveurs ya ba plugins", - "new name": "Kombo ya sika", - "enter new name": "Koma kombo ya sika", - "code actions": "Misala ya code", - "active processes": "Ba processus oyo ezali kosala", - "total memory": "Mémoire mobimba", - "uptime": "Ntango ya mosala", - "note": "Likebisi", - "acode main process": "Processus monene ya Acode", - "ppid parent": "PPID (Moboti)", - "unknown": "Eyebani te", - "just started": "Ebandi sikawa", - "diff days": "Eleki mikolo {days}, bangonga {hr}", - "diff hr": "Eleki {hr}h {min}m", - "diff min": "Eleki {min}m {sec}s", - "diff sec": "Eleki {sec}s", - "command": "Mitindo", - "managed": "Etambwisami", - "acode service": "Service ya Acode", - "info-terminal-show-scrollbar": "Lakisa scrollbar ya xterm pembeni ya terminal.", - "terminal:show scrollbar": "Lakisa barre ya défilement", - "apply exclusions when copying": "Salela ba exclusions ntango ozali kokopa", - "settings-info-app-use-file-operation-exclusions": "Pusa ba fichier mpe ba dossier oyo ekokani na ba règles ya exclusion tango ya kopiya mpe kokanga.", - "horizontal scroll margin": "Marge ya kokita na ngámbo", - "settings-info-horizontal-scroll-margin": "Bakisa esika ya pamba nsima ya ligne oyo eleki molai ntango retour à la ligne ezali kosalelama te. Tia motuya mobimba ya pixels oyo ezali négatif te.", - "conflict error": "Matata! Zela liboso ya kosala commit mosusu.", - "terminal:failsafe": "Mode FailSafe", - "app icon": "App icon", - "app icon changed": "App icon changed", - "settings-info-app-icon": "Choose the app icon displayed on your device.", - "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", - "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", - "rewarded ad failed": "The ad could not be completed. Please try again.", - "rewarded ad incomplete": "Finish watching the ad to earn the reward." -} + "lang": "Lingala", + "about": "Mpo na yango", + "active files": "Ba fichier efungwami", + "alert": "Likebisi", + "app theme": "Motó ya application", + "autocorrect": "Pesa nzela na bobongisi ya automatique ?", + "autosave": "Kobomba yango moko", + "cancel": "Tika", + "change language": "Bobongola monoko", + "choose color": "Pona langi moko", + "clear": "Longola", + "close app": "Kanga app ?", + "commit message": "Nsango ya commit", + "console": "Konsole", + "copy": "Kopi", + "create folder error": "Ekoki, te kosala dossier ya sika.", + "cut": "Kata", + "delete": "Longola", + "dependencies": "Ba dépendance", + "delay": "Ntango ya kozela na millisecondes", + "editor settings": "Paramɛtrɛ ya mobongisi", + "editor theme": "Motó ya mobongisi", + "enter file name": "Koma nkombo ya fichier", + "enter folder name": "Koma nkombo ya dossier", + "empty folder message": "Dossier ezali mpamba", + "enter line number": "Koma nimero ya ligne", + "error": "Libunga", + "failed": "Elongi te", + "file already exists": "Fichier ezali déjà", + "file already exists force": "Fichier ezali déjà. Kokoma lisusu?", + "file changed": " has been changed, reload file?", + "file deleted": "Fichier elongolami", + "file is not supported": "Fichier oyo esungami te", + "file not supported": "Lolenge ya fichier oyo esungami te.", + "file too large": "Fichier ezali monene mingi mpo na kosalela yango. Bonene ya likolo ezali {size}", + "file renamed": "Nkombo ya fichier ebongwani", + "file saved": "Fichier ebombami", + "folder added": "Dossier ebakisami", + "folder already added": "Dossier ebakisami déjà", + "font size": "Bonene ya makomi", + "goto": "Kende na ligne", + "icons definition": "Ndimbola ya bilembo", + "info": "Sango", + "invalid value": "Valeur ezali malamu te", + "language changed": "Monoko ebongwani malamu", + "linting": "Tala libunga ya syntaxe", + "logout": "Bima", + "loading": "Ezali kokɔtisa", + "my profile": "Profil na ngai", + "new file": "Fichier ya sika", + "new folder": "Dossier ya sika", + "no": "Te", + "no editor message": "Fungola to sala fichier mpe dossier ya sika na menu", + "not set": "Etamwisami te", + "unsaved files close app": "Ba fichiers mosusu ebombami nanu te. Kanga application?", + "notice": "Mayebisi", + "open file": "Fungola fichier", + "open files and folders": "Fungola ba fichiers mpe ba dossiers", + "open folder": "Fungola dossier", + "open recent": "Fungola oyo euti kosalelama sika", + "ok": "OK", + "overwrite": "Koma likolo", + "paste": "Kangisa", + "preview mode": "Mode ya botali liboso", + "read only file": "Ekoki te kobomba fichier ya kotanga kaka. Meká Bomba lokola", + "reload": "Zongisa", + "rename": "Pesa kombo mosusu", + "replace": "Zongisa na esika", + "required": "Esika oyo esengeli kotondisama", + "run your web app": "Tambwisa application web na yo", + "save": "Bomba", + "saving": "Ezali kobomba", + "save as": "Bomba lokola", + "save file to run": "Bomba fichier oyo liboso ya kotambwisa yango na navigateur", + "search": "Luka", + "see logs and errors": "Tala ba logs mpe mabunga", + "select folder": "Pona dossier", + "settings": "Paramɛtrɛ", + "settings saved": "Paramɛtrɛ ebombami", + "show line numbers": "Lakisa mituya ya ba lignes", + "show hidden files": "Lakisa ba fichiers oyo ebombami", + "show spaces": "Lakisa ba espaces", + "soft tab": "Tab ya pete", + "sort by name": "Tanda na kotalela kombo", + "success": "Esalemi malamu", + "tab size": "Bonene ya tab", + "text wrap": "Kokanga milongo ya makomi", + "theme": "Motema ya app", + "title-listfiles": "Tanga ba fichiers", + "unable to open file": "Limbisa, ekoki te kofungola fichier", + "unable to open folder": "Limbisa, ekoki te kofungola dossier", + "unable to save file": "Limbisa, ekoki te kobomba fichier", + "unable to rename": "Limbisa, ekoki te kobongola kombo", + "unsaved file": "Fichier oyo ebombami te, kanga yango kaka?", + "warning": "Likebisi", + "use emmet": "Salela Emmet", + "use quick tools": "Salela bisaleli ya mbangu", + "yes": "Iyo", + "encoding": "Encodage ya makomi", + "syntax highlighting": "Kopesa balangi na syntaxe", + "read only": "Kotanga kaka", + "select all": "Pona nyonso", + "select branch": "Pona branche", + "create new branch": "Sala branche ya sika", + "use branch": "Salela branche", + "new branch": "Branche ya sika", + "branch": "Branch", + "key bindings": "Ba raccourcis ya clavier", + "edit": "Bobongisi", + "reset": "Zongisa na ebandeli", + "color": "Langi", + "select word": "Pona liloba", + "quick tools": "Bisaleli ya mbangu", + "select": "Pona", + "editor font": "Police ya éditeur", + "new project": "Projet ya sika", + "format": "Lolenge", + "project name": "Kombo ya projet", + "unsupported device": "Appareil na yo endimi thème te.", + "vibrate on tap": "Vibrer ntango ozali kofina", + "copy command is not supported by ftp.": "Commande ya kopi esungami te na FTP.", + "support title": "Sunga Acode", + "fullscreen": "Ekran mobimba", + "animation": "Botambwisi", + "backup": "Kopi ya libateli", + "restore": "Zongisa", + "backup successful": "Backup esalemi malamu", + "invalid backup file": "Fichier ya backup ezali malamu te", + "add path": "Bakisa nzela", + "live autocompletion": "Autocomplétion ya mbala moko", + "file properties": "Bizaleli ya fichier", + "path": "Nzela", + "type": "Lolenge", + "word count": "Motango ya maloba", + "line count": "Motango ya milɔngɔ", + "last modified": "Ebongisami mbala ya nsuka", + "size": "Bonene", + "share": "Kabola", + "show print margin": "Lakisa marge ya impression", + "login": "Kota", + "scrollbar size": "Bonene ya barre ya kokitisa", + "cursor controller size": "Bonene ya contrôleur ya curseur", + "none": "Eloko moko te", + "small": "Moke", + "large": "Monene", + "confirm on exit": "Kondimisa liboso ya kobima", + "show console": "Lakisa console", + "image": "Elilingi", + "insert file": "Kotisa fichier", + "insert color": "Kotisa langi", + "powersave mode warning": "Kanga mode ya kobomba nguya mpo na kotala na navigateur ya libanda.", + "exit": "Bima", + "custom": "Ya moto", + "reset warning": "Oza na ntembe te ete olingi kozongisa thème na ebandeli?", + "theme type": "Lolenge ya thème", + "light": "Pole", + "dark": "Molili", + "file browser": "Navigateur ya ba fichiers", + "operation not permitted": "Opération epesami nzela te", + "no such file or directory": "Fichier to dossier yango ezali te", + "input/output error": "Libunga ya entrée/sortie", + "permission denied": "Ndingisa eboyami", + "bad address": "Adresse ezali malamu te", + "file exists": "Fichier ezali", + "not a directory": "Ezali dossier te", + "is a directory": "Ezali dossier", + "invalid argument": "Argument ezali malamu te", + "too many open files in system": "Ba fichiers mingi efungwami na système", + "too many open files": "Ba fichiers mingi efungwami", + "text file busy": "Fichier ya makomi ezali kosalelama", + "no space left on device": "Esika etikali te na appareil", + "read-only file system": "Système ya fichiers ya kotanga kaka", + "file name too long": "Kombo ya fichier ezali molai mingi", + "too many users": "Basaleli bazali mingi", + "connection timed out": "Ntango ya connexion esili", + "connection refused": "Connexion eboyami", + "owner died": "Nkolo akufi", + "an error occurred": "Libunga moko esalemi", + "add ftp": "Bakisa FTP", + "add sftp": "Bakisa SFTP", + "save file": "Bomba fichier", + "save file as": "Bomba fichier lokola", + "files": "Ba fichiers", + "help": "Lisungi", + "file has been deleted": "{file} has been deleted!", + "feature not available": "Makoki oyo ezali te.", + "feature available in paid version": "Makoki oyo ezali kaka na version ya kofuta ya application.", + "deleted file": "Fichier elongolami", + "line height": "Molai ya ligne", + "preview info": "Soki olingi kosala fichier oyo ezali kosala, finá mpe simbá elembo ya kobɛta.", + "manage all files": "Pesa Acode nzela ya kokamba ba fichiers nyonso na paramètres mpo na kobongisa ba fichiers na appareil na yo na pete.", + "close file": "Kanga fichier", + "reset connections": "Zongisa ba connexions", + "check file changes": "Tala mbongwana ya fichier", + "open in browser": "Fungola na navigateur", + "desktop mode": "Mode ordinateur", + "toggle console": "Bongola console", + "new line mode": "Mode ya ligne ya sika", + "add a storage": "Bakisa esika ya kobomba", + "rate acode": "Pesa Acode note", + "support": "Lisungi", + "downloading file": "Ezali kokitisa {file}", + "downloading...": "Ezali kokɔtisa...", + "folder name": "Kombo ya dossier", + "keyboard mode": "Mode ya clavier", + "normal": "Ya momesano", + "app settings": "Paramɛtrɛ ya application", + "disable in-app-browser caching": "Kanga cache ya navigateur ya kati ya application", + "copied to clipboard": "Ekopedami na presse-papier", + "clipboard not available": "Clipboard ezali te.", + "remember opened files": "Kanisa ba fichiers oyo efungwamaki", + "remember opened folders": "Kanisa ba dossiers oyo efungwamaki", + "no suggestions": "Ba suggestions ezali te", + "no suggestions aggressive": "Ba suggestions ya makasi ezali te", + "install": "Tia", + "installing": "Ezali kotia...", + "plugins": "Ba plugins", + "recently used": "Esalelami kala mingi te", + "update": "Bongisa", + "uninstall": "Longola", + "download acode pro": "Kokitisa Acode Pro", + "loading plugins": "Ezali kokɔtisa ba plugins", + "diagonal scrolling": "Kokita na diagonal", + "reverse scrolling": "Kokita na ngámbo ya inverse", + "formatter": "Formatter", + "format on save": "Sala format tango ya kobomba", + "remove ads": "Longola bapub", + "faqs": "Mituna oyo etunamaka mingi", + "feedback": "Makanisi", + "header": "Motó ya likoló", + "sidebar": "Barre ya pembeni", + "inapp": "Inapp", + "browser": "Navigateur", + "fast": "Nokí", + "slow": "Malɛmbɛ", + "scroll settings": "Paramɛtrɛ ya kokita", + "scroll speed": "Mbangu ya kokita", + "loading...": "Ezali kokɔtisa...", + "no plugins found": "Plugin moko te ezwami", + "name": "Kombo", + "username": "Kombo ya mosaleli", + "hostname": "Hostname", + "password": "Liloba ya sekele", + "security type": "Lolenge ya libateli", + "connection mode": "Mode ya connexion", + "port": "Port", + "key file": "Fichier ya fungola", + "select key file": "Pona fichier ya fungola", + "passphrase": "Maloba ya sekele", + "connecting...": "Ezali kokangisa...", + "type filename": "Koma kombo ya fichier", + "unable to load files": "Ekoki te kokɔtisa ba fichiers", + "preview port": "Port ya botali liboso", + "find file": "Luka fichier", + "system": "Sistɛmi", + "please select a formatter": "Pona formatter moko", + "case sensitive": "Kotalela makomi minene mpe mike", + "regular expression": "Regular expression", + "whole word": "Liloba mobimba", + "edit with": "Bongisa na", + "open with": "Fungola na", + "no app found to handle this file": "Application moko te ezwami mpo na kofungola fichier oyo", + "restore default settings": "Zongisa ba paramɛtrɛ ya liboso", + "server port": "Port ya serveur", + "preview settings": "Ba paramɛtrɛ ya botali liboso", + "preview settings note": "Soki port ya preview mpe port ya serveur ekeseni, application ekobanda serveur te mpe ekofungola https://: na navigateur to navigateur ya kati ya application. Yango ezali na tina soki ozali kosalela serveur esika mosusu.", + "backup/restore note": "It will only backup your settings, custom theme, installed plugins and key bindings. It will not backup your FTP/SFTP or App state.", + "host": "Host", + "retry ftp/sftp when fail": "Meka FTP/SFTP lisusu soki elongi te", + "more": "Mosusu", + "thank you :)": "Matondi :)", + "local": "Ya mboka", + "remote": "Ya mosika", + "show console toggler": "Lakisa bouton ya console", + "binary file": "Fichier oyo ezali na ba données binaires, olingi kofungola yango?", + "relative line numbers": "Mituya ya ba lignes na kotalela ligne oyo ezali sikoyo", + "elastic tabstops": "Ba tab stops oyo ebongwanaka", + "line based rtl switching": "Kobongola RTL na kotalela ligne", + "hard wrap": "Kokanga ligne na makasi", + "spellcheck": "Kotala mabunga ya makomi", + "wrap method": "Lolenge ya kokanga milongo", + "use textarea for ime": "Salela textarea mpo na IME", + "invalid plugin": "Plugin ezali malamu te", + "type command": "Koma command", + "plugin": "Plugin", + "quicktools trigger mode": "Lolenge ya kofungola bisaleli ya mbangu", + "print margin": "Marge ya impression", + "touch move threshold": "Limite ya mouvement ya touch", + "info-retryremotefsafterfail": "Meka lisusu connexion FTP/SFTP soki elongi te.", + "info-fullscreen": "Bomba barre ya motó na écran ya ebandeli.", + "info-checkfiles": "Tala mbongwana ya ba fichiers ntango application ezali na nsima.", + "info-console": "Pona console ya JavaScript. Console Legacy ezali ya liboso, mpe Eruda ezali console ya bato mosusu.", + "info-keyboardmode": "Keyboard mode for text input, no suggestions will hide suggestions and auto correct. If no suggestions does not work, try to change value to no suggestions aggressive.", + "info-rememberfiles": "Kanisa ba fichiers oyo efungwami ntango application ekangami.", + "info-rememberfolders": "Kanisa ba dossiers oyo efungwami ntango application ekangami.", + "info-floatingbutton": "Lakisa to bomba bouton flottant ya bisaleli ya mbangu.", + "info-openfilelistpos": "Esika ya kolakisa liste ya ba fichiers oyo ezali kosala.", + "info-touchmovethreshold": "Soki sensibilite ya touch ya appareil na yo ezali makasi mingi, bakisa motuya oyo mpo na kopekisa mouvement ya touch oyo esalemi na libunga.", + "info-scroll-settings": "Ba paramɛtrɛ oyo ezali na ba paramètres ya kokita, bakisa mpe kokanga milongo ya makomi.", + "info-animation": "Soki application ezali kosala malɛmbɛ, kangá animation.", + "info-quicktoolstriggermode": "Soki bouton ya bisaleli ya mbangu ezali kosala te, meká kobongola motuya oyo.", + "info-checkForAppUpdates": "Tala automatiquement soki ba mises à jour ya application ezali.", + "info-quickTools": "Lakisa to bomba ba outils ya noki.", + "info-showHiddenFiles": "Lakisa ba fichiers mpe ba dossiers oyo ebombami. (Bandaka na .)", + "info-listFiles": "Tanga automatiquement ba fichiers nyonso ntango dossier efungwami", + "info-all_file_access": "Pesa terminal accès na /sdcard mpe /storage.", + "info-fontSize": "Bonene ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-fontFamily": "Lolenge ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-theme": "Motó ya couleur ya terminal.", + "info-cursorStyle": "Lolenge ya curseur ntango terminal ezali na focus.", + "info-cursorInactiveStyle": "Lolenge ya curseur ntango terminal ezali na focus te.", + "info-fontWeight": "Bonene ya makomi oyo esalelamaka mpo na makomi oyo ezali minene te.", + "info-cursorBlink": "Soki curseur ekoti mpe ebimi.", + "info-scrollback": "Motango ya milongo oyo ebombamaka na terminal ntango ozali kokita.", + "info-tabStopWidth": "Bonene ya ba tab stops na terminal.", + "info-letterSpacing": "Esika oyo ezali kati ya makomi.", + "info-imageSupport": "Soki terminal ekoki kosala na bililingi.", + "info-fontLigatures": "Soki ba ligatures ya makomi efungwami na terminal.", + "info-confirmTabClose": "Senga kondimisa liboso ya kokanga ba onglets ya terminal.", + "info-backup": "Sala backup ya terminal.", + "info-restore": "Zongisa backup ya terminal.", + "info-uninstall": "Longola terminal.", + "owned": "Ezali ya ngai", + "api_error": "Serveur ya API ezali kosala te, meká lisusu nsima ya mwa ntango.", + "installed": "Etyami", + "all": "Nyonso", + "medium": "Ya kati-kati", + "refund": "Kozongisa mbongo", + "product not available": "Produit ezali te", + "no-product-info": "Produit oyo ezali te na mboka na yo sikoyo, meká lisusu na nsima.", + "close": "Kanga", + "explore": "Tala makambo mosusu", + "key bindings updated": "Ba raccourcis ya clavier ebongwani", + "search in files": "Luka na kati ya ba fichiers", + "exclude files": "Longola ba fichiers", + "include files": "Bakisa ba fichiers", + "search result": "{matches} ba résultats na {files} ba fichiers.", + "invalid regex": "Regex ezali na libunga: {message}.", + "bottom": "Na nse", + "save all": "Bomba nyonso", + "close all": "Kanga nyonso", + "unsaved files warning": "Ba fichiers mosusu ebombami nanu te. Finá 'OK' pona kopona nini osala, to 'Cancel' pona kozonga.", + "save all warning": "Oza na ntembe te ete olingi kobomba ba fichiers nyonso mpe kokanga yango? Likambo oyo ekoki kozongisama nsima te.", + "save all changes warning": "Oza na ntembe te ete olingi kobomba mbongwana nyonso ya ba fichiers?", + "close all warning": "Oza na ntembe te ete olingi kokanga ba fichiers nyonso? Mbongwana oyo ebombami te ekobunga mpe likambo oyo ekoki kozongisama nsima te.", + "refresh": "Zongisa", + "shortcut buttons": "Ba boutons ya raccourci", + "no result": "Eyano ezali te", + "searching...": "Koluka...", + "quicktools:ctrl-key": "Fungola ya Control/Command", + "quicktools:tab-key": "Fungola tab", + "quicktools:shift-key": "Fungola Shift", + "quicktools:undo": "Zongisa nsima", + "quicktools:redo": "Zongisa lisusu", + "quicktools:search": "Luka na fichier", + "quicktools:save": "Bomba fichier", + "quicktools:esc-key": "Fungola Escape", + "quicktools:curlybracket": "Kotisa ba accolade", + "quicktools:squarebracket": "Kotisa ba parenthèses carrées", + "quicktools:parentheses": "Kotisa ba parenthèse", + "quicktools:anglebracket": "Kotisa ba parenthèses angulaires", + "quicktools:left-arrow-key": "Flèche ya mwasi", + "quicktools:right-arrow-key": "Flèche ya mobali", + "quicktools:up-arrow-key": "Flèche likolo", + "quicktools:down-arrow-key": "Flèche na nse", + "quicktools:moveline-up": "Tombola ligne likolo", + "quicktools:moveline-down": "Kitisa ligne na nse", + "quicktools:copyline-up": "Kopi ligne likolo", + "quicktools:copyline-down": "Kopi ligne na nse", + "quicktools:semicolon": "Kotisa elembo ya point-virgule", + "quicktools:quotation": "Kotisa elembo ya citation", + "quicktools:and": "Kotisa elembo ya mpe", + "quicktools:bar": "Kotisa elembo ya barre", + "quicktools:equal": "Kotisa elembo ya ekokani", + "quicktools:slash": "Kotisa elembo ya slash", + "quicktools:exclamation": "Kotisa elembo ya exclamation", + "quicktools:alt-key": "Alt", + "quicktools:meta-key": "Windows/Meta", + "quicktools:search-prev": "Match oyo eleki", + "quicktools:search-next": "Match oyo elandi", + "quicktools:search-settings": "Ba paramɛtrɛ ya boluki", + "quicktools:search-replace": "Zongisa", + "quicktools:search-replace-all": "Zongisa nyonso", + "info-quicktoolssettings": "Bongisa ba boutons ya shortcuts mpe ba touches ya clavier na esika ya Quicktools oyo ezali na nse ya éditeur mpo na kobongisa ndenge ya kosala code.", + "info-excludefolders": "Salelá modèle **/node_modules/** mpo na koboya ba fichiers nyonso ya dossier node_modules. Ba fichiers yango ekomonana te na liste mpe ekosala te na boluki ya ba fichiers.", + "missed files": "Ba fichiers {count} etalelami nsima ya kobanda boluki mpe ekotisami te na boluki.", + "remove": "Longola", + "quicktools:command-palette": "Palette ya mitindo", + "default file encoding": "Encodage ya fichier ya liboso", + "remove entry": "Oza na ntembe te ete olingi kolongola '{name}' na ba chemins oyo ebombami? Koboma chemin yango moko te.", + "delete entry": "Ndima koboma: '{name}'. Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "change encoding": "Fungola lisusu '{file}' na encodage '{encoding}'? Likambo oyo ekobungisa mbongwana nyonso oyo ebombami nanu te. Olingi kokoba?", + "reopen file": "Oza na ntembe te ete olingi kofungola lisusu '{file}'? Mbongwana nyonso oyo ebombami nanu te ekobunga.", + "plugin min version": "{name} ezali kaka na Acode - {v-code} mpe ba versions ya likolo. Finá awa mpo na kosala mbongwana.", + "color preview": "Botali liboso ya langi", + "confirm": "Kondimisa", + "problems": "Mikakatano", + "show side buttons": "Lakisa ba boutons ya pembeni", + "bug_report": "Tinda rapɔ́rɛ ya libunga", + "verified publisher": "Mobimisi oyo andimami", + "most_downloaded": "Ekitisami mingi", + "newly_added": "Ebakisami sika", + "top_rated": "Oyo etangami malamu mingi", + "rename not supported": "Kobongola kombo na dossier ya Termux yango esungami te", + "compress": "Kokitisa bonene", + "copy uri": "Kopi URI", + "delete entries": "Oza na ntembe te ete olingi kolongola biloko {count}?", + "deleting items": "Kolongola biloko {count}...", + "import project zip": "Kokɔtisa projet (zip)", + "changelog": "Mbongwana ya version", + "notifications": "Mayebisi", + "no_unread_notifications": "Ezali na ba notifications oyo etángami te te", + "should_use_current_file_for_preview": "Esengeli kosalela fichier oyo ezali sikoyo mpo na preview na esika ya index.html ya liboso.", + "fade fold widgets": "Kokitisa polele ba widgets ya fold", + "quicktools:home-key": "Home", + "quicktools:end-key": "End", + "quicktools:pageup-key": "PageUp", + "quicktools:pagedown-key": "PageDown", + "quicktools:delete-key": "Longola", + "quicktools:tilde": "Kotisa elembo ya tilde", + "quicktools:backtick": "Kotisa backtick", + "quicktools:hash": "Kotisa elembo ya hash", + "quicktools:dollar": "Kotisa elembo ya dollar", + "quicktools:modulo": "Kotisa elembo ya modulo/pourcentage", + "quicktools:caret": "Kotisa elembo ya caret", + "plugin_enabled": "Plugin efungwami", + "plugin_disabled": "Plugin ekangami", + "enable_plugin": "Fungola plugin oyo", + "disable_plugin": "Kanga plugin oyo", + "open_source": "Open source", + "terminal settings": "Paramɛtrɛ ya terminal", + "font ligatures": "Ba ligatures ya makomi", + "letter spacing": "Espace kati ya balɛ́tɛ́lɛ", + "terminal:tab stop width": "Bonene ya tab stop", + "terminal:scrollback": "Milongo ya scrollback", + "terminal:cursor blink": "Kongenga ya curseur", + "terminal:font weight": "Bonene ya makomi", + "terminal:cursor inactive style": "Lolenge ya curseur oyo ezali inactif", + "terminal:cursor style": "Lolenge ya curseur", + "terminal:font family": "Libota ya makomi", + "terminal:convert eol": "Bongola suka ya ligne", + "terminal:confirm tab close": "Ndima kokanga onglet ya terminal", + "terminal:image support": "Lisungi ya bililingi", + "terminal": "Terminal", + "terminal not installed prompt": "Terminal etyá te. Olingi kobanda yango sikawa ?", + "terminal first launch prompt": "Environnement ya terminal etyá te. Ezali kopesa yo nzela ya kosalela ba commands, SSH mpe ba scripts. Olingi kotya yango sikawa ?", + "allFileAccess": "Accès na ba fichiers nyonso", + "fonts": "Makomi", + "sponsor": "Kosalisa", + "downloads": "Ba téléchargements", + "reviews": "Ba avis", + "overview": "Botali ya mobimba", + "contributors": "Bato oyo basalisaki", + "quicktools:hyphen": "Kotisa trait d'union", + "check for app updates": "Tala ba mises à jour ya application", + "prompt update check consent message": "Acode ekoki kotala ba mises à jour ya application ntango ozali na internet. Olingi kofungola botali ya ba mises à jour?", + "keywords": "Maloba ya ntina", + "author": "Mokomi", + "filtered by": "Eponami na", + "clean install state": "Ezalela ya installation ya pamba", + "backup created": "Backup esalemi", + "restore completed": "Zongisi esili", + "restore will include": "Oyo ekozongisa", + "restore warning": "Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "reload to apply": "Zongisa mpo na kosalela mbongwana?", + "reload app": "Kozongisa application", + "preparing backup": "Kobongisa backup", + "collecting settings": "Kozwa ba paramɛtrɛ", + "collecting key bindings": "Kozwa ba raccourcis", + "collecting plugins": "Kozwa makambo ya ba plugin", + "creating backup": "Kosala fichier ya backup", + "validating backup": "Kotalela backup", + "restoring key bindings": "Kozongisa ba raccourcis", + "restoring plugins": "Kozongisa ba plugins", + "restoring settings": "Kozongisa ba paramɛtrɛ", + "legacy backup warning": "Oyo ezali format ya backup ya kala. Ba fonctionnalités mosusu ekoki kozala limitées.", + "checksum mismatch": "Makambo ya checksum ekokani te - fichier ya backup ekoki kozala ebongisami to ebebisami.", + "plugin not found": "Plugin ezwami te na registre", + "paid plugin skipped": "Plugin ya kofuta - kosomba ezwami te", + "source not found": "Fichier source ezali lisusu te", + "restored": "Ezongisami", + "skipped": "Eleki", + "backup not valid object": "Fichier ya backup ezali objet ya malamu te", + "backup no data": "Fichier ya backup ezali na ba données ya kozongisa te", + "backup legacy warning": "Oyo ezali format ya backup ya kala (v1). Ba fonctionnalités mosusu ekoki kozala limitées.", + "backup missing metadata": "Ba informations ya backup ezali te - makambo mosusu ekoki kozanga.", + "backup checksum mismatch": "Checksum ekokani te - fichier ya backup ekoki kozala ebongwani to ebebi. Keba liboso ya kokoba.", + "backup checksum verify failed": "Kotalisa checksum elongi te", + "backup invalid settings": "Format ya ba paramɛtrɛ ezali na libunga", + "backup invalid keybindings": "Format ya ba keyboard shortcuts ezali na libunga", + "backup invalid plugins": "Format ya ba plugins oyo etiemami ezali na libunga", + "issues found": "Mikakatano emonani", + "error details": "Makambo ya libunga", + "active tools": "Bisaleli oyo ezali kosala", + "available tools": "Ba outils oyo ezali", + "recent": "Ba fichiers ya sika", + "command palette": "Fungola menu ya ba commandes", + "change theme": "Bobongola motó", + "documentation": "Mikanda ya lisungi", + "open in terminal": "Fungola na terminal", + "developer mode": "Mode ya developer", + "info-developermode": "Fungola ba outils ya developer (Eruda) pona ko déboguer ba plugins mpe kotala ezalela ya application. Inspecteur ekofungwama tango application ebandi.", + "developer mode enabled": "Mode ya developer efungwami. Salela palette ya mitindo mpo na kofungola to kokanga inspecteur (Ctrl+Shift+I).", + "developer mode disabled": "Mode ya developer ekangami", + "copy relative path": "Kopi nzela relatif", + "shortcut request sent": "Bosengi ya raccourci etindami. Finá Ajouter mpo na kosilisa.", + "add to home screen": "Bakisa na écran d'accueil", + "pin shortcuts not supported": "Ba shortcuts ya écran d'accueil esimbami te na appareil oyo.", + "save file before home shortcut": "Bomba fichier liboso ya kobakisa yango na écran d'accueil.", + "terminal_required_message_for_lsp": "Terminal ezali installed te. Install terminal liboso mpo na kosalela ba serveurs LSP.", + "shift click selection": "Poná na Shift + click", + "earn ad-free time": "Zwa ntango kozanga bapub", + "indent guides": "Ba guide ya kokɔtisa molɔngɔ", + "language servers": "Ba serveurs ya monoko", + "lint gutter": "Lakisa ba erreurs ya lint", + "rainbow brackets": "Ba parenthèses ya balangi", + "lsp-add-custom-server": "Bakisa serveur personnalisé", + "lsp-binary-args": "Ba arguments ya binaire (JSON array)", + "lsp-binary-command": "Command ya binaire", + "lsp-binary-path-optional": "Nzela ya binaire (ekoki kozala te)", + "lsp-check-command-optional": "Command ya kotala (option ya kobongola)", + "lsp-checking-installation-status": "Kotala ezalela ya installation...", + "lsp-configured": "Ebongisami", + "lsp-custom-server-added": "Serveur personnalisé ebakisami", + "lsp-default": "Ya liboso", + "lsp-details-line": "Makambo: {details}", + "lsp-edit-initialization-options": "Bongola ba options ya kobanda", + "lsp-empty": "Ezali mpamba", + "lsp-enabled": "Efongwami", + "lsp-error-add-server-failed": "Ekoki te kobakisa serveur.", + "lsp-error-args-must-be-array": "Ba arguments esengeli kozala tableau ya JSON", + "lsp-error-binary-command-required": "Command binary esengeli", + "lsp-error-language-id-required": "Esengeli kozala na ID moko ya monoko ata moko", + "lsp-error-package-required": "Esengeli kozala na package ata moko", + "lsp-error-server-id-required": "ID ya serveur esengeli", + "lsp-feature-completion": "Kosilisa code automatiquement", + "lsp-feature-completion-info": "Fungola ba suggestions ya autocomplete oyo ewutaka na serveur.", + "lsp-feature-diagnostics": "Botali mabunga", + "lsp-feature-diagnostics-info": "Lakisa ba erreurs mpe ba avertissements oyo ewutaka na serveur ya langue.", + "lsp-feature-formatting": "Bobongisi format", + "lsp-feature-formatting-info": "Fungola formatage ya code oyo ewutaka na serveur ya langue.", + "lsp-feature-hover": "Makambo ya code", + "lsp-feature-hover-info": "Lakisa ba informations ya type mpe documentation tango ozali kosala hover.", + "lsp-feature-inlay-hints": "Bilembo ya lisungi", + "lsp-feature-inlay-hints-info": "Lakisa ba informations ya lolenge ya code na kati ya éditeur.", + "lsp-feature-signature": "Lisungi ya signature", + "lsp-feature-signature-info": "Lakisa ba indications ya ba paramɛtrɛ ya fonction tango ozali kokoma.", + "lsp-feature-state-toast": "{feature} {state}", + "lsp-initialization-options": "Ba options ya kobanda", + "lsp-initialization-options-json": "Ba options ya kobanda (JSON)", + "lsp-initialization-options-updated": "Ba options ya kobanda ebongwani", + "lsp-install-command": "Command ya installation", + "lsp-install-command-unavailable": "Command ya installation ezali te.", + "lsp-install-info-check-failed": "Acode ekoki te kotala soki installation esili malamu.", + "lsp-install-info-missing": "Serveur ya monoko etiemami te na environnement ya terminal.", + "lsp-install-info-ready": "Serveur ya monoko etiemami mpe ezali prêt.", + "lsp-install-info-unknown": "Ezalela ya installation ekoki kotala yango automatiquement te.", + "lsp-install-info-version-available": "Version {version} ezali.", + "lsp-install-notification": "{server} language server is not installed. Tap to install.", + "lsp-install-method-apk": "Package APK", + "lsp-install-method-cargo": "Package Cargo", + "lsp-install-method-manual": "Binaire ya mabɔkɔ", + "lsp-install-method-npm": "Package npm", + "lsp-install-method-pip": "Package pip", + "lsp-install-method-shell": "Shell personnalisé", + "lsp-install-method-title": "Lolenge ya installation", + "lsp-install-repair": "Kotia / kobongisa", + "lsp-installation-status": "Ezalela ya installation", + "lsp-installed": "Eteni", + "lsp-invalid-timeout": "Motuya ya timeout ezali na libunga", + "lsp-language-ids": "Ba ID ya monoko (ekabolami na virgule)", + "lsp-packages-prompt": "Ba packages {method} (ekabwani na virgule)", + "lsp-remove-installed-files": "Longola ba fichiers installés pona {server}?", + "lsp-server-disabled-toast": "Serveur ekangami", + "lsp-server-enabled-toast": "Serveur efungwami", + "lsp-server-id": "ID ya serveur", + "lsp-server-label": "Kombo ya serveur", + "lsp-server-not-found": "Serveur ezwami te", + "lsp-server-uninstalled": "Serveur elongolami", + "lsp-startup-timeout": "Ntango ya kozela na ebandeli", + "lsp-startup-timeout-ms": "Ntango ya kozela na ebandeli (millisecondes)", + "lsp-startup-timeout-set": "Ntango ya kozela etiamisami na {timeout} ms", + "lsp-state-disabled": "ekangami", + "lsp-state-enabled": "efungwami", + "lsp-status": "Ezalela", + "lsp-status-check-failed": "Kotalela elongi te", + "lsp-status-installed": "Eteni", + "lsp-status-installed-version": "Etyami ({version})", + "lsp-status-line": "Ezali: {status}", + "lsp-status-not-installed": "Etyami te", + "lsp-status-unknown": "Eyebani te", + "lsp-timeout-ms": "{timeout} ms", + "lsp-uninstall-command-unavailable": "Command ya kolongola ezali te", + "lsp-uninstall-notification": "Finá mpo na kolongola serveur ya monoko {server}.", + "lsp-uninstall-server": "Longola serveur", + "lsp-update-command-optional": "Command ya mbongwana (option ya kobongisa)", + "lsp-update-command-unavailable": "Command ya mbongwana ezali te.", + "lsp-update-server": "Mbongwana ya serveur", + "lsp-version-line": "Version: {version}", + "lsp-view-initialization-options": "Talá ba options ya kobanda", + "settings-category-about-acode": "Mpo na Acode", + "settings-category-discover-apps": "Tala ba applications mosusu", + "settings-category-advanced": "Ya likolo", + "settings-category-assistance": "Lisungi", + "settings-category-core": "Paramɛtrɛ ya moboko", + "settings-category-cursor": "Curseur", + "settings-category-cursor-selection": "Curseur mpe kopona", + "settings-category-custom-servers": "Ba serveurs oyo ebongisami na moto", + "settings-category-customization-tools": "Bobongisi mpe bisaleli", + "settings-category-display": "Emoniseli", + "settings-category-editing": "Bobongisi", + "settings-category-features": "Makoki", + "settings-category-files-sessions": "Ba fichiers mpe ba sessions", + "settings-category-fonts": "Makomi", + "settings-category-general": "Ya monene", + "settings-category-guides-indicators": "Ba guides mpe bilembo", + "settings-category-installation": "Botie", + "settings-category-interface": "Interface", + "settings-category-maintenance": "Bobongisi mpe bobateli", + "settings-category-permissions": "Ndingisa", + "settings-category-preview": "Botali liboso", + "settings-category-scrolling": "Kokita", + "settings-category-server": "Serveur", + "settings-category-servers": "Ba serveurs", + "settings-category-session": "Session", + "settings-category-support-acode": "Sunga Acode", + "settings-category-text-layout": "Bobongisi ya makomi", + "settings-info-app-animation": "Kamba ba animation ya transition na kati ya application nyonso.", + "settings-info-app-check-files": "Zongisa ba éditeur soki ba fichier ebongwani libanda ya Acode.", + "settings-info-app-clean-install-state": "Longola ezalela ya installation oyo ebombami mpo na setup.", + "settings-info-app-confirm-on-exit": "Senga kondimisa liboso ya kokanga application.", + "settings-info-app-console": "Pona console ya débogage oyo Acode esalela.", + "settings-info-app-default-file-encoding": "Encodage ya liboso tango ya kofungola to kosala ba fichier.", + "settings-info-app-exclude-folders": "Longola ba dossier mpe ba modèle tango ya koluka.", + "settings-info-app-floating-button": "Lakisa bouton flottant ya ba actions ya noki.", + "settings-info-app-font-manager": "Kotia, kokamba to kolongola ba polices ya application.", + "settings-info-app-fullscreen": "Bomba barre ya système ntango ozali kosalela Acode.", + "settings-info-app-keybindings": "Bongola fichier ya ba raccourcis to zongisa yango na ndenge ya liboso.", + "settings-info-app-keyboard-mode": "Pona ndenge clavier ya logiciel esalaka ntango ozali kobongisa code.", + "settings-info-app-language": "Pona monoko ya application mpe ba labels oyo ebongolami.", + "settings-info-app-open-file-list-position": "Pona esika liste ya ba fichiers actifs ekomonana.", + "settings-info-app-quick-tools-settings": "Bongola molongo mpe ndenge ya ba raccourcis ya ba outils ya mbangu.", + "settings-info-app-quick-tools-trigger-mode": "Pona ndenge ba outils ya noki efungwamaka na touche to na kosimba écran.", + "settings-info-app-remember-files": "Fungola lisusu ba fichiers oyo ezalaki ya kofungwama mbala ya suka.", + "settings-info-app-remember-folders": "Fungola lisusu ba dossiers ya session oyo eleki.", + "settings-info-app-retry-remote-fs": "Meka lisusu ba opérations ya fichiers distants nsima ya transfert oyo elongi te.", + "settings-info-app-side-buttons": "Lakisa ba boutons ya actions ya kobakisa pembeni ya éditeur.", + "settings-info-app-sponsor-sidebar": "Lakisa sponsor na sidebar.", + "settings-info-app-touch-move-threshold": "Mouvement moke oyo esengeli liboso ya koyeba déplacement ya touch.", + "settings-info-app-vibrate-on-tap": "Fungola vibration ya appareil tango ozali kosimba ba boutons mpe ba contrôles.", + "settings-info-editor-autosave": "Bomba mbongwana automatiquement nsima ya mwa ntango.", + "settings-info-editor-color-preview": "Tala ba valeur ya langi na kati ya éditeur.", + "settings-info-editor-fade-fold-widgets": "Kitisa pole ya bilembo ya fold soki esengeli te.", + "settings-info-editor-font-family": "Pona lolenge ya police oyo esalelami na éditeur.", + "settings-info-editor-font-size": "Bongola bonene ya makomi ya éditeur.", + "settings-info-editor-format-on-save": "Sala formatage tango nyonso fichier ebombami.", + "settings-info-editor-hard-wrap": "Kotisa ba saut ya ligne ya solo na esika ya kaka kokanga yango na komona.", + "settings-info-editor-indent-guides": "Lakisa ba lignes ya guide ya indentation.", + "settings-info-editor-line-height": "Bongola espace ya likolo mpe ya se kati ya ba ligne.", + "settings-info-editor-line-numbers": "Lakisa mituya ya ba lignes pembeni ya éditeur.", + "settings-info-editor-lint-gutter": "Lakisa ba erreurs, ba diagnostics mpe ba marqueurs ya lint pembeni ya éditeur.", + "settings-info-editor-live-autocomplete": "Lakisa ba suggestions ntango ozali kokoma.", + "settings-info-editor-rainbow-brackets": "Pesa balangisi ya langi na ba crochet oyo ekokani na profondeur.", + "settings-info-editor-relative-line-numbers": "Lakisa distance uta na ligne oyo ozali kosalela.", + "settings-info-editor-rtl-text": "Bongola ndenge ya kokoma droite na gauche mpo na ligne moko na moko.", + "settings-info-editor-scroll-settings": "Bongola bonene ya barre ya défilement, vitesse mpe ndenge ya kosalela yango.", + "settings-info-editor-shift-click-selection": "Bakisa sélection na Shift + kosimba to kofina.", + "settings-info-editor-show-spaces": "Lakisa bilembo oyo emonisaka ba espaces mpe ba saut ya ligne.", + "settings-info-editor-soft-tab": "Kotisa ba espaces na esika ya ba caractères tab.", + "settings-info-editor-tab-size": "Pona motango ya ba espaces oyo tab moko esalela.", + "settings-info-editor-teardrop-size": "Bongola bonene ya poignée ya curseur mpo na édition na touch.", + "settings-info-editor-text-wrap": "Kanga ba ligne milayi na kati ya éditeur.", + "settings-info-lsp-add-custom-server": "Bakisa serveur ya langue personnalisé na ba commandes ya installation, mbongwana mpe lancement.", + "settings-info-lsp-edit-init-options": "Bongola ba options ya kobanda lokola JSON.", + "settings-info-lsp-install-server": "Kotia to kobongisa serveur oyo ya langue.", + "settings-info-lsp-server-enabled": "Kofungola to kokanga serveur oyo ya monoko.", + "settings-info-lsp-startup-timeout": "Pona tango oyo Acode ekoki kozela mpo serveur ebanda.", + "settings-info-lsp-uninstall-server": "Longola ba paquets to ba fichiers exécutables oyo ebombami mpo na serveur oyo.", + "settings-info-lsp-update-server": "Kobongisa serveur oyo ya monoko soki lolenge ya kobongisa ezali.", + "settings-info-lsp-view-init-options": "Tala ba options ya kobanda oyo ezali kosala lokola JSON.", + "settings-info-main-ad-rewards": "Tala ba publicité mpo na kozwa accès sans publicité mpo na mwa tango.", + "settings-info-main-app-settings": "Monoko, ndenge application esalaka mpe ba outils ya accès rapide.", + "settings-info-main-backup-restore": "Bimisa ba paramɛtrɛ na backup to zongisa yango sima.", + "settings-info-main-changelog": "Tala ba mbongwana ya sika mpe ba notes ya version.", + "settings-info-main-edit-settings": "Bongola fichier settings.json brut directement.", + "settings-info-main-editor-settings": "Ba police, ba tabs, ba suggestions mpe ndenge éditeur emonanaka.", + "settings-info-main-formatter": "Pona formatter pona langage moko na moko oyo esungami.", + "settings-info-main-lsp-settings": "Bongisa ba serveur ya monoko mpe mayele ya éditeur.", + "settings-info-main-plugins": "Tambwisa ba plugins oyo etiemi mpe misala na yango.", + "settings-info-main-preview-settings": "Mode ya preview, ba port ya serveur mpe ndenge navigateur esalaka.", + "settings-info-main-rateapp": "Pesa Acode note na Google Play.", + "settings-info-main-remove-ads": "Fungola accès ya libela sans publicité.", + "settings-info-main-reset": "Zongisa Acode na ba paramètres ya liboso.", + "settings-info-main-sponsors": "Sunga bokoli ya Acode oyo ezali kokoba.", + "settings-info-main-terminal-settings": "Motó ya terminal, police, curseur mpe ndenge session esalaka.", + "settings-info-main-theme": "Motó ya application, contraste mpe ba langi oyo ebongisami.", + "settings-info-preview-disable-cache": "Zongisa ntango nyonso makambo ya sika na navigateur ya kati ya application.", + "settings-info-preview-host": "Nkombo ya hôte oyo esalelami ntango URL ya preview efungwami.", + "settings-info-preview-mode": "Pona esika preview ekofungwama ntango obandi yango.", + "settings-info-preview-preview-port": "Port oyo serveur ya preview na tango ya solo esalelaka.", + "settings-info-preview-server-port": "Port oyo serveur ya kati ya application esalelaka.", + "settings-info-preview-show-console-toggler": "Lakisa bouton ya console na preview.", + "settings-info-preview-use-current-file": "Pona liboso fichier oyo ezali sikoyo ntango obandi preview.", + "settings-info-terminal-convert-eol": "Bongola ba suka ya ba lignes ntango ozali kokanga to kolakisa makambo ya terminal.", + "settings-note-formatter-settings": "Pesa formatter na monoko moko na moko. Installer ba plugins ya formatter mpo na kozwa ba options mosusu.", + "settings-note-lsp-settings": "Ba serveurs ya langue ebakisaka autocomplete, diagnostics, ba informations ya hover mpe makambo mosusu. Esalaka malamu mingi na ba dossiers oyo terminal intégré ya Acode ekoki kokoma directement, lokola ba dossiers terminal/public. Ba emplacements SAF, externes mpe distants etikalamaka na libanda automatiquement mpo bakoki kosalela ba chemins ya cache to virtuels; activer option ya compatibilité kaka soki olingi komeka yango.", + "search result label singular": "mbano", + "search result label plural": "mbano", + "pin tab": "Kangisa onglet", + "unpin tab": "Longola onglet na biloko ekangami", + "pinned tab": "Onglet ekangami", + "unpin tab before closing": "Longola tab na pin liboso ya kokanga yango.", + "app font": "Makomi ya application", + "settings-info-app-font-family": "Pona police oyo esalelami na interface mobimba ya application.", + "lsp-transport-method-stdio": "STDIO (bandisa commande ya binaire)", + "lsp-transport-method-websocket": "WebSocket (kota na URL ws/wss)", + "lsp-websocket-url": "URL ya WebSocket", + "lsp-websocket-server-managed-externally": "Serveur oyo etambwisami libanda na nzela ya WebSocket.", + "lsp-error-websocket-url-invalid": "URL ya WebSocket esengeli kobanda na ws:// to wss://", + "lsp-error-websocket-url-required": "URL ya WebSocket esengeli", + "lsp-remove-custom-server": "Longola serveur personnalisé", + "lsp-remove-custom-server-confirm": "Longola serveur personnalisé ya langage {server}?", + "lsp-custom-server-removed": "Serveur personnalisé elongolami", + "settings-info-lsp-remove-custom-server": "Longola serveur ya langue personnalisé oyo na Acode.", + "unsaved selected tabs warning": "Ba tabs mosusu oyo oponi ebombami nanu te. Pona nini osengeli kosala.", + "save selected tabs": "Bomba ba onglets oyo oponi", + "close selected tabs": "Kanga ba onglets oyo oponi", + "save selected tabs warning": "Oza na ntembe te ete olingi kobomba mpe kokanga ba tabs oyo oponi?", + "close selected tabs warning": "Oza na ntembe te ete olingi kokanga ba tabs oyo oponi? Mbongwana oyo ebombami nanu te ekobunga mpe likambo oyo ekoki kozongisama te.", + "close tabs to right": "Kanga oyo ezali na droite", + "close tabs to left": "Kanga oyo ezali na gauche", + "close other tabs": "Kanga ba onglets mosusu", + "auto close tags": "Kanga ba tags automatiquement", + "settings-info-editor-auto-close-tags": "Kotisa automatiquement ba balises ya kokanga na HTML, XML, Vue, Angular mpe PHP.", + "ui zoom": "Zoom ya interface", + "settings-info-app-ui-zoom": "Bongola bonene ya makomi na interface mobimba ya Acode.", + "plugin-not-supported": "Plugin oyo endimami te", + "plugin-not-supported-info": "Plugin esalemaki pona version ya kala ya Acode.", + "login-to-view": "Kota na compte mpo na komona yango...", + "show share button": "Lakisa bouton ya kokabola", + "settings-info-editor-show-share-button": "Lakisa bouton ya partage na menu ya sélection.", + "iap-plugin-purchase-warning": "Ba plugins oyo osombi ebongisami te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "iap-pro-purchase-warning": "Bosombi oyo ekobongisama te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "confirm-login": "Okoti nanu te na Acode, olingi kokota sikoyo?", + "local word completion": "Bobongisi ya maloba ya fichier", + "language package completion": "Bobongisi ya package ya lokota", + "settings-info-editor-local-word-completion": "Pesa ba suggestions ya maloba oyo ezali na fichier oyo ozali kosalela.", + "settings-info-editor-language-completion": "Pesaka ba mots ya ntina, ba snippets mpe ba suggestions ya CodeMirror.", + "terminal:failsafe-info": "Bandisa terminal na shell ya système", + "auto rename tags": "Bongola kombo ya ba tags automatiquement", + "settings-info-editor-auto-rename-tags": "Bongola kombo ya balise oyo ekokani tango ozali kobongisa ba balise ya HTML.", + "copying items": "Kokopa biloko {count}...", + "cannot paste folder into itself": "Okoki te ko coller dossier na kati na yango moko", + "folder already exists": "Dossier ezali déjà", + "file already exists force named": "'{name}' ezali deja. Olingi kokoma likolo na yango?", + "lsp-allow-non-terminal-workspace": "Tika LSP esala na ba dossiers ya libanda", + "settings-info-lsp-allow-non-terminal-workspace": "Pesa nzela na ba serveur ya monoko mpo na SAF, bisika ya libanda mpe bisika ya mosika. LSP esalaka na terminal ya kati ya Acode, yango ekoki kosala ete makambo mosusu esalaka malamu te.", + "don't ask again": "Kotuna lisusu te", + "scrollbar height": "Molai ya barre ya bokitisaka", + "full": "Mobimba", + "scroll past end": "Koba kokita koleka suka", + "settings-info-scroll-past-end": "Bakisa esika ya pamba na nse ya éditeur mpo okoka komema molongo ya suka likolo.", + "compact": "Kokómisa mokuse", + "off": "Ekangami", + "quick tools height": "Molai ya bisaleli ya mbangu", + "quick tools toggler": "Bascule ya bisaleli ya mbangu", + "running processes": "Ba processus oyo ezali kosala", + "recommend extensions": "Tinda ba extensions", + "settings-info-editor-recommend-extensions": "Pesaka ba plugins tango fichier efungwami lokola texte pamba mpo na kozanga mode ya monoko.", + "extension recommendation title": "Ba extensions ezali mpo na {extension}", + "extension recommendation message": "Mode ya syntax etiemami te mpo na {extension}. Luka ba plugins mpo na \"{keyword}\".", + "extension request title": "Extension ezwamaki te mpo na {extension}", + "extension request message": "Senga plugin mpo Acode ekoka kolakisa lolenge oyo ya fichier.", + "search plugins": "Luka ba plugins", + "request plugin": "Senga plugin", + "terminal:block": "Bloc", + "terminal:underline": "Mokomi na nse", + "terminal:bar": "Barre", + "terminal:inactive block": "Bloc", + "terminal:inactive underline": "Mokomi na nse", + "terminal:inactive bar": "Barre", + "terminal:inactive none": "Eloko moko te", + "terminal:normal": "Ya momesano", + "terminal:bold": "Makomi minene", + "quicktools-trigger:click": "Finá", + "quicktools-trigger:touch": "Kosimba", + "settings-info-terminal-uninstall": "Oza na ntembe te ete olingi kolongola terminal?", + "terminal:inactive outline": "Ndelo", + "restored successfully": "Terminal ezongisami na elonga", + "uninstalled successfully": "Terminal elongolami na elonga", + "enter plugin source": "Kota source ya plugin", + "enter keywords": "Kota ba maloba ya ntina", + "enter author name": "Kota kombo ya mokomi", + "update available": "Mbongwana ya sika ezali", + "update available info": "Acode {version} ezali sikoyo! Finá awa mpo na kotala yango.", + "plugin updates": "Ba mbongwana ya ba plugins", + "plugin updates singular": "Plugin 1 ezali na version ya sika.", + "plugin updates plural": "Ba plugins {count} ezali na ba versions ya sika.", + "just now": "Sikawa kaka", + "day singular": "Eleki mokolo {count}", + "hour singular": "Eleki ngonga {count}", + "min singular": "Eleki miniti {count}", + "day plural": "Eleki mikolo {count}", + "hour plural": "Eleki bangonga {count}", + "min plural": "Eleki baminiti {count}", + "settings-category-builtin-servers": "Ba serveurs oyo etongami na kati", + "settings-category-plugin-servers": "Ba serveurs ya ba plugins", + "new name": "Kombo ya sika", + "enter new name": "Koma kombo ya sika", + "code actions": "Misala ya code", + "active processes": "Ba processus oyo ezali kosala", + "total memory": "Mémoire mobimba", + "uptime": "Ntango ya mosala", + "note": "Likebisi", + "acode main process": "Processus monene ya Acode", + "ppid parent": "PPID (Moboti)", + "unknown": "Eyebani te", + "just started": "Ebandi sikawa", + "diff days": "Eleki mikolo {days}, bangonga {hr}", + "diff hr": "Eleki {hr}h {min}m", + "diff min": "Eleki {min}m {sec}s", + "diff sec": "Eleki {sec}s", + "command": "Mitindo", + "managed": "Etambwisami", + "acode service": "Service ya Acode", + "info-terminal-show-scrollbar": "Lakisa scrollbar ya xterm pembeni ya terminal.", + "terminal:show scrollbar": "Lakisa barre ya défilement", + "apply exclusions when copying": "Salela ba exclusions ntango ozali kokopa", + "settings-info-app-use-file-operation-exclusions": "Pusa ba fichier mpe ba dossier oyo ekokani na ba règles ya exclusion tango ya kopiya mpe kokanga.", + "horizontal scroll margin": "Marge ya kokita na ngámbo", + "settings-info-horizontal-scroll-margin": "Bakisa esika ya pamba nsima ya ligne oyo eleki molai ntango retour à la ligne ezali kosalelama te. Tia motuya mobimba ya pixels oyo ezali négatif te.", + "conflict error": "Matata! Zela liboso ya kosala commit mosusu.", + "terminal:failsafe": "Mode FailSafe", + "app icon": "App icon", + "app icon changed": "App icon changed", + "settings-info-app-icon": "Choose the app icon displayed on your device.", + "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", + "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", + "rewarded ad failed": "The ad could not be completed. Please try again.", + "rewarded ad incomplete": "Finish watching the ad to earn the reward.", + "unable to delete file": "unable to delete file", + "optional": "optional", + "purchase pending": "purchase pending", + "cancelled": "cancelled", + "plugin-review:dialog-label": "Plugin reviews", + "plugin-review:account-check-failed": "Unable to check your account. Try again.", + "plugin-review:sign-in": "Sign in to review", + "plugin-review:edit": "Edit your review", + "plugin-review:add": "Add a review...", + "plugin-review:placeholder": "Share your experience...", + "plugin-review:input-label": "Plugin review", + "plugin-review:vote-group-label": "Vote", + "plugin-review:thumbs-up": "Thumbs up", + "plugin-review:thumbs-down": "Thumbs down", + "plugin-review:delete": "Delete review", + "plugin-review:load-failed": "Unable to load reviews.", + "plugin-review:retry": "Retry", + "plugin-review:empty-title": "No reviews yet", + "plugin-review:empty-description": "Be the first to share your experience.", + "plugin-review:yours": "Your review", + "plugin-review:community": "Community reviews", + "plugin-review:no-other-reviews": "No other reviews yet.", + "plugin-review:login-incomplete": "Login was not completed.", + "plugin-review:sign-in-failed": "Unable to sign in.", + "plugin-review:session-expired-review": "Your session expired. Sign in again to review.", + "plugin-review:save-failed": "Unable to save review.", + "plugin-review:delete-confirmation": "Delete your review? This cannot be undone.", + "plugin-review:session-expired-continue": "Your session expired. Sign in again to continue.", + "plugin-review:delete-failed": "Unable to delete review.", + "plugin-review:you": "You", + "plugin-review:edit-action": "Edit review", + "plugin-review:recommended": "Recommended this plugin", + "plugin-review:error-max-length": "Review must be {max} characters or less.", + "plugin-review:error-downvote-comment": "Tell the developer what could be improved.", + "plugin-review:error-empty": "Add a comment or choose thumbs up.", + "plugin-review:unrated": "Unrated" +} \ No newline at end of file From 7fbd06295c8b0f570dc9939ba696031fe2dd6f7e Mon Sep 17 00:00:00 2001 From: Rohit Kushwaha Date: Tue, 8 Sep 2026 11:09:01 +0530 Subject: [PATCH 9/9] format --- src/lang/ln-ln.json | 1754 +++++++++++++++++++++---------------------- 1 file changed, 877 insertions(+), 877 deletions(-) diff --git a/src/lang/ln-ln.json b/src/lang/ln-ln.json index 684602f84b..b49912e1e3 100644 --- a/src/lang/ln-ln.json +++ b/src/lang/ln-ln.json @@ -1,878 +1,878 @@ { - "lang": "Lingala", - "about": "Mpo na yango", - "active files": "Ba fichier efungwami", - "alert": "Likebisi", - "app theme": "Motó ya application", - "autocorrect": "Pesa nzela na bobongisi ya automatique ?", - "autosave": "Kobomba yango moko", - "cancel": "Tika", - "change language": "Bobongola monoko", - "choose color": "Pona langi moko", - "clear": "Longola", - "close app": "Kanga app ?", - "commit message": "Nsango ya commit", - "console": "Konsole", - "copy": "Kopi", - "create folder error": "Ekoki, te kosala dossier ya sika.", - "cut": "Kata", - "delete": "Longola", - "dependencies": "Ba dépendance", - "delay": "Ntango ya kozela na millisecondes", - "editor settings": "Paramɛtrɛ ya mobongisi", - "editor theme": "Motó ya mobongisi", - "enter file name": "Koma nkombo ya fichier", - "enter folder name": "Koma nkombo ya dossier", - "empty folder message": "Dossier ezali mpamba", - "enter line number": "Koma nimero ya ligne", - "error": "Libunga", - "failed": "Elongi te", - "file already exists": "Fichier ezali déjà", - "file already exists force": "Fichier ezali déjà. Kokoma lisusu?", - "file changed": " has been changed, reload file?", - "file deleted": "Fichier elongolami", - "file is not supported": "Fichier oyo esungami te", - "file not supported": "Lolenge ya fichier oyo esungami te.", - "file too large": "Fichier ezali monene mingi mpo na kosalela yango. Bonene ya likolo ezali {size}", - "file renamed": "Nkombo ya fichier ebongwani", - "file saved": "Fichier ebombami", - "folder added": "Dossier ebakisami", - "folder already added": "Dossier ebakisami déjà", - "font size": "Bonene ya makomi", - "goto": "Kende na ligne", - "icons definition": "Ndimbola ya bilembo", - "info": "Sango", - "invalid value": "Valeur ezali malamu te", - "language changed": "Monoko ebongwani malamu", - "linting": "Tala libunga ya syntaxe", - "logout": "Bima", - "loading": "Ezali kokɔtisa", - "my profile": "Profil na ngai", - "new file": "Fichier ya sika", - "new folder": "Dossier ya sika", - "no": "Te", - "no editor message": "Fungola to sala fichier mpe dossier ya sika na menu", - "not set": "Etamwisami te", - "unsaved files close app": "Ba fichiers mosusu ebombami nanu te. Kanga application?", - "notice": "Mayebisi", - "open file": "Fungola fichier", - "open files and folders": "Fungola ba fichiers mpe ba dossiers", - "open folder": "Fungola dossier", - "open recent": "Fungola oyo euti kosalelama sika", - "ok": "OK", - "overwrite": "Koma likolo", - "paste": "Kangisa", - "preview mode": "Mode ya botali liboso", - "read only file": "Ekoki te kobomba fichier ya kotanga kaka. Meká Bomba lokola", - "reload": "Zongisa", - "rename": "Pesa kombo mosusu", - "replace": "Zongisa na esika", - "required": "Esika oyo esengeli kotondisama", - "run your web app": "Tambwisa application web na yo", - "save": "Bomba", - "saving": "Ezali kobomba", - "save as": "Bomba lokola", - "save file to run": "Bomba fichier oyo liboso ya kotambwisa yango na navigateur", - "search": "Luka", - "see logs and errors": "Tala ba logs mpe mabunga", - "select folder": "Pona dossier", - "settings": "Paramɛtrɛ", - "settings saved": "Paramɛtrɛ ebombami", - "show line numbers": "Lakisa mituya ya ba lignes", - "show hidden files": "Lakisa ba fichiers oyo ebombami", - "show spaces": "Lakisa ba espaces", - "soft tab": "Tab ya pete", - "sort by name": "Tanda na kotalela kombo", - "success": "Esalemi malamu", - "tab size": "Bonene ya tab", - "text wrap": "Kokanga milongo ya makomi", - "theme": "Motema ya app", - "title-listfiles": "Tanga ba fichiers", - "unable to open file": "Limbisa, ekoki te kofungola fichier", - "unable to open folder": "Limbisa, ekoki te kofungola dossier", - "unable to save file": "Limbisa, ekoki te kobomba fichier", - "unable to rename": "Limbisa, ekoki te kobongola kombo", - "unsaved file": "Fichier oyo ebombami te, kanga yango kaka?", - "warning": "Likebisi", - "use emmet": "Salela Emmet", - "use quick tools": "Salela bisaleli ya mbangu", - "yes": "Iyo", - "encoding": "Encodage ya makomi", - "syntax highlighting": "Kopesa balangi na syntaxe", - "read only": "Kotanga kaka", - "select all": "Pona nyonso", - "select branch": "Pona branche", - "create new branch": "Sala branche ya sika", - "use branch": "Salela branche", - "new branch": "Branche ya sika", - "branch": "Branch", - "key bindings": "Ba raccourcis ya clavier", - "edit": "Bobongisi", - "reset": "Zongisa na ebandeli", - "color": "Langi", - "select word": "Pona liloba", - "quick tools": "Bisaleli ya mbangu", - "select": "Pona", - "editor font": "Police ya éditeur", - "new project": "Projet ya sika", - "format": "Lolenge", - "project name": "Kombo ya projet", - "unsupported device": "Appareil na yo endimi thème te.", - "vibrate on tap": "Vibrer ntango ozali kofina", - "copy command is not supported by ftp.": "Commande ya kopi esungami te na FTP.", - "support title": "Sunga Acode", - "fullscreen": "Ekran mobimba", - "animation": "Botambwisi", - "backup": "Kopi ya libateli", - "restore": "Zongisa", - "backup successful": "Backup esalemi malamu", - "invalid backup file": "Fichier ya backup ezali malamu te", - "add path": "Bakisa nzela", - "live autocompletion": "Autocomplétion ya mbala moko", - "file properties": "Bizaleli ya fichier", - "path": "Nzela", - "type": "Lolenge", - "word count": "Motango ya maloba", - "line count": "Motango ya milɔngɔ", - "last modified": "Ebongisami mbala ya nsuka", - "size": "Bonene", - "share": "Kabola", - "show print margin": "Lakisa marge ya impression", - "login": "Kota", - "scrollbar size": "Bonene ya barre ya kokitisa", - "cursor controller size": "Bonene ya contrôleur ya curseur", - "none": "Eloko moko te", - "small": "Moke", - "large": "Monene", - "confirm on exit": "Kondimisa liboso ya kobima", - "show console": "Lakisa console", - "image": "Elilingi", - "insert file": "Kotisa fichier", - "insert color": "Kotisa langi", - "powersave mode warning": "Kanga mode ya kobomba nguya mpo na kotala na navigateur ya libanda.", - "exit": "Bima", - "custom": "Ya moto", - "reset warning": "Oza na ntembe te ete olingi kozongisa thème na ebandeli?", - "theme type": "Lolenge ya thème", - "light": "Pole", - "dark": "Molili", - "file browser": "Navigateur ya ba fichiers", - "operation not permitted": "Opération epesami nzela te", - "no such file or directory": "Fichier to dossier yango ezali te", - "input/output error": "Libunga ya entrée/sortie", - "permission denied": "Ndingisa eboyami", - "bad address": "Adresse ezali malamu te", - "file exists": "Fichier ezali", - "not a directory": "Ezali dossier te", - "is a directory": "Ezali dossier", - "invalid argument": "Argument ezali malamu te", - "too many open files in system": "Ba fichiers mingi efungwami na système", - "too many open files": "Ba fichiers mingi efungwami", - "text file busy": "Fichier ya makomi ezali kosalelama", - "no space left on device": "Esika etikali te na appareil", - "read-only file system": "Système ya fichiers ya kotanga kaka", - "file name too long": "Kombo ya fichier ezali molai mingi", - "too many users": "Basaleli bazali mingi", - "connection timed out": "Ntango ya connexion esili", - "connection refused": "Connexion eboyami", - "owner died": "Nkolo akufi", - "an error occurred": "Libunga moko esalemi", - "add ftp": "Bakisa FTP", - "add sftp": "Bakisa SFTP", - "save file": "Bomba fichier", - "save file as": "Bomba fichier lokola", - "files": "Ba fichiers", - "help": "Lisungi", - "file has been deleted": "{file} has been deleted!", - "feature not available": "Makoki oyo ezali te.", - "feature available in paid version": "Makoki oyo ezali kaka na version ya kofuta ya application.", - "deleted file": "Fichier elongolami", - "line height": "Molai ya ligne", - "preview info": "Soki olingi kosala fichier oyo ezali kosala, finá mpe simbá elembo ya kobɛta.", - "manage all files": "Pesa Acode nzela ya kokamba ba fichiers nyonso na paramètres mpo na kobongisa ba fichiers na appareil na yo na pete.", - "close file": "Kanga fichier", - "reset connections": "Zongisa ba connexions", - "check file changes": "Tala mbongwana ya fichier", - "open in browser": "Fungola na navigateur", - "desktop mode": "Mode ordinateur", - "toggle console": "Bongola console", - "new line mode": "Mode ya ligne ya sika", - "add a storage": "Bakisa esika ya kobomba", - "rate acode": "Pesa Acode note", - "support": "Lisungi", - "downloading file": "Ezali kokitisa {file}", - "downloading...": "Ezali kokɔtisa...", - "folder name": "Kombo ya dossier", - "keyboard mode": "Mode ya clavier", - "normal": "Ya momesano", - "app settings": "Paramɛtrɛ ya application", - "disable in-app-browser caching": "Kanga cache ya navigateur ya kati ya application", - "copied to clipboard": "Ekopedami na presse-papier", - "clipboard not available": "Clipboard ezali te.", - "remember opened files": "Kanisa ba fichiers oyo efungwamaki", - "remember opened folders": "Kanisa ba dossiers oyo efungwamaki", - "no suggestions": "Ba suggestions ezali te", - "no suggestions aggressive": "Ba suggestions ya makasi ezali te", - "install": "Tia", - "installing": "Ezali kotia...", - "plugins": "Ba plugins", - "recently used": "Esalelami kala mingi te", - "update": "Bongisa", - "uninstall": "Longola", - "download acode pro": "Kokitisa Acode Pro", - "loading plugins": "Ezali kokɔtisa ba plugins", - "diagonal scrolling": "Kokita na diagonal", - "reverse scrolling": "Kokita na ngámbo ya inverse", - "formatter": "Formatter", - "format on save": "Sala format tango ya kobomba", - "remove ads": "Longola bapub", - "faqs": "Mituna oyo etunamaka mingi", - "feedback": "Makanisi", - "header": "Motó ya likoló", - "sidebar": "Barre ya pembeni", - "inapp": "Inapp", - "browser": "Navigateur", - "fast": "Nokí", - "slow": "Malɛmbɛ", - "scroll settings": "Paramɛtrɛ ya kokita", - "scroll speed": "Mbangu ya kokita", - "loading...": "Ezali kokɔtisa...", - "no plugins found": "Plugin moko te ezwami", - "name": "Kombo", - "username": "Kombo ya mosaleli", - "hostname": "Hostname", - "password": "Liloba ya sekele", - "security type": "Lolenge ya libateli", - "connection mode": "Mode ya connexion", - "port": "Port", - "key file": "Fichier ya fungola", - "select key file": "Pona fichier ya fungola", - "passphrase": "Maloba ya sekele", - "connecting...": "Ezali kokangisa...", - "type filename": "Koma kombo ya fichier", - "unable to load files": "Ekoki te kokɔtisa ba fichiers", - "preview port": "Port ya botali liboso", - "find file": "Luka fichier", - "system": "Sistɛmi", - "please select a formatter": "Pona formatter moko", - "case sensitive": "Kotalela makomi minene mpe mike", - "regular expression": "Regular expression", - "whole word": "Liloba mobimba", - "edit with": "Bongisa na", - "open with": "Fungola na", - "no app found to handle this file": "Application moko te ezwami mpo na kofungola fichier oyo", - "restore default settings": "Zongisa ba paramɛtrɛ ya liboso", - "server port": "Port ya serveur", - "preview settings": "Ba paramɛtrɛ ya botali liboso", - "preview settings note": "Soki port ya preview mpe port ya serveur ekeseni, application ekobanda serveur te mpe ekofungola https://: na navigateur to navigateur ya kati ya application. Yango ezali na tina soki ozali kosalela serveur esika mosusu.", - "backup/restore note": "It will only backup your settings, custom theme, installed plugins and key bindings. It will not backup your FTP/SFTP or App state.", - "host": "Host", - "retry ftp/sftp when fail": "Meka FTP/SFTP lisusu soki elongi te", - "more": "Mosusu", - "thank you :)": "Matondi :)", - "local": "Ya mboka", - "remote": "Ya mosika", - "show console toggler": "Lakisa bouton ya console", - "binary file": "Fichier oyo ezali na ba données binaires, olingi kofungola yango?", - "relative line numbers": "Mituya ya ba lignes na kotalela ligne oyo ezali sikoyo", - "elastic tabstops": "Ba tab stops oyo ebongwanaka", - "line based rtl switching": "Kobongola RTL na kotalela ligne", - "hard wrap": "Kokanga ligne na makasi", - "spellcheck": "Kotala mabunga ya makomi", - "wrap method": "Lolenge ya kokanga milongo", - "use textarea for ime": "Salela textarea mpo na IME", - "invalid plugin": "Plugin ezali malamu te", - "type command": "Koma command", - "plugin": "Plugin", - "quicktools trigger mode": "Lolenge ya kofungola bisaleli ya mbangu", - "print margin": "Marge ya impression", - "touch move threshold": "Limite ya mouvement ya touch", - "info-retryremotefsafterfail": "Meka lisusu connexion FTP/SFTP soki elongi te.", - "info-fullscreen": "Bomba barre ya motó na écran ya ebandeli.", - "info-checkfiles": "Tala mbongwana ya ba fichiers ntango application ezali na nsima.", - "info-console": "Pona console ya JavaScript. Console Legacy ezali ya liboso, mpe Eruda ezali console ya bato mosusu.", - "info-keyboardmode": "Keyboard mode for text input, no suggestions will hide suggestions and auto correct. If no suggestions does not work, try to change value to no suggestions aggressive.", - "info-rememberfiles": "Kanisa ba fichiers oyo efungwami ntango application ekangami.", - "info-rememberfolders": "Kanisa ba dossiers oyo efungwami ntango application ekangami.", - "info-floatingbutton": "Lakisa to bomba bouton flottant ya bisaleli ya mbangu.", - "info-openfilelistpos": "Esika ya kolakisa liste ya ba fichiers oyo ezali kosala.", - "info-touchmovethreshold": "Soki sensibilite ya touch ya appareil na yo ezali makasi mingi, bakisa motuya oyo mpo na kopekisa mouvement ya touch oyo esalemi na libunga.", - "info-scroll-settings": "Ba paramɛtrɛ oyo ezali na ba paramètres ya kokita, bakisa mpe kokanga milongo ya makomi.", - "info-animation": "Soki application ezali kosala malɛmbɛ, kangá animation.", - "info-quicktoolstriggermode": "Soki bouton ya bisaleli ya mbangu ezali kosala te, meká kobongola motuya oyo.", - "info-checkForAppUpdates": "Tala automatiquement soki ba mises à jour ya application ezali.", - "info-quickTools": "Lakisa to bomba ba outils ya noki.", - "info-showHiddenFiles": "Lakisa ba fichiers mpe ba dossiers oyo ebombami. (Bandaka na .)", - "info-listFiles": "Tanga automatiquement ba fichiers nyonso ntango dossier efungwami", - "info-all_file_access": "Pesa terminal accès na /sdcard mpe /storage.", - "info-fontSize": "Bonene ya makomi oyo esalelamaka mpo na kolakisa makomi.", - "info-fontFamily": "Lolenge ya makomi oyo esalelamaka mpo na kolakisa makomi.", - "info-theme": "Motó ya couleur ya terminal.", - "info-cursorStyle": "Lolenge ya curseur ntango terminal ezali na focus.", - "info-cursorInactiveStyle": "Lolenge ya curseur ntango terminal ezali na focus te.", - "info-fontWeight": "Bonene ya makomi oyo esalelamaka mpo na makomi oyo ezali minene te.", - "info-cursorBlink": "Soki curseur ekoti mpe ebimi.", - "info-scrollback": "Motango ya milongo oyo ebombamaka na terminal ntango ozali kokita.", - "info-tabStopWidth": "Bonene ya ba tab stops na terminal.", - "info-letterSpacing": "Esika oyo ezali kati ya makomi.", - "info-imageSupport": "Soki terminal ekoki kosala na bililingi.", - "info-fontLigatures": "Soki ba ligatures ya makomi efungwami na terminal.", - "info-confirmTabClose": "Senga kondimisa liboso ya kokanga ba onglets ya terminal.", - "info-backup": "Sala backup ya terminal.", - "info-restore": "Zongisa backup ya terminal.", - "info-uninstall": "Longola terminal.", - "owned": "Ezali ya ngai", - "api_error": "Serveur ya API ezali kosala te, meká lisusu nsima ya mwa ntango.", - "installed": "Etyami", - "all": "Nyonso", - "medium": "Ya kati-kati", - "refund": "Kozongisa mbongo", - "product not available": "Produit ezali te", - "no-product-info": "Produit oyo ezali te na mboka na yo sikoyo, meká lisusu na nsima.", - "close": "Kanga", - "explore": "Tala makambo mosusu", - "key bindings updated": "Ba raccourcis ya clavier ebongwani", - "search in files": "Luka na kati ya ba fichiers", - "exclude files": "Longola ba fichiers", - "include files": "Bakisa ba fichiers", - "search result": "{matches} ba résultats na {files} ba fichiers.", - "invalid regex": "Regex ezali na libunga: {message}.", - "bottom": "Na nse", - "save all": "Bomba nyonso", - "close all": "Kanga nyonso", - "unsaved files warning": "Ba fichiers mosusu ebombami nanu te. Finá 'OK' pona kopona nini osala, to 'Cancel' pona kozonga.", - "save all warning": "Oza na ntembe te ete olingi kobomba ba fichiers nyonso mpe kokanga yango? Likambo oyo ekoki kozongisama nsima te.", - "save all changes warning": "Oza na ntembe te ete olingi kobomba mbongwana nyonso ya ba fichiers?", - "close all warning": "Oza na ntembe te ete olingi kokanga ba fichiers nyonso? Mbongwana oyo ebombami te ekobunga mpe likambo oyo ekoki kozongisama nsima te.", - "refresh": "Zongisa", - "shortcut buttons": "Ba boutons ya raccourci", - "no result": "Eyano ezali te", - "searching...": "Koluka...", - "quicktools:ctrl-key": "Fungola ya Control/Command", - "quicktools:tab-key": "Fungola tab", - "quicktools:shift-key": "Fungola Shift", - "quicktools:undo": "Zongisa nsima", - "quicktools:redo": "Zongisa lisusu", - "quicktools:search": "Luka na fichier", - "quicktools:save": "Bomba fichier", - "quicktools:esc-key": "Fungola Escape", - "quicktools:curlybracket": "Kotisa ba accolade", - "quicktools:squarebracket": "Kotisa ba parenthèses carrées", - "quicktools:parentheses": "Kotisa ba parenthèse", - "quicktools:anglebracket": "Kotisa ba parenthèses angulaires", - "quicktools:left-arrow-key": "Flèche ya mwasi", - "quicktools:right-arrow-key": "Flèche ya mobali", - "quicktools:up-arrow-key": "Flèche likolo", - "quicktools:down-arrow-key": "Flèche na nse", - "quicktools:moveline-up": "Tombola ligne likolo", - "quicktools:moveline-down": "Kitisa ligne na nse", - "quicktools:copyline-up": "Kopi ligne likolo", - "quicktools:copyline-down": "Kopi ligne na nse", - "quicktools:semicolon": "Kotisa elembo ya point-virgule", - "quicktools:quotation": "Kotisa elembo ya citation", - "quicktools:and": "Kotisa elembo ya mpe", - "quicktools:bar": "Kotisa elembo ya barre", - "quicktools:equal": "Kotisa elembo ya ekokani", - "quicktools:slash": "Kotisa elembo ya slash", - "quicktools:exclamation": "Kotisa elembo ya exclamation", - "quicktools:alt-key": "Alt", - "quicktools:meta-key": "Windows/Meta", - "quicktools:search-prev": "Match oyo eleki", - "quicktools:search-next": "Match oyo elandi", - "quicktools:search-settings": "Ba paramɛtrɛ ya boluki", - "quicktools:search-replace": "Zongisa", - "quicktools:search-replace-all": "Zongisa nyonso", - "info-quicktoolssettings": "Bongisa ba boutons ya shortcuts mpe ba touches ya clavier na esika ya Quicktools oyo ezali na nse ya éditeur mpo na kobongisa ndenge ya kosala code.", - "info-excludefolders": "Salelá modèle **/node_modules/** mpo na koboya ba fichiers nyonso ya dossier node_modules. Ba fichiers yango ekomonana te na liste mpe ekosala te na boluki ya ba fichiers.", - "missed files": "Ba fichiers {count} etalelami nsima ya kobanda boluki mpe ekotisami te na boluki.", - "remove": "Longola", - "quicktools:command-palette": "Palette ya mitindo", - "default file encoding": "Encodage ya fichier ya liboso", - "remove entry": "Oza na ntembe te ete olingi kolongola '{name}' na ba chemins oyo ebombami? Koboma chemin yango moko te.", - "delete entry": "Ndima koboma: '{name}'. Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", - "change encoding": "Fungola lisusu '{file}' na encodage '{encoding}'? Likambo oyo ekobungisa mbongwana nyonso oyo ebombami nanu te. Olingi kokoba?", - "reopen file": "Oza na ntembe te ete olingi kofungola lisusu '{file}'? Mbongwana nyonso oyo ebombami nanu te ekobunga.", - "plugin min version": "{name} ezali kaka na Acode - {v-code} mpe ba versions ya likolo. Finá awa mpo na kosala mbongwana.", - "color preview": "Botali liboso ya langi", - "confirm": "Kondimisa", - "problems": "Mikakatano", - "show side buttons": "Lakisa ba boutons ya pembeni", - "bug_report": "Tinda rapɔ́rɛ ya libunga", - "verified publisher": "Mobimisi oyo andimami", - "most_downloaded": "Ekitisami mingi", - "newly_added": "Ebakisami sika", - "top_rated": "Oyo etangami malamu mingi", - "rename not supported": "Kobongola kombo na dossier ya Termux yango esungami te", - "compress": "Kokitisa bonene", - "copy uri": "Kopi URI", - "delete entries": "Oza na ntembe te ete olingi kolongola biloko {count}?", - "deleting items": "Kolongola biloko {count}...", - "import project zip": "Kokɔtisa projet (zip)", - "changelog": "Mbongwana ya version", - "notifications": "Mayebisi", - "no_unread_notifications": "Ezali na ba notifications oyo etángami te te", - "should_use_current_file_for_preview": "Esengeli kosalela fichier oyo ezali sikoyo mpo na preview na esika ya index.html ya liboso.", - "fade fold widgets": "Kokitisa polele ba widgets ya fold", - "quicktools:home-key": "Home", - "quicktools:end-key": "End", - "quicktools:pageup-key": "PageUp", - "quicktools:pagedown-key": "PageDown", - "quicktools:delete-key": "Longola", - "quicktools:tilde": "Kotisa elembo ya tilde", - "quicktools:backtick": "Kotisa backtick", - "quicktools:hash": "Kotisa elembo ya hash", - "quicktools:dollar": "Kotisa elembo ya dollar", - "quicktools:modulo": "Kotisa elembo ya modulo/pourcentage", - "quicktools:caret": "Kotisa elembo ya caret", - "plugin_enabled": "Plugin efungwami", - "plugin_disabled": "Plugin ekangami", - "enable_plugin": "Fungola plugin oyo", - "disable_plugin": "Kanga plugin oyo", - "open_source": "Open source", - "terminal settings": "Paramɛtrɛ ya terminal", - "font ligatures": "Ba ligatures ya makomi", - "letter spacing": "Espace kati ya balɛ́tɛ́lɛ", - "terminal:tab stop width": "Bonene ya tab stop", - "terminal:scrollback": "Milongo ya scrollback", - "terminal:cursor blink": "Kongenga ya curseur", - "terminal:font weight": "Bonene ya makomi", - "terminal:cursor inactive style": "Lolenge ya curseur oyo ezali inactif", - "terminal:cursor style": "Lolenge ya curseur", - "terminal:font family": "Libota ya makomi", - "terminal:convert eol": "Bongola suka ya ligne", - "terminal:confirm tab close": "Ndima kokanga onglet ya terminal", - "terminal:image support": "Lisungi ya bililingi", - "terminal": "Terminal", - "terminal not installed prompt": "Terminal etyá te. Olingi kobanda yango sikawa ?", - "terminal first launch prompt": "Environnement ya terminal etyá te. Ezali kopesa yo nzela ya kosalela ba commands, SSH mpe ba scripts. Olingi kotya yango sikawa ?", - "allFileAccess": "Accès na ba fichiers nyonso", - "fonts": "Makomi", - "sponsor": "Kosalisa", - "downloads": "Ba téléchargements", - "reviews": "Ba avis", - "overview": "Botali ya mobimba", - "contributors": "Bato oyo basalisaki", - "quicktools:hyphen": "Kotisa trait d'union", - "check for app updates": "Tala ba mises à jour ya application", - "prompt update check consent message": "Acode ekoki kotala ba mises à jour ya application ntango ozali na internet. Olingi kofungola botali ya ba mises à jour?", - "keywords": "Maloba ya ntina", - "author": "Mokomi", - "filtered by": "Eponami na", - "clean install state": "Ezalela ya installation ya pamba", - "backup created": "Backup esalemi", - "restore completed": "Zongisi esili", - "restore will include": "Oyo ekozongisa", - "restore warning": "Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", - "reload to apply": "Zongisa mpo na kosalela mbongwana?", - "reload app": "Kozongisa application", - "preparing backup": "Kobongisa backup", - "collecting settings": "Kozwa ba paramɛtrɛ", - "collecting key bindings": "Kozwa ba raccourcis", - "collecting plugins": "Kozwa makambo ya ba plugin", - "creating backup": "Kosala fichier ya backup", - "validating backup": "Kotalela backup", - "restoring key bindings": "Kozongisa ba raccourcis", - "restoring plugins": "Kozongisa ba plugins", - "restoring settings": "Kozongisa ba paramɛtrɛ", - "legacy backup warning": "Oyo ezali format ya backup ya kala. Ba fonctionnalités mosusu ekoki kozala limitées.", - "checksum mismatch": "Makambo ya checksum ekokani te - fichier ya backup ekoki kozala ebongisami to ebebisami.", - "plugin not found": "Plugin ezwami te na registre", - "paid plugin skipped": "Plugin ya kofuta - kosomba ezwami te", - "source not found": "Fichier source ezali lisusu te", - "restored": "Ezongisami", - "skipped": "Eleki", - "backup not valid object": "Fichier ya backup ezali objet ya malamu te", - "backup no data": "Fichier ya backup ezali na ba données ya kozongisa te", - "backup legacy warning": "Oyo ezali format ya backup ya kala (v1). Ba fonctionnalités mosusu ekoki kozala limitées.", - "backup missing metadata": "Ba informations ya backup ezali te - makambo mosusu ekoki kozanga.", - "backup checksum mismatch": "Checksum ekokani te - fichier ya backup ekoki kozala ebongwani to ebebi. Keba liboso ya kokoba.", - "backup checksum verify failed": "Kotalisa checksum elongi te", - "backup invalid settings": "Format ya ba paramɛtrɛ ezali na libunga", - "backup invalid keybindings": "Format ya ba keyboard shortcuts ezali na libunga", - "backup invalid plugins": "Format ya ba plugins oyo etiemami ezali na libunga", - "issues found": "Mikakatano emonani", - "error details": "Makambo ya libunga", - "active tools": "Bisaleli oyo ezali kosala", - "available tools": "Ba outils oyo ezali", - "recent": "Ba fichiers ya sika", - "command palette": "Fungola menu ya ba commandes", - "change theme": "Bobongola motó", - "documentation": "Mikanda ya lisungi", - "open in terminal": "Fungola na terminal", - "developer mode": "Mode ya developer", - "info-developermode": "Fungola ba outils ya developer (Eruda) pona ko déboguer ba plugins mpe kotala ezalela ya application. Inspecteur ekofungwama tango application ebandi.", - "developer mode enabled": "Mode ya developer efungwami. Salela palette ya mitindo mpo na kofungola to kokanga inspecteur (Ctrl+Shift+I).", - "developer mode disabled": "Mode ya developer ekangami", - "copy relative path": "Kopi nzela relatif", - "shortcut request sent": "Bosengi ya raccourci etindami. Finá Ajouter mpo na kosilisa.", - "add to home screen": "Bakisa na écran d'accueil", - "pin shortcuts not supported": "Ba shortcuts ya écran d'accueil esimbami te na appareil oyo.", - "save file before home shortcut": "Bomba fichier liboso ya kobakisa yango na écran d'accueil.", - "terminal_required_message_for_lsp": "Terminal ezali installed te. Install terminal liboso mpo na kosalela ba serveurs LSP.", - "shift click selection": "Poná na Shift + click", - "earn ad-free time": "Zwa ntango kozanga bapub", - "indent guides": "Ba guide ya kokɔtisa molɔngɔ", - "language servers": "Ba serveurs ya monoko", - "lint gutter": "Lakisa ba erreurs ya lint", - "rainbow brackets": "Ba parenthèses ya balangi", - "lsp-add-custom-server": "Bakisa serveur personnalisé", - "lsp-binary-args": "Ba arguments ya binaire (JSON array)", - "lsp-binary-command": "Command ya binaire", - "lsp-binary-path-optional": "Nzela ya binaire (ekoki kozala te)", - "lsp-check-command-optional": "Command ya kotala (option ya kobongola)", - "lsp-checking-installation-status": "Kotala ezalela ya installation...", - "lsp-configured": "Ebongisami", - "lsp-custom-server-added": "Serveur personnalisé ebakisami", - "lsp-default": "Ya liboso", - "lsp-details-line": "Makambo: {details}", - "lsp-edit-initialization-options": "Bongola ba options ya kobanda", - "lsp-empty": "Ezali mpamba", - "lsp-enabled": "Efongwami", - "lsp-error-add-server-failed": "Ekoki te kobakisa serveur.", - "lsp-error-args-must-be-array": "Ba arguments esengeli kozala tableau ya JSON", - "lsp-error-binary-command-required": "Command binary esengeli", - "lsp-error-language-id-required": "Esengeli kozala na ID moko ya monoko ata moko", - "lsp-error-package-required": "Esengeli kozala na package ata moko", - "lsp-error-server-id-required": "ID ya serveur esengeli", - "lsp-feature-completion": "Kosilisa code automatiquement", - "lsp-feature-completion-info": "Fungola ba suggestions ya autocomplete oyo ewutaka na serveur.", - "lsp-feature-diagnostics": "Botali mabunga", - "lsp-feature-diagnostics-info": "Lakisa ba erreurs mpe ba avertissements oyo ewutaka na serveur ya langue.", - "lsp-feature-formatting": "Bobongisi format", - "lsp-feature-formatting-info": "Fungola formatage ya code oyo ewutaka na serveur ya langue.", - "lsp-feature-hover": "Makambo ya code", - "lsp-feature-hover-info": "Lakisa ba informations ya type mpe documentation tango ozali kosala hover.", - "lsp-feature-inlay-hints": "Bilembo ya lisungi", - "lsp-feature-inlay-hints-info": "Lakisa ba informations ya lolenge ya code na kati ya éditeur.", - "lsp-feature-signature": "Lisungi ya signature", - "lsp-feature-signature-info": "Lakisa ba indications ya ba paramɛtrɛ ya fonction tango ozali kokoma.", - "lsp-feature-state-toast": "{feature} {state}", - "lsp-initialization-options": "Ba options ya kobanda", - "lsp-initialization-options-json": "Ba options ya kobanda (JSON)", - "lsp-initialization-options-updated": "Ba options ya kobanda ebongwani", - "lsp-install-command": "Command ya installation", - "lsp-install-command-unavailable": "Command ya installation ezali te.", - "lsp-install-info-check-failed": "Acode ekoki te kotala soki installation esili malamu.", - "lsp-install-info-missing": "Serveur ya monoko etiemami te na environnement ya terminal.", - "lsp-install-info-ready": "Serveur ya monoko etiemami mpe ezali prêt.", - "lsp-install-info-unknown": "Ezalela ya installation ekoki kotala yango automatiquement te.", - "lsp-install-info-version-available": "Version {version} ezali.", - "lsp-install-notification": "{server} language server is not installed. Tap to install.", - "lsp-install-method-apk": "Package APK", - "lsp-install-method-cargo": "Package Cargo", - "lsp-install-method-manual": "Binaire ya mabɔkɔ", - "lsp-install-method-npm": "Package npm", - "lsp-install-method-pip": "Package pip", - "lsp-install-method-shell": "Shell personnalisé", - "lsp-install-method-title": "Lolenge ya installation", - "lsp-install-repair": "Kotia / kobongisa", - "lsp-installation-status": "Ezalela ya installation", - "lsp-installed": "Eteni", - "lsp-invalid-timeout": "Motuya ya timeout ezali na libunga", - "lsp-language-ids": "Ba ID ya monoko (ekabolami na virgule)", - "lsp-packages-prompt": "Ba packages {method} (ekabwani na virgule)", - "lsp-remove-installed-files": "Longola ba fichiers installés pona {server}?", - "lsp-server-disabled-toast": "Serveur ekangami", - "lsp-server-enabled-toast": "Serveur efungwami", - "lsp-server-id": "ID ya serveur", - "lsp-server-label": "Kombo ya serveur", - "lsp-server-not-found": "Serveur ezwami te", - "lsp-server-uninstalled": "Serveur elongolami", - "lsp-startup-timeout": "Ntango ya kozela na ebandeli", - "lsp-startup-timeout-ms": "Ntango ya kozela na ebandeli (millisecondes)", - "lsp-startup-timeout-set": "Ntango ya kozela etiamisami na {timeout} ms", - "lsp-state-disabled": "ekangami", - "lsp-state-enabled": "efungwami", - "lsp-status": "Ezalela", - "lsp-status-check-failed": "Kotalela elongi te", - "lsp-status-installed": "Eteni", - "lsp-status-installed-version": "Etyami ({version})", - "lsp-status-line": "Ezali: {status}", - "lsp-status-not-installed": "Etyami te", - "lsp-status-unknown": "Eyebani te", - "lsp-timeout-ms": "{timeout} ms", - "lsp-uninstall-command-unavailable": "Command ya kolongola ezali te", - "lsp-uninstall-notification": "Finá mpo na kolongola serveur ya monoko {server}.", - "lsp-uninstall-server": "Longola serveur", - "lsp-update-command-optional": "Command ya mbongwana (option ya kobongisa)", - "lsp-update-command-unavailable": "Command ya mbongwana ezali te.", - "lsp-update-server": "Mbongwana ya serveur", - "lsp-version-line": "Version: {version}", - "lsp-view-initialization-options": "Talá ba options ya kobanda", - "settings-category-about-acode": "Mpo na Acode", - "settings-category-discover-apps": "Tala ba applications mosusu", - "settings-category-advanced": "Ya likolo", - "settings-category-assistance": "Lisungi", - "settings-category-core": "Paramɛtrɛ ya moboko", - "settings-category-cursor": "Curseur", - "settings-category-cursor-selection": "Curseur mpe kopona", - "settings-category-custom-servers": "Ba serveurs oyo ebongisami na moto", - "settings-category-customization-tools": "Bobongisi mpe bisaleli", - "settings-category-display": "Emoniseli", - "settings-category-editing": "Bobongisi", - "settings-category-features": "Makoki", - "settings-category-files-sessions": "Ba fichiers mpe ba sessions", - "settings-category-fonts": "Makomi", - "settings-category-general": "Ya monene", - "settings-category-guides-indicators": "Ba guides mpe bilembo", - "settings-category-installation": "Botie", - "settings-category-interface": "Interface", - "settings-category-maintenance": "Bobongisi mpe bobateli", - "settings-category-permissions": "Ndingisa", - "settings-category-preview": "Botali liboso", - "settings-category-scrolling": "Kokita", - "settings-category-server": "Serveur", - "settings-category-servers": "Ba serveurs", - "settings-category-session": "Session", - "settings-category-support-acode": "Sunga Acode", - "settings-category-text-layout": "Bobongisi ya makomi", - "settings-info-app-animation": "Kamba ba animation ya transition na kati ya application nyonso.", - "settings-info-app-check-files": "Zongisa ba éditeur soki ba fichier ebongwani libanda ya Acode.", - "settings-info-app-clean-install-state": "Longola ezalela ya installation oyo ebombami mpo na setup.", - "settings-info-app-confirm-on-exit": "Senga kondimisa liboso ya kokanga application.", - "settings-info-app-console": "Pona console ya débogage oyo Acode esalela.", - "settings-info-app-default-file-encoding": "Encodage ya liboso tango ya kofungola to kosala ba fichier.", - "settings-info-app-exclude-folders": "Longola ba dossier mpe ba modèle tango ya koluka.", - "settings-info-app-floating-button": "Lakisa bouton flottant ya ba actions ya noki.", - "settings-info-app-font-manager": "Kotia, kokamba to kolongola ba polices ya application.", - "settings-info-app-fullscreen": "Bomba barre ya système ntango ozali kosalela Acode.", - "settings-info-app-keybindings": "Bongola fichier ya ba raccourcis to zongisa yango na ndenge ya liboso.", - "settings-info-app-keyboard-mode": "Pona ndenge clavier ya logiciel esalaka ntango ozali kobongisa code.", - "settings-info-app-language": "Pona monoko ya application mpe ba labels oyo ebongolami.", - "settings-info-app-open-file-list-position": "Pona esika liste ya ba fichiers actifs ekomonana.", - "settings-info-app-quick-tools-settings": "Bongola molongo mpe ndenge ya ba raccourcis ya ba outils ya mbangu.", - "settings-info-app-quick-tools-trigger-mode": "Pona ndenge ba outils ya noki efungwamaka na touche to na kosimba écran.", - "settings-info-app-remember-files": "Fungola lisusu ba fichiers oyo ezalaki ya kofungwama mbala ya suka.", - "settings-info-app-remember-folders": "Fungola lisusu ba dossiers ya session oyo eleki.", - "settings-info-app-retry-remote-fs": "Meka lisusu ba opérations ya fichiers distants nsima ya transfert oyo elongi te.", - "settings-info-app-side-buttons": "Lakisa ba boutons ya actions ya kobakisa pembeni ya éditeur.", - "settings-info-app-sponsor-sidebar": "Lakisa sponsor na sidebar.", - "settings-info-app-touch-move-threshold": "Mouvement moke oyo esengeli liboso ya koyeba déplacement ya touch.", - "settings-info-app-vibrate-on-tap": "Fungola vibration ya appareil tango ozali kosimba ba boutons mpe ba contrôles.", - "settings-info-editor-autosave": "Bomba mbongwana automatiquement nsima ya mwa ntango.", - "settings-info-editor-color-preview": "Tala ba valeur ya langi na kati ya éditeur.", - "settings-info-editor-fade-fold-widgets": "Kitisa pole ya bilembo ya fold soki esengeli te.", - "settings-info-editor-font-family": "Pona lolenge ya police oyo esalelami na éditeur.", - "settings-info-editor-font-size": "Bongola bonene ya makomi ya éditeur.", - "settings-info-editor-format-on-save": "Sala formatage tango nyonso fichier ebombami.", - "settings-info-editor-hard-wrap": "Kotisa ba saut ya ligne ya solo na esika ya kaka kokanga yango na komona.", - "settings-info-editor-indent-guides": "Lakisa ba lignes ya guide ya indentation.", - "settings-info-editor-line-height": "Bongola espace ya likolo mpe ya se kati ya ba ligne.", - "settings-info-editor-line-numbers": "Lakisa mituya ya ba lignes pembeni ya éditeur.", - "settings-info-editor-lint-gutter": "Lakisa ba erreurs, ba diagnostics mpe ba marqueurs ya lint pembeni ya éditeur.", - "settings-info-editor-live-autocomplete": "Lakisa ba suggestions ntango ozali kokoma.", - "settings-info-editor-rainbow-brackets": "Pesa balangisi ya langi na ba crochet oyo ekokani na profondeur.", - "settings-info-editor-relative-line-numbers": "Lakisa distance uta na ligne oyo ozali kosalela.", - "settings-info-editor-rtl-text": "Bongola ndenge ya kokoma droite na gauche mpo na ligne moko na moko.", - "settings-info-editor-scroll-settings": "Bongola bonene ya barre ya défilement, vitesse mpe ndenge ya kosalela yango.", - "settings-info-editor-shift-click-selection": "Bakisa sélection na Shift + kosimba to kofina.", - "settings-info-editor-show-spaces": "Lakisa bilembo oyo emonisaka ba espaces mpe ba saut ya ligne.", - "settings-info-editor-soft-tab": "Kotisa ba espaces na esika ya ba caractères tab.", - "settings-info-editor-tab-size": "Pona motango ya ba espaces oyo tab moko esalela.", - "settings-info-editor-teardrop-size": "Bongola bonene ya poignée ya curseur mpo na édition na touch.", - "settings-info-editor-text-wrap": "Kanga ba ligne milayi na kati ya éditeur.", - "settings-info-lsp-add-custom-server": "Bakisa serveur ya langue personnalisé na ba commandes ya installation, mbongwana mpe lancement.", - "settings-info-lsp-edit-init-options": "Bongola ba options ya kobanda lokola JSON.", - "settings-info-lsp-install-server": "Kotia to kobongisa serveur oyo ya langue.", - "settings-info-lsp-server-enabled": "Kofungola to kokanga serveur oyo ya monoko.", - "settings-info-lsp-startup-timeout": "Pona tango oyo Acode ekoki kozela mpo serveur ebanda.", - "settings-info-lsp-uninstall-server": "Longola ba paquets to ba fichiers exécutables oyo ebombami mpo na serveur oyo.", - "settings-info-lsp-update-server": "Kobongisa serveur oyo ya monoko soki lolenge ya kobongisa ezali.", - "settings-info-lsp-view-init-options": "Tala ba options ya kobanda oyo ezali kosala lokola JSON.", - "settings-info-main-ad-rewards": "Tala ba publicité mpo na kozwa accès sans publicité mpo na mwa tango.", - "settings-info-main-app-settings": "Monoko, ndenge application esalaka mpe ba outils ya accès rapide.", - "settings-info-main-backup-restore": "Bimisa ba paramɛtrɛ na backup to zongisa yango sima.", - "settings-info-main-changelog": "Tala ba mbongwana ya sika mpe ba notes ya version.", - "settings-info-main-edit-settings": "Bongola fichier settings.json brut directement.", - "settings-info-main-editor-settings": "Ba police, ba tabs, ba suggestions mpe ndenge éditeur emonanaka.", - "settings-info-main-formatter": "Pona formatter pona langage moko na moko oyo esungami.", - "settings-info-main-lsp-settings": "Bongisa ba serveur ya monoko mpe mayele ya éditeur.", - "settings-info-main-plugins": "Tambwisa ba plugins oyo etiemi mpe misala na yango.", - "settings-info-main-preview-settings": "Mode ya preview, ba port ya serveur mpe ndenge navigateur esalaka.", - "settings-info-main-rateapp": "Pesa Acode note na Google Play.", - "settings-info-main-remove-ads": "Fungola accès ya libela sans publicité.", - "settings-info-main-reset": "Zongisa Acode na ba paramètres ya liboso.", - "settings-info-main-sponsors": "Sunga bokoli ya Acode oyo ezali kokoba.", - "settings-info-main-terminal-settings": "Motó ya terminal, police, curseur mpe ndenge session esalaka.", - "settings-info-main-theme": "Motó ya application, contraste mpe ba langi oyo ebongisami.", - "settings-info-preview-disable-cache": "Zongisa ntango nyonso makambo ya sika na navigateur ya kati ya application.", - "settings-info-preview-host": "Nkombo ya hôte oyo esalelami ntango URL ya preview efungwami.", - "settings-info-preview-mode": "Pona esika preview ekofungwama ntango obandi yango.", - "settings-info-preview-preview-port": "Port oyo serveur ya preview na tango ya solo esalelaka.", - "settings-info-preview-server-port": "Port oyo serveur ya kati ya application esalelaka.", - "settings-info-preview-show-console-toggler": "Lakisa bouton ya console na preview.", - "settings-info-preview-use-current-file": "Pona liboso fichier oyo ezali sikoyo ntango obandi preview.", - "settings-info-terminal-convert-eol": "Bongola ba suka ya ba lignes ntango ozali kokanga to kolakisa makambo ya terminal.", - "settings-note-formatter-settings": "Pesa formatter na monoko moko na moko. Installer ba plugins ya formatter mpo na kozwa ba options mosusu.", - "settings-note-lsp-settings": "Ba serveurs ya langue ebakisaka autocomplete, diagnostics, ba informations ya hover mpe makambo mosusu. Esalaka malamu mingi na ba dossiers oyo terminal intégré ya Acode ekoki kokoma directement, lokola ba dossiers terminal/public. Ba emplacements SAF, externes mpe distants etikalamaka na libanda automatiquement mpo bakoki kosalela ba chemins ya cache to virtuels; activer option ya compatibilité kaka soki olingi komeka yango.", - "search result label singular": "mbano", - "search result label plural": "mbano", - "pin tab": "Kangisa onglet", - "unpin tab": "Longola onglet na biloko ekangami", - "pinned tab": "Onglet ekangami", - "unpin tab before closing": "Longola tab na pin liboso ya kokanga yango.", - "app font": "Makomi ya application", - "settings-info-app-font-family": "Pona police oyo esalelami na interface mobimba ya application.", - "lsp-transport-method-stdio": "STDIO (bandisa commande ya binaire)", - "lsp-transport-method-websocket": "WebSocket (kota na URL ws/wss)", - "lsp-websocket-url": "URL ya WebSocket", - "lsp-websocket-server-managed-externally": "Serveur oyo etambwisami libanda na nzela ya WebSocket.", - "lsp-error-websocket-url-invalid": "URL ya WebSocket esengeli kobanda na ws:// to wss://", - "lsp-error-websocket-url-required": "URL ya WebSocket esengeli", - "lsp-remove-custom-server": "Longola serveur personnalisé", - "lsp-remove-custom-server-confirm": "Longola serveur personnalisé ya langage {server}?", - "lsp-custom-server-removed": "Serveur personnalisé elongolami", - "settings-info-lsp-remove-custom-server": "Longola serveur ya langue personnalisé oyo na Acode.", - "unsaved selected tabs warning": "Ba tabs mosusu oyo oponi ebombami nanu te. Pona nini osengeli kosala.", - "save selected tabs": "Bomba ba onglets oyo oponi", - "close selected tabs": "Kanga ba onglets oyo oponi", - "save selected tabs warning": "Oza na ntembe te ete olingi kobomba mpe kokanga ba tabs oyo oponi?", - "close selected tabs warning": "Oza na ntembe te ete olingi kokanga ba tabs oyo oponi? Mbongwana oyo ebombami nanu te ekobunga mpe likambo oyo ekoki kozongisama te.", - "close tabs to right": "Kanga oyo ezali na droite", - "close tabs to left": "Kanga oyo ezali na gauche", - "close other tabs": "Kanga ba onglets mosusu", - "auto close tags": "Kanga ba tags automatiquement", - "settings-info-editor-auto-close-tags": "Kotisa automatiquement ba balises ya kokanga na HTML, XML, Vue, Angular mpe PHP.", - "ui zoom": "Zoom ya interface", - "settings-info-app-ui-zoom": "Bongola bonene ya makomi na interface mobimba ya Acode.", - "plugin-not-supported": "Plugin oyo endimami te", - "plugin-not-supported-info": "Plugin esalemaki pona version ya kala ya Acode.", - "login-to-view": "Kota na compte mpo na komona yango...", - "show share button": "Lakisa bouton ya kokabola", - "settings-info-editor-show-share-button": "Lakisa bouton ya partage na menu ya sélection.", - "iap-plugin-purchase-warning": "Ba plugins oyo osombi ebongisami te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", - "iap-pro-purchase-warning": "Bosombi oyo ekobongisama te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", - "confirm-login": "Okoti nanu te na Acode, olingi kokota sikoyo?", - "local word completion": "Bobongisi ya maloba ya fichier", - "language package completion": "Bobongisi ya package ya lokota", - "settings-info-editor-local-word-completion": "Pesa ba suggestions ya maloba oyo ezali na fichier oyo ozali kosalela.", - "settings-info-editor-language-completion": "Pesaka ba mots ya ntina, ba snippets mpe ba suggestions ya CodeMirror.", - "terminal:failsafe-info": "Bandisa terminal na shell ya système", - "auto rename tags": "Bongola kombo ya ba tags automatiquement", - "settings-info-editor-auto-rename-tags": "Bongola kombo ya balise oyo ekokani tango ozali kobongisa ba balise ya HTML.", - "copying items": "Kokopa biloko {count}...", - "cannot paste folder into itself": "Okoki te ko coller dossier na kati na yango moko", - "folder already exists": "Dossier ezali déjà", - "file already exists force named": "'{name}' ezali deja. Olingi kokoma likolo na yango?", - "lsp-allow-non-terminal-workspace": "Tika LSP esala na ba dossiers ya libanda", - "settings-info-lsp-allow-non-terminal-workspace": "Pesa nzela na ba serveur ya monoko mpo na SAF, bisika ya libanda mpe bisika ya mosika. LSP esalaka na terminal ya kati ya Acode, yango ekoki kosala ete makambo mosusu esalaka malamu te.", - "don't ask again": "Kotuna lisusu te", - "scrollbar height": "Molai ya barre ya bokitisaka", - "full": "Mobimba", - "scroll past end": "Koba kokita koleka suka", - "settings-info-scroll-past-end": "Bakisa esika ya pamba na nse ya éditeur mpo okoka komema molongo ya suka likolo.", - "compact": "Kokómisa mokuse", - "off": "Ekangami", - "quick tools height": "Molai ya bisaleli ya mbangu", - "quick tools toggler": "Bascule ya bisaleli ya mbangu", - "running processes": "Ba processus oyo ezali kosala", - "recommend extensions": "Tinda ba extensions", - "settings-info-editor-recommend-extensions": "Pesaka ba plugins tango fichier efungwami lokola texte pamba mpo na kozanga mode ya monoko.", - "extension recommendation title": "Ba extensions ezali mpo na {extension}", - "extension recommendation message": "Mode ya syntax etiemami te mpo na {extension}. Luka ba plugins mpo na \"{keyword}\".", - "extension request title": "Extension ezwamaki te mpo na {extension}", - "extension request message": "Senga plugin mpo Acode ekoka kolakisa lolenge oyo ya fichier.", - "search plugins": "Luka ba plugins", - "request plugin": "Senga plugin", - "terminal:block": "Bloc", - "terminal:underline": "Mokomi na nse", - "terminal:bar": "Barre", - "terminal:inactive block": "Bloc", - "terminal:inactive underline": "Mokomi na nse", - "terminal:inactive bar": "Barre", - "terminal:inactive none": "Eloko moko te", - "terminal:normal": "Ya momesano", - "terminal:bold": "Makomi minene", - "quicktools-trigger:click": "Finá", - "quicktools-trigger:touch": "Kosimba", - "settings-info-terminal-uninstall": "Oza na ntembe te ete olingi kolongola terminal?", - "terminal:inactive outline": "Ndelo", - "restored successfully": "Terminal ezongisami na elonga", - "uninstalled successfully": "Terminal elongolami na elonga", - "enter plugin source": "Kota source ya plugin", - "enter keywords": "Kota ba maloba ya ntina", - "enter author name": "Kota kombo ya mokomi", - "update available": "Mbongwana ya sika ezali", - "update available info": "Acode {version} ezali sikoyo! Finá awa mpo na kotala yango.", - "plugin updates": "Ba mbongwana ya ba plugins", - "plugin updates singular": "Plugin 1 ezali na version ya sika.", - "plugin updates plural": "Ba plugins {count} ezali na ba versions ya sika.", - "just now": "Sikawa kaka", - "day singular": "Eleki mokolo {count}", - "hour singular": "Eleki ngonga {count}", - "min singular": "Eleki miniti {count}", - "day plural": "Eleki mikolo {count}", - "hour plural": "Eleki bangonga {count}", - "min plural": "Eleki baminiti {count}", - "settings-category-builtin-servers": "Ba serveurs oyo etongami na kati", - "settings-category-plugin-servers": "Ba serveurs ya ba plugins", - "new name": "Kombo ya sika", - "enter new name": "Koma kombo ya sika", - "code actions": "Misala ya code", - "active processes": "Ba processus oyo ezali kosala", - "total memory": "Mémoire mobimba", - "uptime": "Ntango ya mosala", - "note": "Likebisi", - "acode main process": "Processus monene ya Acode", - "ppid parent": "PPID (Moboti)", - "unknown": "Eyebani te", - "just started": "Ebandi sikawa", - "diff days": "Eleki mikolo {days}, bangonga {hr}", - "diff hr": "Eleki {hr}h {min}m", - "diff min": "Eleki {min}m {sec}s", - "diff sec": "Eleki {sec}s", - "command": "Mitindo", - "managed": "Etambwisami", - "acode service": "Service ya Acode", - "info-terminal-show-scrollbar": "Lakisa scrollbar ya xterm pembeni ya terminal.", - "terminal:show scrollbar": "Lakisa barre ya défilement", - "apply exclusions when copying": "Salela ba exclusions ntango ozali kokopa", - "settings-info-app-use-file-operation-exclusions": "Pusa ba fichier mpe ba dossier oyo ekokani na ba règles ya exclusion tango ya kopiya mpe kokanga.", - "horizontal scroll margin": "Marge ya kokita na ngámbo", - "settings-info-horizontal-scroll-margin": "Bakisa esika ya pamba nsima ya ligne oyo eleki molai ntango retour à la ligne ezali kosalelama te. Tia motuya mobimba ya pixels oyo ezali négatif te.", - "conflict error": "Matata! Zela liboso ya kosala commit mosusu.", - "terminal:failsafe": "Mode FailSafe", - "app icon": "App icon", - "app icon changed": "App icon changed", - "settings-info-app-icon": "Choose the app icon displayed on your device.", - "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", - "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", - "rewarded ad failed": "The ad could not be completed. Please try again.", - "rewarded ad incomplete": "Finish watching the ad to earn the reward.", - "unable to delete file": "unable to delete file", - "optional": "optional", - "purchase pending": "purchase pending", - "cancelled": "cancelled", - "plugin-review:dialog-label": "Plugin reviews", - "plugin-review:account-check-failed": "Unable to check your account. Try again.", - "plugin-review:sign-in": "Sign in to review", - "plugin-review:edit": "Edit your review", - "plugin-review:add": "Add a review...", - "plugin-review:placeholder": "Share your experience...", - "plugin-review:input-label": "Plugin review", - "plugin-review:vote-group-label": "Vote", - "plugin-review:thumbs-up": "Thumbs up", - "plugin-review:thumbs-down": "Thumbs down", - "plugin-review:delete": "Delete review", - "plugin-review:load-failed": "Unable to load reviews.", - "plugin-review:retry": "Retry", - "plugin-review:empty-title": "No reviews yet", - "plugin-review:empty-description": "Be the first to share your experience.", - "plugin-review:yours": "Your review", - "plugin-review:community": "Community reviews", - "plugin-review:no-other-reviews": "No other reviews yet.", - "plugin-review:login-incomplete": "Login was not completed.", - "plugin-review:sign-in-failed": "Unable to sign in.", - "plugin-review:session-expired-review": "Your session expired. Sign in again to review.", - "plugin-review:save-failed": "Unable to save review.", - "plugin-review:delete-confirmation": "Delete your review? This cannot be undone.", - "plugin-review:session-expired-continue": "Your session expired. Sign in again to continue.", - "plugin-review:delete-failed": "Unable to delete review.", - "plugin-review:you": "You", - "plugin-review:edit-action": "Edit review", - "plugin-review:recommended": "Recommended this plugin", - "plugin-review:error-max-length": "Review must be {max} characters or less.", - "plugin-review:error-downvote-comment": "Tell the developer what could be improved.", - "plugin-review:error-empty": "Add a comment or choose thumbs up.", - "plugin-review:unrated": "Unrated" -} \ No newline at end of file + "lang": "Lingala", + "about": "Mpo na yango", + "active files": "Ba fichier efungwami", + "alert": "Likebisi", + "app theme": "Motó ya application", + "autocorrect": "Pesa nzela na bobongisi ya automatique ?", + "autosave": "Kobomba yango moko", + "cancel": "Tika", + "change language": "Bobongola monoko", + "choose color": "Pona langi moko", + "clear": "Longola", + "close app": "Kanga app ?", + "commit message": "Nsango ya commit", + "console": "Konsole", + "copy": "Kopi", + "create folder error": "Ekoki, te kosala dossier ya sika.", + "cut": "Kata", + "delete": "Longola", + "dependencies": "Ba dépendance", + "delay": "Ntango ya kozela na millisecondes", + "editor settings": "Paramɛtrɛ ya mobongisi", + "editor theme": "Motó ya mobongisi", + "enter file name": "Koma nkombo ya fichier", + "enter folder name": "Koma nkombo ya dossier", + "empty folder message": "Dossier ezali mpamba", + "enter line number": "Koma nimero ya ligne", + "error": "Libunga", + "failed": "Elongi te", + "file already exists": "Fichier ezali déjà", + "file already exists force": "Fichier ezali déjà. Kokoma lisusu?", + "file changed": " has been changed, reload file?", + "file deleted": "Fichier elongolami", + "file is not supported": "Fichier oyo esungami te", + "file not supported": "Lolenge ya fichier oyo esungami te.", + "file too large": "Fichier ezali monene mingi mpo na kosalela yango. Bonene ya likolo ezali {size}", + "file renamed": "Nkombo ya fichier ebongwani", + "file saved": "Fichier ebombami", + "folder added": "Dossier ebakisami", + "folder already added": "Dossier ebakisami déjà", + "font size": "Bonene ya makomi", + "goto": "Kende na ligne", + "icons definition": "Ndimbola ya bilembo", + "info": "Sango", + "invalid value": "Valeur ezali malamu te", + "language changed": "Monoko ebongwani malamu", + "linting": "Tala libunga ya syntaxe", + "logout": "Bima", + "loading": "Ezali kokɔtisa", + "my profile": "Profil na ngai", + "new file": "Fichier ya sika", + "new folder": "Dossier ya sika", + "no": "Te", + "no editor message": "Fungola to sala fichier mpe dossier ya sika na menu", + "not set": "Etamwisami te", + "unsaved files close app": "Ba fichiers mosusu ebombami nanu te. Kanga application?", + "notice": "Mayebisi", + "open file": "Fungola fichier", + "open files and folders": "Fungola ba fichiers mpe ba dossiers", + "open folder": "Fungola dossier", + "open recent": "Fungola oyo euti kosalelama sika", + "ok": "OK", + "overwrite": "Koma likolo", + "paste": "Kangisa", + "preview mode": "Mode ya botali liboso", + "read only file": "Ekoki te kobomba fichier ya kotanga kaka. Meká Bomba lokola", + "reload": "Zongisa", + "rename": "Pesa kombo mosusu", + "replace": "Zongisa na esika", + "required": "Esika oyo esengeli kotondisama", + "run your web app": "Tambwisa application web na yo", + "save": "Bomba", + "saving": "Ezali kobomba", + "save as": "Bomba lokola", + "save file to run": "Bomba fichier oyo liboso ya kotambwisa yango na navigateur", + "search": "Luka", + "see logs and errors": "Tala ba logs mpe mabunga", + "select folder": "Pona dossier", + "settings": "Paramɛtrɛ", + "settings saved": "Paramɛtrɛ ebombami", + "show line numbers": "Lakisa mituya ya ba lignes", + "show hidden files": "Lakisa ba fichiers oyo ebombami", + "show spaces": "Lakisa ba espaces", + "soft tab": "Tab ya pete", + "sort by name": "Tanda na kotalela kombo", + "success": "Esalemi malamu", + "tab size": "Bonene ya tab", + "text wrap": "Kokanga milongo ya makomi", + "theme": "Motema ya app", + "title-listfiles": "Tanga ba fichiers", + "unable to open file": "Limbisa, ekoki te kofungola fichier", + "unable to open folder": "Limbisa, ekoki te kofungola dossier", + "unable to save file": "Limbisa, ekoki te kobomba fichier", + "unable to rename": "Limbisa, ekoki te kobongola kombo", + "unsaved file": "Fichier oyo ebombami te, kanga yango kaka?", + "warning": "Likebisi", + "use emmet": "Salela Emmet", + "use quick tools": "Salela bisaleli ya mbangu", + "yes": "Iyo", + "encoding": "Encodage ya makomi", + "syntax highlighting": "Kopesa balangi na syntaxe", + "read only": "Kotanga kaka", + "select all": "Pona nyonso", + "select branch": "Pona branche", + "create new branch": "Sala branche ya sika", + "use branch": "Salela branche", + "new branch": "Branche ya sika", + "branch": "Branch", + "key bindings": "Ba raccourcis ya clavier", + "edit": "Bobongisi", + "reset": "Zongisa na ebandeli", + "color": "Langi", + "select word": "Pona liloba", + "quick tools": "Bisaleli ya mbangu", + "select": "Pona", + "editor font": "Police ya éditeur", + "new project": "Projet ya sika", + "format": "Lolenge", + "project name": "Kombo ya projet", + "unsupported device": "Appareil na yo endimi thème te.", + "vibrate on tap": "Vibrer ntango ozali kofina", + "copy command is not supported by ftp.": "Commande ya kopi esungami te na FTP.", + "support title": "Sunga Acode", + "fullscreen": "Ekran mobimba", + "animation": "Botambwisi", + "backup": "Kopi ya libateli", + "restore": "Zongisa", + "backup successful": "Backup esalemi malamu", + "invalid backup file": "Fichier ya backup ezali malamu te", + "add path": "Bakisa nzela", + "live autocompletion": "Autocomplétion ya mbala moko", + "file properties": "Bizaleli ya fichier", + "path": "Nzela", + "type": "Lolenge", + "word count": "Motango ya maloba", + "line count": "Motango ya milɔngɔ", + "last modified": "Ebongisami mbala ya nsuka", + "size": "Bonene", + "share": "Kabola", + "show print margin": "Lakisa marge ya impression", + "login": "Kota", + "scrollbar size": "Bonene ya barre ya kokitisa", + "cursor controller size": "Bonene ya contrôleur ya curseur", + "none": "Eloko moko te", + "small": "Moke", + "large": "Monene", + "confirm on exit": "Kondimisa liboso ya kobima", + "show console": "Lakisa console", + "image": "Elilingi", + "insert file": "Kotisa fichier", + "insert color": "Kotisa langi", + "powersave mode warning": "Kanga mode ya kobomba nguya mpo na kotala na navigateur ya libanda.", + "exit": "Bima", + "custom": "Ya moto", + "reset warning": "Oza na ntembe te ete olingi kozongisa thème na ebandeli?", + "theme type": "Lolenge ya thème", + "light": "Pole", + "dark": "Molili", + "file browser": "Navigateur ya ba fichiers", + "operation not permitted": "Opération epesami nzela te", + "no such file or directory": "Fichier to dossier yango ezali te", + "input/output error": "Libunga ya entrée/sortie", + "permission denied": "Ndingisa eboyami", + "bad address": "Adresse ezali malamu te", + "file exists": "Fichier ezali", + "not a directory": "Ezali dossier te", + "is a directory": "Ezali dossier", + "invalid argument": "Argument ezali malamu te", + "too many open files in system": "Ba fichiers mingi efungwami na système", + "too many open files": "Ba fichiers mingi efungwami", + "text file busy": "Fichier ya makomi ezali kosalelama", + "no space left on device": "Esika etikali te na appareil", + "read-only file system": "Système ya fichiers ya kotanga kaka", + "file name too long": "Kombo ya fichier ezali molai mingi", + "too many users": "Basaleli bazali mingi", + "connection timed out": "Ntango ya connexion esili", + "connection refused": "Connexion eboyami", + "owner died": "Nkolo akufi", + "an error occurred": "Libunga moko esalemi", + "add ftp": "Bakisa FTP", + "add sftp": "Bakisa SFTP", + "save file": "Bomba fichier", + "save file as": "Bomba fichier lokola", + "files": "Ba fichiers", + "help": "Lisungi", + "file has been deleted": "{file} has been deleted!", + "feature not available": "Makoki oyo ezali te.", + "feature available in paid version": "Makoki oyo ezali kaka na version ya kofuta ya application.", + "deleted file": "Fichier elongolami", + "line height": "Molai ya ligne", + "preview info": "Soki olingi kosala fichier oyo ezali kosala, finá mpe simbá elembo ya kobɛta.", + "manage all files": "Pesa Acode nzela ya kokamba ba fichiers nyonso na paramètres mpo na kobongisa ba fichiers na appareil na yo na pete.", + "close file": "Kanga fichier", + "reset connections": "Zongisa ba connexions", + "check file changes": "Tala mbongwana ya fichier", + "open in browser": "Fungola na navigateur", + "desktop mode": "Mode ordinateur", + "toggle console": "Bongola console", + "new line mode": "Mode ya ligne ya sika", + "add a storage": "Bakisa esika ya kobomba", + "rate acode": "Pesa Acode note", + "support": "Lisungi", + "downloading file": "Ezali kokitisa {file}", + "downloading...": "Ezali kokɔtisa...", + "folder name": "Kombo ya dossier", + "keyboard mode": "Mode ya clavier", + "normal": "Ya momesano", + "app settings": "Paramɛtrɛ ya application", + "disable in-app-browser caching": "Kanga cache ya navigateur ya kati ya application", + "copied to clipboard": "Ekopedami na presse-papier", + "clipboard not available": "Clipboard ezali te.", + "remember opened files": "Kanisa ba fichiers oyo efungwamaki", + "remember opened folders": "Kanisa ba dossiers oyo efungwamaki", + "no suggestions": "Ba suggestions ezali te", + "no suggestions aggressive": "Ba suggestions ya makasi ezali te", + "install": "Tia", + "installing": "Ezali kotia...", + "plugins": "Ba plugins", + "recently used": "Esalelami kala mingi te", + "update": "Bongisa", + "uninstall": "Longola", + "download acode pro": "Kokitisa Acode Pro", + "loading plugins": "Ezali kokɔtisa ba plugins", + "diagonal scrolling": "Kokita na diagonal", + "reverse scrolling": "Kokita na ngámbo ya inverse", + "formatter": "Formatter", + "format on save": "Sala format tango ya kobomba", + "remove ads": "Longola bapub", + "faqs": "Mituna oyo etunamaka mingi", + "feedback": "Makanisi", + "header": "Motó ya likoló", + "sidebar": "Barre ya pembeni", + "inapp": "Inapp", + "browser": "Navigateur", + "fast": "Nokí", + "slow": "Malɛmbɛ", + "scroll settings": "Paramɛtrɛ ya kokita", + "scroll speed": "Mbangu ya kokita", + "loading...": "Ezali kokɔtisa...", + "no plugins found": "Plugin moko te ezwami", + "name": "Kombo", + "username": "Kombo ya mosaleli", + "hostname": "Hostname", + "password": "Liloba ya sekele", + "security type": "Lolenge ya libateli", + "connection mode": "Mode ya connexion", + "port": "Port", + "key file": "Fichier ya fungola", + "select key file": "Pona fichier ya fungola", + "passphrase": "Maloba ya sekele", + "connecting...": "Ezali kokangisa...", + "type filename": "Koma kombo ya fichier", + "unable to load files": "Ekoki te kokɔtisa ba fichiers", + "preview port": "Port ya botali liboso", + "find file": "Luka fichier", + "system": "Sistɛmi", + "please select a formatter": "Pona formatter moko", + "case sensitive": "Kotalela makomi minene mpe mike", + "regular expression": "Regular expression", + "whole word": "Liloba mobimba", + "edit with": "Bongisa na", + "open with": "Fungola na", + "no app found to handle this file": "Application moko te ezwami mpo na kofungola fichier oyo", + "restore default settings": "Zongisa ba paramɛtrɛ ya liboso", + "server port": "Port ya serveur", + "preview settings": "Ba paramɛtrɛ ya botali liboso", + "preview settings note": "Soki port ya preview mpe port ya serveur ekeseni, application ekobanda serveur te mpe ekofungola https://: na navigateur to navigateur ya kati ya application. Yango ezali na tina soki ozali kosalela serveur esika mosusu.", + "backup/restore note": "It will only backup your settings, custom theme, installed plugins and key bindings. It will not backup your FTP/SFTP or App state.", + "host": "Host", + "retry ftp/sftp when fail": "Meka FTP/SFTP lisusu soki elongi te", + "more": "Mosusu", + "thank you :)": "Matondi :)", + "local": "Ya mboka", + "remote": "Ya mosika", + "show console toggler": "Lakisa bouton ya console", + "binary file": "Fichier oyo ezali na ba données binaires, olingi kofungola yango?", + "relative line numbers": "Mituya ya ba lignes na kotalela ligne oyo ezali sikoyo", + "elastic tabstops": "Ba tab stops oyo ebongwanaka", + "line based rtl switching": "Kobongola RTL na kotalela ligne", + "hard wrap": "Kokanga ligne na makasi", + "spellcheck": "Kotala mabunga ya makomi", + "wrap method": "Lolenge ya kokanga milongo", + "use textarea for ime": "Salela textarea mpo na IME", + "invalid plugin": "Plugin ezali malamu te", + "type command": "Koma command", + "plugin": "Plugin", + "quicktools trigger mode": "Lolenge ya kofungola bisaleli ya mbangu", + "print margin": "Marge ya impression", + "touch move threshold": "Limite ya mouvement ya touch", + "info-retryremotefsafterfail": "Meka lisusu connexion FTP/SFTP soki elongi te.", + "info-fullscreen": "Bomba barre ya motó na écran ya ebandeli.", + "info-checkfiles": "Tala mbongwana ya ba fichiers ntango application ezali na nsima.", + "info-console": "Pona console ya JavaScript. Console Legacy ezali ya liboso, mpe Eruda ezali console ya bato mosusu.", + "info-keyboardmode": "Keyboard mode for text input, no suggestions will hide suggestions and auto correct. If no suggestions does not work, try to change value to no suggestions aggressive.", + "info-rememberfiles": "Kanisa ba fichiers oyo efungwami ntango application ekangami.", + "info-rememberfolders": "Kanisa ba dossiers oyo efungwami ntango application ekangami.", + "info-floatingbutton": "Lakisa to bomba bouton flottant ya bisaleli ya mbangu.", + "info-openfilelistpos": "Esika ya kolakisa liste ya ba fichiers oyo ezali kosala.", + "info-touchmovethreshold": "Soki sensibilite ya touch ya appareil na yo ezali makasi mingi, bakisa motuya oyo mpo na kopekisa mouvement ya touch oyo esalemi na libunga.", + "info-scroll-settings": "Ba paramɛtrɛ oyo ezali na ba paramètres ya kokita, bakisa mpe kokanga milongo ya makomi.", + "info-animation": "Soki application ezali kosala malɛmbɛ, kangá animation.", + "info-quicktoolstriggermode": "Soki bouton ya bisaleli ya mbangu ezali kosala te, meká kobongola motuya oyo.", + "info-checkForAppUpdates": "Tala automatiquement soki ba mises à jour ya application ezali.", + "info-quickTools": "Lakisa to bomba ba outils ya noki.", + "info-showHiddenFiles": "Lakisa ba fichiers mpe ba dossiers oyo ebombami. (Bandaka na .)", + "info-listFiles": "Tanga automatiquement ba fichiers nyonso ntango dossier efungwami", + "info-all_file_access": "Pesa terminal accès na /sdcard mpe /storage.", + "info-fontSize": "Bonene ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-fontFamily": "Lolenge ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-theme": "Motó ya couleur ya terminal.", + "info-cursorStyle": "Lolenge ya curseur ntango terminal ezali na focus.", + "info-cursorInactiveStyle": "Lolenge ya curseur ntango terminal ezali na focus te.", + "info-fontWeight": "Bonene ya makomi oyo esalelamaka mpo na makomi oyo ezali minene te.", + "info-cursorBlink": "Soki curseur ekoti mpe ebimi.", + "info-scrollback": "Motango ya milongo oyo ebombamaka na terminal ntango ozali kokita.", + "info-tabStopWidth": "Bonene ya ba tab stops na terminal.", + "info-letterSpacing": "Esika oyo ezali kati ya makomi.", + "info-imageSupport": "Soki terminal ekoki kosala na bililingi.", + "info-fontLigatures": "Soki ba ligatures ya makomi efungwami na terminal.", + "info-confirmTabClose": "Senga kondimisa liboso ya kokanga ba onglets ya terminal.", + "info-backup": "Sala backup ya terminal.", + "info-restore": "Zongisa backup ya terminal.", + "info-uninstall": "Longola terminal.", + "owned": "Ezali ya ngai", + "api_error": "Serveur ya API ezali kosala te, meká lisusu nsima ya mwa ntango.", + "installed": "Etyami", + "all": "Nyonso", + "medium": "Ya kati-kati", + "refund": "Kozongisa mbongo", + "product not available": "Produit ezali te", + "no-product-info": "Produit oyo ezali te na mboka na yo sikoyo, meká lisusu na nsima.", + "close": "Kanga", + "explore": "Tala makambo mosusu", + "key bindings updated": "Ba raccourcis ya clavier ebongwani", + "search in files": "Luka na kati ya ba fichiers", + "exclude files": "Longola ba fichiers", + "include files": "Bakisa ba fichiers", + "search result": "{matches} ba résultats na {files} ba fichiers.", + "invalid regex": "Regex ezali na libunga: {message}.", + "bottom": "Na nse", + "save all": "Bomba nyonso", + "close all": "Kanga nyonso", + "unsaved files warning": "Ba fichiers mosusu ebombami nanu te. Finá 'OK' pona kopona nini osala, to 'Cancel' pona kozonga.", + "save all warning": "Oza na ntembe te ete olingi kobomba ba fichiers nyonso mpe kokanga yango? Likambo oyo ekoki kozongisama nsima te.", + "save all changes warning": "Oza na ntembe te ete olingi kobomba mbongwana nyonso ya ba fichiers?", + "close all warning": "Oza na ntembe te ete olingi kokanga ba fichiers nyonso? Mbongwana oyo ebombami te ekobunga mpe likambo oyo ekoki kozongisama nsima te.", + "refresh": "Zongisa", + "shortcut buttons": "Ba boutons ya raccourci", + "no result": "Eyano ezali te", + "searching...": "Koluka...", + "quicktools:ctrl-key": "Fungola ya Control/Command", + "quicktools:tab-key": "Fungola tab", + "quicktools:shift-key": "Fungola Shift", + "quicktools:undo": "Zongisa nsima", + "quicktools:redo": "Zongisa lisusu", + "quicktools:search": "Luka na fichier", + "quicktools:save": "Bomba fichier", + "quicktools:esc-key": "Fungola Escape", + "quicktools:curlybracket": "Kotisa ba accolade", + "quicktools:squarebracket": "Kotisa ba parenthèses carrées", + "quicktools:parentheses": "Kotisa ba parenthèse", + "quicktools:anglebracket": "Kotisa ba parenthèses angulaires", + "quicktools:left-arrow-key": "Flèche ya mwasi", + "quicktools:right-arrow-key": "Flèche ya mobali", + "quicktools:up-arrow-key": "Flèche likolo", + "quicktools:down-arrow-key": "Flèche na nse", + "quicktools:moveline-up": "Tombola ligne likolo", + "quicktools:moveline-down": "Kitisa ligne na nse", + "quicktools:copyline-up": "Kopi ligne likolo", + "quicktools:copyline-down": "Kopi ligne na nse", + "quicktools:semicolon": "Kotisa elembo ya point-virgule", + "quicktools:quotation": "Kotisa elembo ya citation", + "quicktools:and": "Kotisa elembo ya mpe", + "quicktools:bar": "Kotisa elembo ya barre", + "quicktools:equal": "Kotisa elembo ya ekokani", + "quicktools:slash": "Kotisa elembo ya slash", + "quicktools:exclamation": "Kotisa elembo ya exclamation", + "quicktools:alt-key": "Alt", + "quicktools:meta-key": "Windows/Meta", + "quicktools:search-prev": "Match oyo eleki", + "quicktools:search-next": "Match oyo elandi", + "quicktools:search-settings": "Ba paramɛtrɛ ya boluki", + "quicktools:search-replace": "Zongisa", + "quicktools:search-replace-all": "Zongisa nyonso", + "info-quicktoolssettings": "Bongisa ba boutons ya shortcuts mpe ba touches ya clavier na esika ya Quicktools oyo ezali na nse ya éditeur mpo na kobongisa ndenge ya kosala code.", + "info-excludefolders": "Salelá modèle **/node_modules/** mpo na koboya ba fichiers nyonso ya dossier node_modules. Ba fichiers yango ekomonana te na liste mpe ekosala te na boluki ya ba fichiers.", + "missed files": "Ba fichiers {count} etalelami nsima ya kobanda boluki mpe ekotisami te na boluki.", + "remove": "Longola", + "quicktools:command-palette": "Palette ya mitindo", + "default file encoding": "Encodage ya fichier ya liboso", + "remove entry": "Oza na ntembe te ete olingi kolongola '{name}' na ba chemins oyo ebombami? Koboma chemin yango moko te.", + "delete entry": "Ndima koboma: '{name}'. Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "change encoding": "Fungola lisusu '{file}' na encodage '{encoding}'? Likambo oyo ekobungisa mbongwana nyonso oyo ebombami nanu te. Olingi kokoba?", + "reopen file": "Oza na ntembe te ete olingi kofungola lisusu '{file}'? Mbongwana nyonso oyo ebombami nanu te ekobunga.", + "plugin min version": "{name} ezali kaka na Acode - {v-code} mpe ba versions ya likolo. Finá awa mpo na kosala mbongwana.", + "color preview": "Botali liboso ya langi", + "confirm": "Kondimisa", + "problems": "Mikakatano", + "show side buttons": "Lakisa ba boutons ya pembeni", + "bug_report": "Tinda rapɔ́rɛ ya libunga", + "verified publisher": "Mobimisi oyo andimami", + "most_downloaded": "Ekitisami mingi", + "newly_added": "Ebakisami sika", + "top_rated": "Oyo etangami malamu mingi", + "rename not supported": "Kobongola kombo na dossier ya Termux yango esungami te", + "compress": "Kokitisa bonene", + "copy uri": "Kopi URI", + "delete entries": "Oza na ntembe te ete olingi kolongola biloko {count}?", + "deleting items": "Kolongola biloko {count}...", + "import project zip": "Kokɔtisa projet (zip)", + "changelog": "Mbongwana ya version", + "notifications": "Mayebisi", + "no_unread_notifications": "Ezali na ba notifications oyo etángami te te", + "should_use_current_file_for_preview": "Esengeli kosalela fichier oyo ezali sikoyo mpo na preview na esika ya index.html ya liboso.", + "fade fold widgets": "Kokitisa polele ba widgets ya fold", + "quicktools:home-key": "Home", + "quicktools:end-key": "End", + "quicktools:pageup-key": "PageUp", + "quicktools:pagedown-key": "PageDown", + "quicktools:delete-key": "Longola", + "quicktools:tilde": "Kotisa elembo ya tilde", + "quicktools:backtick": "Kotisa backtick", + "quicktools:hash": "Kotisa elembo ya hash", + "quicktools:dollar": "Kotisa elembo ya dollar", + "quicktools:modulo": "Kotisa elembo ya modulo/pourcentage", + "quicktools:caret": "Kotisa elembo ya caret", + "plugin_enabled": "Plugin efungwami", + "plugin_disabled": "Plugin ekangami", + "enable_plugin": "Fungola plugin oyo", + "disable_plugin": "Kanga plugin oyo", + "open_source": "Open source", + "terminal settings": "Paramɛtrɛ ya terminal", + "font ligatures": "Ba ligatures ya makomi", + "letter spacing": "Espace kati ya balɛ́tɛ́lɛ", + "terminal:tab stop width": "Bonene ya tab stop", + "terminal:scrollback": "Milongo ya scrollback", + "terminal:cursor blink": "Kongenga ya curseur", + "terminal:font weight": "Bonene ya makomi", + "terminal:cursor inactive style": "Lolenge ya curseur oyo ezali inactif", + "terminal:cursor style": "Lolenge ya curseur", + "terminal:font family": "Libota ya makomi", + "terminal:convert eol": "Bongola suka ya ligne", + "terminal:confirm tab close": "Ndima kokanga onglet ya terminal", + "terminal:image support": "Lisungi ya bililingi", + "terminal": "Terminal", + "terminal not installed prompt": "Terminal etyá te. Olingi kobanda yango sikawa ?", + "terminal first launch prompt": "Environnement ya terminal etyá te. Ezali kopesa yo nzela ya kosalela ba commands, SSH mpe ba scripts. Olingi kotya yango sikawa ?", + "allFileAccess": "Accès na ba fichiers nyonso", + "fonts": "Makomi", + "sponsor": "Kosalisa", + "downloads": "Ba téléchargements", + "reviews": "Ba avis", + "overview": "Botali ya mobimba", + "contributors": "Bato oyo basalisaki", + "quicktools:hyphen": "Kotisa trait d'union", + "check for app updates": "Tala ba mises à jour ya application", + "prompt update check consent message": "Acode ekoki kotala ba mises à jour ya application ntango ozali na internet. Olingi kofungola botali ya ba mises à jour?", + "keywords": "Maloba ya ntina", + "author": "Mokomi", + "filtered by": "Eponami na", + "clean install state": "Ezalela ya installation ya pamba", + "backup created": "Backup esalemi", + "restore completed": "Zongisi esili", + "restore will include": "Oyo ekozongisa", + "restore warning": "Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "reload to apply": "Zongisa mpo na kosalela mbongwana?", + "reload app": "Kozongisa application", + "preparing backup": "Kobongisa backup", + "collecting settings": "Kozwa ba paramɛtrɛ", + "collecting key bindings": "Kozwa ba raccourcis", + "collecting plugins": "Kozwa makambo ya ba plugin", + "creating backup": "Kosala fichier ya backup", + "validating backup": "Kotalela backup", + "restoring key bindings": "Kozongisa ba raccourcis", + "restoring plugins": "Kozongisa ba plugins", + "restoring settings": "Kozongisa ba paramɛtrɛ", + "legacy backup warning": "Oyo ezali format ya backup ya kala. Ba fonctionnalités mosusu ekoki kozala limitées.", + "checksum mismatch": "Makambo ya checksum ekokani te - fichier ya backup ekoki kozala ebongisami to ebebisami.", + "plugin not found": "Plugin ezwami te na registre", + "paid plugin skipped": "Plugin ya kofuta - kosomba ezwami te", + "source not found": "Fichier source ezali lisusu te", + "restored": "Ezongisami", + "skipped": "Eleki", + "backup not valid object": "Fichier ya backup ezali objet ya malamu te", + "backup no data": "Fichier ya backup ezali na ba données ya kozongisa te", + "backup legacy warning": "Oyo ezali format ya backup ya kala (v1). Ba fonctionnalités mosusu ekoki kozala limitées.", + "backup missing metadata": "Ba informations ya backup ezali te - makambo mosusu ekoki kozanga.", + "backup checksum mismatch": "Checksum ekokani te - fichier ya backup ekoki kozala ebongwani to ebebi. Keba liboso ya kokoba.", + "backup checksum verify failed": "Kotalisa checksum elongi te", + "backup invalid settings": "Format ya ba paramɛtrɛ ezali na libunga", + "backup invalid keybindings": "Format ya ba keyboard shortcuts ezali na libunga", + "backup invalid plugins": "Format ya ba plugins oyo etiemami ezali na libunga", + "issues found": "Mikakatano emonani", + "error details": "Makambo ya libunga", + "active tools": "Bisaleli oyo ezali kosala", + "available tools": "Ba outils oyo ezali", + "recent": "Ba fichiers ya sika", + "command palette": "Fungola menu ya ba commandes", + "change theme": "Bobongola motó", + "documentation": "Mikanda ya lisungi", + "open in terminal": "Fungola na terminal", + "developer mode": "Mode ya developer", + "info-developermode": "Fungola ba outils ya developer (Eruda) pona ko déboguer ba plugins mpe kotala ezalela ya application. Inspecteur ekofungwama tango application ebandi.", + "developer mode enabled": "Mode ya developer efungwami. Salela palette ya mitindo mpo na kofungola to kokanga inspecteur (Ctrl+Shift+I).", + "developer mode disabled": "Mode ya developer ekangami", + "copy relative path": "Kopi nzela relatif", + "shortcut request sent": "Bosengi ya raccourci etindami. Finá Ajouter mpo na kosilisa.", + "add to home screen": "Bakisa na écran d'accueil", + "pin shortcuts not supported": "Ba shortcuts ya écran d'accueil esimbami te na appareil oyo.", + "save file before home shortcut": "Bomba fichier liboso ya kobakisa yango na écran d'accueil.", + "terminal_required_message_for_lsp": "Terminal ezali installed te. Install terminal liboso mpo na kosalela ba serveurs LSP.", + "shift click selection": "Poná na Shift + click", + "earn ad-free time": "Zwa ntango kozanga bapub", + "indent guides": "Ba guide ya kokɔtisa molɔngɔ", + "language servers": "Ba serveurs ya monoko", + "lint gutter": "Lakisa ba erreurs ya lint", + "rainbow brackets": "Ba parenthèses ya balangi", + "lsp-add-custom-server": "Bakisa serveur personnalisé", + "lsp-binary-args": "Ba arguments ya binaire (JSON array)", + "lsp-binary-command": "Command ya binaire", + "lsp-binary-path-optional": "Nzela ya binaire (ekoki kozala te)", + "lsp-check-command-optional": "Command ya kotala (option ya kobongola)", + "lsp-checking-installation-status": "Kotala ezalela ya installation...", + "lsp-configured": "Ebongisami", + "lsp-custom-server-added": "Serveur personnalisé ebakisami", + "lsp-default": "Ya liboso", + "lsp-details-line": "Makambo: {details}", + "lsp-edit-initialization-options": "Bongola ba options ya kobanda", + "lsp-empty": "Ezali mpamba", + "lsp-enabled": "Efongwami", + "lsp-error-add-server-failed": "Ekoki te kobakisa serveur.", + "lsp-error-args-must-be-array": "Ba arguments esengeli kozala tableau ya JSON", + "lsp-error-binary-command-required": "Command binary esengeli", + "lsp-error-language-id-required": "Esengeli kozala na ID moko ya monoko ata moko", + "lsp-error-package-required": "Esengeli kozala na package ata moko", + "lsp-error-server-id-required": "ID ya serveur esengeli", + "lsp-feature-completion": "Kosilisa code automatiquement", + "lsp-feature-completion-info": "Fungola ba suggestions ya autocomplete oyo ewutaka na serveur.", + "lsp-feature-diagnostics": "Botali mabunga", + "lsp-feature-diagnostics-info": "Lakisa ba erreurs mpe ba avertissements oyo ewutaka na serveur ya langue.", + "lsp-feature-formatting": "Bobongisi format", + "lsp-feature-formatting-info": "Fungola formatage ya code oyo ewutaka na serveur ya langue.", + "lsp-feature-hover": "Makambo ya code", + "lsp-feature-hover-info": "Lakisa ba informations ya type mpe documentation tango ozali kosala hover.", + "lsp-feature-inlay-hints": "Bilembo ya lisungi", + "lsp-feature-inlay-hints-info": "Lakisa ba informations ya lolenge ya code na kati ya éditeur.", + "lsp-feature-signature": "Lisungi ya signature", + "lsp-feature-signature-info": "Lakisa ba indications ya ba paramɛtrɛ ya fonction tango ozali kokoma.", + "lsp-feature-state-toast": "{feature} {state}", + "lsp-initialization-options": "Ba options ya kobanda", + "lsp-initialization-options-json": "Ba options ya kobanda (JSON)", + "lsp-initialization-options-updated": "Ba options ya kobanda ebongwani", + "lsp-install-command": "Command ya installation", + "lsp-install-command-unavailable": "Command ya installation ezali te.", + "lsp-install-info-check-failed": "Acode ekoki te kotala soki installation esili malamu.", + "lsp-install-info-missing": "Serveur ya monoko etiemami te na environnement ya terminal.", + "lsp-install-info-ready": "Serveur ya monoko etiemami mpe ezali prêt.", + "lsp-install-info-unknown": "Ezalela ya installation ekoki kotala yango automatiquement te.", + "lsp-install-info-version-available": "Version {version} ezali.", + "lsp-install-notification": "{server} language server is not installed. Tap to install.", + "lsp-install-method-apk": "Package APK", + "lsp-install-method-cargo": "Package Cargo", + "lsp-install-method-manual": "Binaire ya mabɔkɔ", + "lsp-install-method-npm": "Package npm", + "lsp-install-method-pip": "Package pip", + "lsp-install-method-shell": "Shell personnalisé", + "lsp-install-method-title": "Lolenge ya installation", + "lsp-install-repair": "Kotia / kobongisa", + "lsp-installation-status": "Ezalela ya installation", + "lsp-installed": "Eteni", + "lsp-invalid-timeout": "Motuya ya timeout ezali na libunga", + "lsp-language-ids": "Ba ID ya monoko (ekabolami na virgule)", + "lsp-packages-prompt": "Ba packages {method} (ekabwani na virgule)", + "lsp-remove-installed-files": "Longola ba fichiers installés pona {server}?", + "lsp-server-disabled-toast": "Serveur ekangami", + "lsp-server-enabled-toast": "Serveur efungwami", + "lsp-server-id": "ID ya serveur", + "lsp-server-label": "Kombo ya serveur", + "lsp-server-not-found": "Serveur ezwami te", + "lsp-server-uninstalled": "Serveur elongolami", + "lsp-startup-timeout": "Ntango ya kozela na ebandeli", + "lsp-startup-timeout-ms": "Ntango ya kozela na ebandeli (millisecondes)", + "lsp-startup-timeout-set": "Ntango ya kozela etiamisami na {timeout} ms", + "lsp-state-disabled": "ekangami", + "lsp-state-enabled": "efungwami", + "lsp-status": "Ezalela", + "lsp-status-check-failed": "Kotalela elongi te", + "lsp-status-installed": "Eteni", + "lsp-status-installed-version": "Etyami ({version})", + "lsp-status-line": "Ezali: {status}", + "lsp-status-not-installed": "Etyami te", + "lsp-status-unknown": "Eyebani te", + "lsp-timeout-ms": "{timeout} ms", + "lsp-uninstall-command-unavailable": "Command ya kolongola ezali te", + "lsp-uninstall-notification": "Finá mpo na kolongola serveur ya monoko {server}.", + "lsp-uninstall-server": "Longola serveur", + "lsp-update-command-optional": "Command ya mbongwana (option ya kobongisa)", + "lsp-update-command-unavailable": "Command ya mbongwana ezali te.", + "lsp-update-server": "Mbongwana ya serveur", + "lsp-version-line": "Version: {version}", + "lsp-view-initialization-options": "Talá ba options ya kobanda", + "settings-category-about-acode": "Mpo na Acode", + "settings-category-discover-apps": "Tala ba applications mosusu", + "settings-category-advanced": "Ya likolo", + "settings-category-assistance": "Lisungi", + "settings-category-core": "Paramɛtrɛ ya moboko", + "settings-category-cursor": "Curseur", + "settings-category-cursor-selection": "Curseur mpe kopona", + "settings-category-custom-servers": "Ba serveurs oyo ebongisami na moto", + "settings-category-customization-tools": "Bobongisi mpe bisaleli", + "settings-category-display": "Emoniseli", + "settings-category-editing": "Bobongisi", + "settings-category-features": "Makoki", + "settings-category-files-sessions": "Ba fichiers mpe ba sessions", + "settings-category-fonts": "Makomi", + "settings-category-general": "Ya monene", + "settings-category-guides-indicators": "Ba guides mpe bilembo", + "settings-category-installation": "Botie", + "settings-category-interface": "Interface", + "settings-category-maintenance": "Bobongisi mpe bobateli", + "settings-category-permissions": "Ndingisa", + "settings-category-preview": "Botali liboso", + "settings-category-scrolling": "Kokita", + "settings-category-server": "Serveur", + "settings-category-servers": "Ba serveurs", + "settings-category-session": "Session", + "settings-category-support-acode": "Sunga Acode", + "settings-category-text-layout": "Bobongisi ya makomi", + "settings-info-app-animation": "Kamba ba animation ya transition na kati ya application nyonso.", + "settings-info-app-check-files": "Zongisa ba éditeur soki ba fichier ebongwani libanda ya Acode.", + "settings-info-app-clean-install-state": "Longola ezalela ya installation oyo ebombami mpo na setup.", + "settings-info-app-confirm-on-exit": "Senga kondimisa liboso ya kokanga application.", + "settings-info-app-console": "Pona console ya débogage oyo Acode esalela.", + "settings-info-app-default-file-encoding": "Encodage ya liboso tango ya kofungola to kosala ba fichier.", + "settings-info-app-exclude-folders": "Longola ba dossier mpe ba modèle tango ya koluka.", + "settings-info-app-floating-button": "Lakisa bouton flottant ya ba actions ya noki.", + "settings-info-app-font-manager": "Kotia, kokamba to kolongola ba polices ya application.", + "settings-info-app-fullscreen": "Bomba barre ya système ntango ozali kosalela Acode.", + "settings-info-app-keybindings": "Bongola fichier ya ba raccourcis to zongisa yango na ndenge ya liboso.", + "settings-info-app-keyboard-mode": "Pona ndenge clavier ya logiciel esalaka ntango ozali kobongisa code.", + "settings-info-app-language": "Pona monoko ya application mpe ba labels oyo ebongolami.", + "settings-info-app-open-file-list-position": "Pona esika liste ya ba fichiers actifs ekomonana.", + "settings-info-app-quick-tools-settings": "Bongola molongo mpe ndenge ya ba raccourcis ya ba outils ya mbangu.", + "settings-info-app-quick-tools-trigger-mode": "Pona ndenge ba outils ya noki efungwamaka na touche to na kosimba écran.", + "settings-info-app-remember-files": "Fungola lisusu ba fichiers oyo ezalaki ya kofungwama mbala ya suka.", + "settings-info-app-remember-folders": "Fungola lisusu ba dossiers ya session oyo eleki.", + "settings-info-app-retry-remote-fs": "Meka lisusu ba opérations ya fichiers distants nsima ya transfert oyo elongi te.", + "settings-info-app-side-buttons": "Lakisa ba boutons ya actions ya kobakisa pembeni ya éditeur.", + "settings-info-app-sponsor-sidebar": "Lakisa sponsor na sidebar.", + "settings-info-app-touch-move-threshold": "Mouvement moke oyo esengeli liboso ya koyeba déplacement ya touch.", + "settings-info-app-vibrate-on-tap": "Fungola vibration ya appareil tango ozali kosimba ba boutons mpe ba contrôles.", + "settings-info-editor-autosave": "Bomba mbongwana automatiquement nsima ya mwa ntango.", + "settings-info-editor-color-preview": "Tala ba valeur ya langi na kati ya éditeur.", + "settings-info-editor-fade-fold-widgets": "Kitisa pole ya bilembo ya fold soki esengeli te.", + "settings-info-editor-font-family": "Pona lolenge ya police oyo esalelami na éditeur.", + "settings-info-editor-font-size": "Bongola bonene ya makomi ya éditeur.", + "settings-info-editor-format-on-save": "Sala formatage tango nyonso fichier ebombami.", + "settings-info-editor-hard-wrap": "Kotisa ba saut ya ligne ya solo na esika ya kaka kokanga yango na komona.", + "settings-info-editor-indent-guides": "Lakisa ba lignes ya guide ya indentation.", + "settings-info-editor-line-height": "Bongola espace ya likolo mpe ya se kati ya ba ligne.", + "settings-info-editor-line-numbers": "Lakisa mituya ya ba lignes pembeni ya éditeur.", + "settings-info-editor-lint-gutter": "Lakisa ba erreurs, ba diagnostics mpe ba marqueurs ya lint pembeni ya éditeur.", + "settings-info-editor-live-autocomplete": "Lakisa ba suggestions ntango ozali kokoma.", + "settings-info-editor-rainbow-brackets": "Pesa balangisi ya langi na ba crochet oyo ekokani na profondeur.", + "settings-info-editor-relative-line-numbers": "Lakisa distance uta na ligne oyo ozali kosalela.", + "settings-info-editor-rtl-text": "Bongola ndenge ya kokoma droite na gauche mpo na ligne moko na moko.", + "settings-info-editor-scroll-settings": "Bongola bonene ya barre ya défilement, vitesse mpe ndenge ya kosalela yango.", + "settings-info-editor-shift-click-selection": "Bakisa sélection na Shift + kosimba to kofina.", + "settings-info-editor-show-spaces": "Lakisa bilembo oyo emonisaka ba espaces mpe ba saut ya ligne.", + "settings-info-editor-soft-tab": "Kotisa ba espaces na esika ya ba caractères tab.", + "settings-info-editor-tab-size": "Pona motango ya ba espaces oyo tab moko esalela.", + "settings-info-editor-teardrop-size": "Bongola bonene ya poignée ya curseur mpo na édition na touch.", + "settings-info-editor-text-wrap": "Kanga ba ligne milayi na kati ya éditeur.", + "settings-info-lsp-add-custom-server": "Bakisa serveur ya langue personnalisé na ba commandes ya installation, mbongwana mpe lancement.", + "settings-info-lsp-edit-init-options": "Bongola ba options ya kobanda lokola JSON.", + "settings-info-lsp-install-server": "Kotia to kobongisa serveur oyo ya langue.", + "settings-info-lsp-server-enabled": "Kofungola to kokanga serveur oyo ya monoko.", + "settings-info-lsp-startup-timeout": "Pona tango oyo Acode ekoki kozela mpo serveur ebanda.", + "settings-info-lsp-uninstall-server": "Longola ba paquets to ba fichiers exécutables oyo ebombami mpo na serveur oyo.", + "settings-info-lsp-update-server": "Kobongisa serveur oyo ya monoko soki lolenge ya kobongisa ezali.", + "settings-info-lsp-view-init-options": "Tala ba options ya kobanda oyo ezali kosala lokola JSON.", + "settings-info-main-ad-rewards": "Tala ba publicité mpo na kozwa accès sans publicité mpo na mwa tango.", + "settings-info-main-app-settings": "Monoko, ndenge application esalaka mpe ba outils ya accès rapide.", + "settings-info-main-backup-restore": "Bimisa ba paramɛtrɛ na backup to zongisa yango sima.", + "settings-info-main-changelog": "Tala ba mbongwana ya sika mpe ba notes ya version.", + "settings-info-main-edit-settings": "Bongola fichier settings.json brut directement.", + "settings-info-main-editor-settings": "Ba police, ba tabs, ba suggestions mpe ndenge éditeur emonanaka.", + "settings-info-main-formatter": "Pona formatter pona langage moko na moko oyo esungami.", + "settings-info-main-lsp-settings": "Bongisa ba serveur ya monoko mpe mayele ya éditeur.", + "settings-info-main-plugins": "Tambwisa ba plugins oyo etiemi mpe misala na yango.", + "settings-info-main-preview-settings": "Mode ya preview, ba port ya serveur mpe ndenge navigateur esalaka.", + "settings-info-main-rateapp": "Pesa Acode note na Google Play.", + "settings-info-main-remove-ads": "Fungola accès ya libela sans publicité.", + "settings-info-main-reset": "Zongisa Acode na ba paramètres ya liboso.", + "settings-info-main-sponsors": "Sunga bokoli ya Acode oyo ezali kokoba.", + "settings-info-main-terminal-settings": "Motó ya terminal, police, curseur mpe ndenge session esalaka.", + "settings-info-main-theme": "Motó ya application, contraste mpe ba langi oyo ebongisami.", + "settings-info-preview-disable-cache": "Zongisa ntango nyonso makambo ya sika na navigateur ya kati ya application.", + "settings-info-preview-host": "Nkombo ya hôte oyo esalelami ntango URL ya preview efungwami.", + "settings-info-preview-mode": "Pona esika preview ekofungwama ntango obandi yango.", + "settings-info-preview-preview-port": "Port oyo serveur ya preview na tango ya solo esalelaka.", + "settings-info-preview-server-port": "Port oyo serveur ya kati ya application esalelaka.", + "settings-info-preview-show-console-toggler": "Lakisa bouton ya console na preview.", + "settings-info-preview-use-current-file": "Pona liboso fichier oyo ezali sikoyo ntango obandi preview.", + "settings-info-terminal-convert-eol": "Bongola ba suka ya ba lignes ntango ozali kokanga to kolakisa makambo ya terminal.", + "settings-note-formatter-settings": "Pesa formatter na monoko moko na moko. Installer ba plugins ya formatter mpo na kozwa ba options mosusu.", + "settings-note-lsp-settings": "Ba serveurs ya langue ebakisaka autocomplete, diagnostics, ba informations ya hover mpe makambo mosusu. Esalaka malamu mingi na ba dossiers oyo terminal intégré ya Acode ekoki kokoma directement, lokola ba dossiers terminal/public. Ba emplacements SAF, externes mpe distants etikalamaka na libanda automatiquement mpo bakoki kosalela ba chemins ya cache to virtuels; activer option ya compatibilité kaka soki olingi komeka yango.", + "search result label singular": "mbano", + "search result label plural": "mbano", + "pin tab": "Kangisa onglet", + "unpin tab": "Longola onglet na biloko ekangami", + "pinned tab": "Onglet ekangami", + "unpin tab before closing": "Longola tab na pin liboso ya kokanga yango.", + "app font": "Makomi ya application", + "settings-info-app-font-family": "Pona police oyo esalelami na interface mobimba ya application.", + "lsp-transport-method-stdio": "STDIO (bandisa commande ya binaire)", + "lsp-transport-method-websocket": "WebSocket (kota na URL ws/wss)", + "lsp-websocket-url": "URL ya WebSocket", + "lsp-websocket-server-managed-externally": "Serveur oyo etambwisami libanda na nzela ya WebSocket.", + "lsp-error-websocket-url-invalid": "URL ya WebSocket esengeli kobanda na ws:// to wss://", + "lsp-error-websocket-url-required": "URL ya WebSocket esengeli", + "lsp-remove-custom-server": "Longola serveur personnalisé", + "lsp-remove-custom-server-confirm": "Longola serveur personnalisé ya langage {server}?", + "lsp-custom-server-removed": "Serveur personnalisé elongolami", + "settings-info-lsp-remove-custom-server": "Longola serveur ya langue personnalisé oyo na Acode.", + "unsaved selected tabs warning": "Ba tabs mosusu oyo oponi ebombami nanu te. Pona nini osengeli kosala.", + "save selected tabs": "Bomba ba onglets oyo oponi", + "close selected tabs": "Kanga ba onglets oyo oponi", + "save selected tabs warning": "Oza na ntembe te ete olingi kobomba mpe kokanga ba tabs oyo oponi?", + "close selected tabs warning": "Oza na ntembe te ete olingi kokanga ba tabs oyo oponi? Mbongwana oyo ebombami nanu te ekobunga mpe likambo oyo ekoki kozongisama te.", + "close tabs to right": "Kanga oyo ezali na droite", + "close tabs to left": "Kanga oyo ezali na gauche", + "close other tabs": "Kanga ba onglets mosusu", + "auto close tags": "Kanga ba tags automatiquement", + "settings-info-editor-auto-close-tags": "Kotisa automatiquement ba balises ya kokanga na HTML, XML, Vue, Angular mpe PHP.", + "ui zoom": "Zoom ya interface", + "settings-info-app-ui-zoom": "Bongola bonene ya makomi na interface mobimba ya Acode.", + "plugin-not-supported": "Plugin oyo endimami te", + "plugin-not-supported-info": "Plugin esalemaki pona version ya kala ya Acode.", + "login-to-view": "Kota na compte mpo na komona yango...", + "show share button": "Lakisa bouton ya kokabola", + "settings-info-editor-show-share-button": "Lakisa bouton ya partage na menu ya sélection.", + "iap-plugin-purchase-warning": "Ba plugins oyo osombi ebongisami te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "iap-pro-purchase-warning": "Bosombi oyo ekobongisama te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "confirm-login": "Okoti nanu te na Acode, olingi kokota sikoyo?", + "local word completion": "Bobongisi ya maloba ya fichier", + "language package completion": "Bobongisi ya package ya lokota", + "settings-info-editor-local-word-completion": "Pesa ba suggestions ya maloba oyo ezali na fichier oyo ozali kosalela.", + "settings-info-editor-language-completion": "Pesaka ba mots ya ntina, ba snippets mpe ba suggestions ya CodeMirror.", + "terminal:failsafe-info": "Bandisa terminal na shell ya système", + "auto rename tags": "Bongola kombo ya ba tags automatiquement", + "settings-info-editor-auto-rename-tags": "Bongola kombo ya balise oyo ekokani tango ozali kobongisa ba balise ya HTML.", + "copying items": "Kokopa biloko {count}...", + "cannot paste folder into itself": "Okoki te ko coller dossier na kati na yango moko", + "folder already exists": "Dossier ezali déjà", + "file already exists force named": "'{name}' ezali deja. Olingi kokoma likolo na yango?", + "lsp-allow-non-terminal-workspace": "Tika LSP esala na ba dossiers ya libanda", + "settings-info-lsp-allow-non-terminal-workspace": "Pesa nzela na ba serveur ya monoko mpo na SAF, bisika ya libanda mpe bisika ya mosika. LSP esalaka na terminal ya kati ya Acode, yango ekoki kosala ete makambo mosusu esalaka malamu te.", + "don't ask again": "Kotuna lisusu te", + "scrollbar height": "Molai ya barre ya bokitisaka", + "full": "Mobimba", + "scroll past end": "Koba kokita koleka suka", + "settings-info-scroll-past-end": "Bakisa esika ya pamba na nse ya éditeur mpo okoka komema molongo ya suka likolo.", + "compact": "Kokómisa mokuse", + "off": "Ekangami", + "quick tools height": "Molai ya bisaleli ya mbangu", + "quick tools toggler": "Bascule ya bisaleli ya mbangu", + "running processes": "Ba processus oyo ezali kosala", + "recommend extensions": "Tinda ba extensions", + "settings-info-editor-recommend-extensions": "Pesaka ba plugins tango fichier efungwami lokola texte pamba mpo na kozanga mode ya monoko.", + "extension recommendation title": "Ba extensions ezali mpo na {extension}", + "extension recommendation message": "Mode ya syntax etiemami te mpo na {extension}. Luka ba plugins mpo na \"{keyword}\".", + "extension request title": "Extension ezwamaki te mpo na {extension}", + "extension request message": "Senga plugin mpo Acode ekoka kolakisa lolenge oyo ya fichier.", + "search plugins": "Luka ba plugins", + "request plugin": "Senga plugin", + "terminal:block": "Bloc", + "terminal:underline": "Mokomi na nse", + "terminal:bar": "Barre", + "terminal:inactive block": "Bloc", + "terminal:inactive underline": "Mokomi na nse", + "terminal:inactive bar": "Barre", + "terminal:inactive none": "Eloko moko te", + "terminal:normal": "Ya momesano", + "terminal:bold": "Makomi minene", + "quicktools-trigger:click": "Finá", + "quicktools-trigger:touch": "Kosimba", + "settings-info-terminal-uninstall": "Oza na ntembe te ete olingi kolongola terminal?", + "terminal:inactive outline": "Ndelo", + "restored successfully": "Terminal ezongisami na elonga", + "uninstalled successfully": "Terminal elongolami na elonga", + "enter plugin source": "Kota source ya plugin", + "enter keywords": "Kota ba maloba ya ntina", + "enter author name": "Kota kombo ya mokomi", + "update available": "Mbongwana ya sika ezali", + "update available info": "Acode {version} ezali sikoyo! Finá awa mpo na kotala yango.", + "plugin updates": "Ba mbongwana ya ba plugins", + "plugin updates singular": "Plugin 1 ezali na version ya sika.", + "plugin updates plural": "Ba plugins {count} ezali na ba versions ya sika.", + "just now": "Sikawa kaka", + "day singular": "Eleki mokolo {count}", + "hour singular": "Eleki ngonga {count}", + "min singular": "Eleki miniti {count}", + "day plural": "Eleki mikolo {count}", + "hour plural": "Eleki bangonga {count}", + "min plural": "Eleki baminiti {count}", + "settings-category-builtin-servers": "Ba serveurs oyo etongami na kati", + "settings-category-plugin-servers": "Ba serveurs ya ba plugins", + "new name": "Kombo ya sika", + "enter new name": "Koma kombo ya sika", + "code actions": "Misala ya code", + "active processes": "Ba processus oyo ezali kosala", + "total memory": "Mémoire mobimba", + "uptime": "Ntango ya mosala", + "note": "Likebisi", + "acode main process": "Processus monene ya Acode", + "ppid parent": "PPID (Moboti)", + "unknown": "Eyebani te", + "just started": "Ebandi sikawa", + "diff days": "Eleki mikolo {days}, bangonga {hr}", + "diff hr": "Eleki {hr}h {min}m", + "diff min": "Eleki {min}m {sec}s", + "diff sec": "Eleki {sec}s", + "command": "Mitindo", + "managed": "Etambwisami", + "acode service": "Service ya Acode", + "info-terminal-show-scrollbar": "Lakisa scrollbar ya xterm pembeni ya terminal.", + "terminal:show scrollbar": "Lakisa barre ya défilement", + "apply exclusions when copying": "Salela ba exclusions ntango ozali kokopa", + "settings-info-app-use-file-operation-exclusions": "Pusa ba fichier mpe ba dossier oyo ekokani na ba règles ya exclusion tango ya kopiya mpe kokanga.", + "horizontal scroll margin": "Marge ya kokita na ngámbo", + "settings-info-horizontal-scroll-margin": "Bakisa esika ya pamba nsima ya ligne oyo eleki molai ntango retour à la ligne ezali kosalelama te. Tia motuya mobimba ya pixels oyo ezali négatif te.", + "conflict error": "Matata! Zela liboso ya kosala commit mosusu.", + "terminal:failsafe": "Mode FailSafe", + "app icon": "App icon", + "app icon changed": "App icon changed", + "settings-info-app-icon": "Choose the app icon displayed on your device.", + "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", + "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", + "rewarded ad failed": "The ad could not be completed. Please try again.", + "rewarded ad incomplete": "Finish watching the ad to earn the reward.", + "unable to delete file": "unable to delete file", + "optional": "optional", + "purchase pending": "purchase pending", + "cancelled": "cancelled", + "plugin-review:dialog-label": "Plugin reviews", + "plugin-review:account-check-failed": "Unable to check your account. Try again.", + "plugin-review:sign-in": "Sign in to review", + "plugin-review:edit": "Edit your review", + "plugin-review:add": "Add a review...", + "plugin-review:placeholder": "Share your experience...", + "plugin-review:input-label": "Plugin review", + "plugin-review:vote-group-label": "Vote", + "plugin-review:thumbs-up": "Thumbs up", + "plugin-review:thumbs-down": "Thumbs down", + "plugin-review:delete": "Delete review", + "plugin-review:load-failed": "Unable to load reviews.", + "plugin-review:retry": "Retry", + "plugin-review:empty-title": "No reviews yet", + "plugin-review:empty-description": "Be the first to share your experience.", + "plugin-review:yours": "Your review", + "plugin-review:community": "Community reviews", + "plugin-review:no-other-reviews": "No other reviews yet.", + "plugin-review:login-incomplete": "Login was not completed.", + "plugin-review:sign-in-failed": "Unable to sign in.", + "plugin-review:session-expired-review": "Your session expired. Sign in again to review.", + "plugin-review:save-failed": "Unable to save review.", + "plugin-review:delete-confirmation": "Delete your review? This cannot be undone.", + "plugin-review:session-expired-continue": "Your session expired. Sign in again to continue.", + "plugin-review:delete-failed": "Unable to delete review.", + "plugin-review:you": "You", + "plugin-review:edit-action": "Edit review", + "plugin-review:recommended": "Recommended this plugin", + "plugin-review:error-max-length": "Review must be {max} characters or less.", + "plugin-review:error-downvote-comment": "Tell the developer what could be improved.", + "plugin-review:error-empty": "Add a comment or choose thumbs up.", + "plugin-review:unrated": "Unrated" +}