From 249212a14b96c1fca1cc42eefa43b3b2678d1603 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 16:58:36 +0200 Subject: [PATCH 01/17] Add spec: strip scorpio to unique features for parallel installation Defines what to keep (workspace-root auto-clone, env strategy, settings protection, git identity fallback, auth) and what to remove (sidebar, course/exercise UI, submit, repo detection, websocket, UML, realtime sync, all shared models). Includes package.json, tsconfig.json, and webpack.config.js changes. Codex-reviewed and approved. --- .../specs/2026-05-04-scorpio-strip-design.md | 239 ++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-04-scorpio-strip-design.md diff --git a/docs/superpowers/specs/2026-05-04-scorpio-strip-design.md b/docs/superpowers/specs/2026-05-04-scorpio-strip-design.md new file mode 100644 index 0000000..f1d9589 --- /dev/null +++ b/docs/superpowers/specs/2026-05-04-scorpio-strip-design.md @@ -0,0 +1,239 @@ +# Scorpio Strip: Remove Feature Duplicates for Parallel Installation + +**Date:** 2026-05-04 +**Status:** Approved (codex-reviewed) +**PR Target:** `main` (scorpio has no `dev` branch) + +## Problem + +The scorpio VS Code extension and the artemis-extension (Iris Thaumantias) share many features: authentication, exercise browsing, sidebar UI, repository cloning, submission, WebSocket real-time sync, problem statement display, and UML rendering. Both extensions must be installable side-by-side in the same VS Code / Theia instance without runtime conflicts. Scorpio will be repurposed later for a different use case (TBD). + +## Decision + +Strip scorpio down to its unique features (things artemis-extension does not provide) plus authentication infrastructure. Everything else gets deleted. + +## Features Retained + +### 1. Workspace-Root Auto-Clone with Path Preservation + +**Source:** `src/theia/theia.ts`, `src/participation/cloning.service.ts` + +In Theia/EduIDE, the exercise repository must live at the workspace root (`/home/project`), not in a subdirectory. Artemis-extension clones into `workspaceRoot/repoName/`, which is wrong for Theia. + +Scorpio's clone flow: +1. Backs up Theia-owned paths (`.vscode/settings.json`, `.theia`, `persisted`, `lost+found`) to a temp directory +2. Clears the workspace directory +3. Clones with `git clone .` (repo becomes workspace root) +4. Restores backed-up paths only if the cloned repo does not provide them (repo content wins) +5. Adds restored paths to `.git/info/exclude` + +**New: Idempotence guard.** Before cloning, check if `.git` already exists in the workspace and the normalized origin remote URL matches `GIT_URI`. If so, skip the clone. Only HTTPS URL forms are supported (Artemis/data-bridge only produces HTTPS URLs; SSH is out of scope). URL normalization: +- Strip userinfo (credentials) +- Remove `.git` suffix +- Remove trailing slashes +- Lowercase scheme and hostname +- Normalize default ports (remove `:443` for https, `:80` for http) + +If `.git` exists as a file (worktree), treat it the same as a directory (read origin remote via simple-git). If no origin remote exists, proceed with clone. If URLs don't match, proceed with clone. + +### 2. ProcessEnvStrategy (Env-Var Fallback) + +**Source:** `src/theia/env-strategy.ts` + +Reads Theia environment variables via two strategies: +- **DataBridgeStrategy:** Polls the `tum-aet.data-bridge` companion extension (500ms interval, 10s timeout). **Required keys:** `ARTEMIS_TOKEN`, `ARTEMIS_URL`, `GIT_URI`. **Optional keys:** `GIT_USER`, `GIT_MAIL` (hostname fallback exists). `THEIA` key: optional, but if the data-bridge strategy is active and returns required keys, `THEIA_FLAG` must be set to `true` regardless of whether the `THEIA` key was explicitly provided. Falls back to ProcessEnvStrategy on timeout or missing extension. +- **ProcessEnvStrategy:** Reads each variable via `exec("echo $VAR")`. Legacy fallback that artemis-extension deliberately does not implement (artemis-extension hard-fails when the bridge is unavailable). + +Strategy selection via `SCORPIO_THEIA_ENV_STRATEGY` environment variable. + +### 3. Settings Protection in Theia + +**Source:** `src/shared/settings.ts` + +In managed Theia environments, user-initiated config changes to `scorpio.artemis.apiBaseUrl` and `scorpio.defaults.repoPath` are reverted with a warning. Prevents students from accidentally breaking their environment. + +### 4. Git Identity with Hostname Fallback + +**Source:** `src/theia/theia.ts` (lines 48-65) + +Sets global git `user.name` and `user.email` from environment variables. Falls back to `os.hostname()` for user name and `{hostname}@artemis-theia.de` for email. Artemis-extension sets per-repo config without fallback. + +### 5. Authentication + +**Source:** `src/authentication/authentication_provider.ts`, `src/artemis/authentication.client.ts`, `src/infra/http/artemis-http.client.ts` + +VS Code Authentication Provider (ID: `"artemis"`). Login dialog for non-Theia, auto-session from `ARTEMIS_TOKEN` in Theia. SecretStorage persistence. Retained for potential future use when scorpio is repurposed. + +**Known risk:** Auth provider ID `"artemis"` does not collide today (artemis-extension uses its own AuthManager, not the VS Code Auth API). If artemis-extension ever registers an `"artemis"` auth provider, this will need renaming. + +## Files Retained (with changes) + +### `src/extension.ts` (rewrite) + +New activate() flow: +1. `loadTheiaEnv()` - load environment variables +2. `initTheia()` - auto-clone if GIT_URI set (with idempotence guard) +3. `initSettings()` - load configuration +4. Initialize auth provider, attempt silent session, create from token if in Theia +5. Register config change listener for base-URL changes: **skip if `theiaEnv.ARTEMIS_URL` is set** (Theia protection in settings.ts handles that case). Otherwise, invalidate auth session and trigger window reload. +6. Register commands: `scorpio.restart` (calls `workbench.action.reloadWindow`), `scorpio.login`, `scorpio.logout` + +The `authenticationProvider` variable is no longer exported. Session invalidation on URL change moves from `settings.ts` into `extension.ts` (registered after auth init, guarded against Theia). + +### `src/participation/cloning.service.ts` (edit) + +Remove `cloneUserRepo()` and its imports (`settings`, `AUTH_ID`, `NotAuthenticatedError`, `getState`, `retrieveVcsAccessToken`, `addVcsTokenToUrl`). Keep `cloneByGivenURL()`, `cloneIntoWorkspaceRoot()`, and all helper functions (backup/restore/exclude/clear). + +### `src/shared/settings.ts` (edit) + +- Remove import of `authenticationProvider` from `extension.ts` (breaks circular dependency) +- Remove `easter_egg` field and `scorpio.?` handling +- Remove `authenticationProvider.removeSession()` call from URL-change handler (moved to extension.ts) +- Remove the `scorpio.restart` command execution from URL-change handler (extension.ts handles reload) +- Keep Theia protection logic (revert apiBaseUrl and repoPath changes) + +### `src/theia/theia.ts` (edit) + +Add idempotence guard in `initTheia()` before the clone call: +1. Check if workspace root contains `.git` (handle both directory and file/worktree) +2. If `.git` exists, read origin remote URL via `simple-git` +3. If no origin remote, proceed with clone +4. Normalize both `GIT_URI` and origin URL (HTTPS only, as specified above) +5. If normalized URLs match, skip clone and log "Repository already present, skipping auto-clone" +6. If no match, proceed with clone + +### `src/theia/env-strategy.ts` (edit) + +Modify `DataBridgeStrategy.pollForEnvironmentVariables()`: +- Change the completion condition: return as soon as required keys (`ARTEMIS_TOKEN`, `ARTEMIS_URL`, `GIT_URI`) are present. Do not wait for optional keys (`GIT_USER`, `GIT_MAIL`). +- In `parseTheiaEnv()`: if the strategy is DataBridge and required keys were received, set `THEIA_FLAG` to `true` even if the `THEIA` env var was not explicitly provided. + +### `src/artemis/authentication.client.ts` (edit) + +Remove `retrieveVcsAccessToken()` and `getVcsAccessToken()` (dead code after `cloneUserRepo` removal). Keep `authenticateToken()`. + +### Files retained as-is + +- `src/authentication/authentication_provider.ts` +- `src/authentication/not_authenticated.error.ts` +- `src/infra/http/artemis-http.client.ts` + +## Files Deleted + +### Entire directories +- `src/sidebar/` (sidebarProvider.ts, getNonce.ts, getUri.ts) +- `src/course/` (course.ts) +- `src/exercise/` (exercise.ts) +- `src/problemStatement/` (problem_statement.ts, uml.service.ts, uml.db.ts) +- `src/utils/` (filetree.ts) +- `src/test/` (extension.test.ts, index.ts) +- `webview/` (entire Angular sidebar app) + +### Individual files +- `src/shared/state.ts` - in-memory state management (only used by removed features) +- `src/shared/repository.service.ts` - repo detection + submit +- `src/shared/websocket.ts` - STOMP WebSocket client +- `src/participation/realtime-sync.service.ts` - realtime sync + polling fallback +- `src/participation/realtime.handlers.ts` - result/submission message handlers +- `src/artemis/course.client.ts` - course API +- `src/artemis/exercise.client.ts` - exercise API +- `src/artemis/participation.client.ts` - participation API +- `src/artemis/problem-statement.client.ts` - problem statement API + +### Shared models and webview protocol +- `shared/webview-commands.ts` +- `shared/models/course.model.ts` +- `shared/models/exercise.model.ts` +- `shared/models/feedback.model.ts` +- `shared/models/participation.model.ts` +- `shared/models/result.model.ts` +- `shared/models/submission.model.ts` +- `shared/models/testcase.model.ts` + +(All shared model files are only imported by deleted source files. `authenticateToken` does not reference any shared models.) + +### Media files +- `media/artemis_logo.png` +- `media/artemis_logo.svg` +- `media/icon2.png` +- `media/icon2.svg` + +Keep `media/icon.png` and `media/icon.svg` (referenced by package.json). + +## package.json Changes + +### Added +- `"private": true` (prevent accidental publishing) + +### Removed from contributes +- `viewsContainers` (entire section) +- `views` (entire section) +- `commands`: remove `scorpio.displayExercise`, `scorpio.displayedExercise.back`, `scorpio.displayedExercise.clone`, `scorpio.workspace.submit`, `scorpio.workspace.detectRepo`, `scorpio.workspace.sync`, `scorpio.sidebar.refresh` +- `menus`: remove all entries except login/logout in commandPalette. Remove `editor/title` and `view/title` sections entirely. +- `configuration.properties`: remove `scorpio.?` + +### Removed from dependencies +- `@stomp/stompjs`, `sockjs-client`, `ws`, `fetch-cookie`, `markdown-it`, `uuid`, `os-browserify`, `path-browserify` +- `@vscode/vsce` (move to devDependencies) +- `ts-node` (move to devDependencies) + +### Removed from devDependencies +- `@types/sockjs-client`, `@types/stompjs`, `@types/ws`, `@vscode/test-web` +- `@types/assert`, `@types/mocha`, `@types/webpack-env` +- `assert`, `process`, `html-loader`, `raw-loader`, `dotenv`, `mocha` + +### Added to devDependencies +- `@types/node` +- `@vscode/vsce` (moved from dependencies) +- `ts-node` (moved from dependencies) + +### Removed from extensionDependencies +- `vscode.git` (only `simple-git` is used, not the VS Code Git API) + +### Other +- Remove `browser` field (no longer a web extension) +- Change `extensionKind` from `["ui", "workspace"]` to `["workspace"]` +- Remove scripts: `install:webview`, `build:webview`, `watch:webview`, `test`, `pretest`, `run-in-browser`, `open-in-browser` +- Update composite scripts: `install:all` becomes just `npm install --no-scripts`, `build` becomes just `webpack --mode production`, `watch` becomes just `webpack --watch` + +## tsconfig.json Changes + +- Remove `@shared/*` and `@shared/models/*` path aliases (all shared files deleted) +- Remove `"shared/**/*"` from `include` +- Change `lib` from `["ES2020", "WebWorker"]` to `["ES2020"]` (Node-only extension) +- Remove `"webview"` from `exclude` (webview deleted) + +## webpack.config.js Changes + +- Remove `"test/suite/index"` entry (test directory deleted) +- Remove entire `resolve.fallback` block (including `crypto: false`, `assert`, `path`, `os`) +- Change `resolve.mainFields` from `["main", "module", "browser"]` to `["main", "module"]` +- Remove `resolve.alias` for `@shared` (shared directory deleted) +- Remove `LimitChunkCountPlugin` (web-extension-specific, not needed for Node) +- Remove `ProvidePlugin` for `process` shim +- Remove `externals` for `bufferutil` and `utf-8-validate` (ws dependencies, ws removed) +- Keep only `vscode: "commonjs vscode"` in externals +- Fix comment: target is `"node"`, not webworker + +## package-lock.json + +Must be regenerated after dependency changes: `rm -rf node_modules package-lock.json && npm install` + +## Verification + +After all changes: +1. `rm -rf node_modules dist package-lock.json && npm install && npm run build:extension` (clean build from scratch) +2. `npm run lint` +3. Manual test in Theia: verify auto-clone still works with GIT_URI +4. Manual test: reload extension with existing repo, verify idempotence guard skips clone +5. Manual test in VS Code Desktop: verify login/logout commands work +6. Verify no runtime errors in extension host output + +## Follow-up Items (not in this PR) + +- `git ls-remote` pre-check before workspace clear (safety improvement) +- Settings scope limitation: Theia protection only reverts Global scope, not Workspace scope overrides +- Evaluate renaming auth provider ID from `"artemis"` to `"scorpio-artemis"` when scorpio's new purpose is defined +- Port workspace-root clone to artemis-extension (if desired, separate PR against `dev`) +- Node test infrastructure for stripped extension +- Docs/README cleanup (README.md, README_DEVELOPER.md, vsc-extension-quickstart.md still describe deleted functionality) From f45e8385103da4db7f7007db80e7ac24380bde25 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:09:51 +0200 Subject: [PATCH 02/17] Add implementation plan for scorpio strip (codex-reviewed) --- .../plans/2026-05-04-scorpio-strip.md | 1036 +++++++++++++++++ 1 file changed, 1036 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-04-scorpio-strip.md diff --git a/docs/superpowers/plans/2026-05-04-scorpio-strip.md b/docs/superpowers/plans/2026-05-04-scorpio-strip.md new file mode 100644 index 0000000..442a575 --- /dev/null +++ b/docs/superpowers/plans/2026-05-04-scorpio-strip.md @@ -0,0 +1,1036 @@ +# Scorpio Strip Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Strip scorpio to its unique Theia features (workspace-root auto-clone, env strategy, settings protection, git identity fallback) plus auth infrastructure, deleting all duplicate features. + +**Architecture:** Delete all user-facing UI (sidebar, course/exercise pickers, submit, repo detection, websocket, UML, realtime sync), the webview app, shared models, and tests. Rewrite extension.ts to only wire up the kept services. Edit retained files to remove dead imports/functions. Update build config (package.json, tsconfig, webpack) for Node-only. + +**Tech Stack:** TypeScript, VS Code Extension API, simple-git, webpack + +**Spec:** `docs/superpowers/specs/2026-05-04-scorpio-strip-design.md` + +--- + +### Task 1: Delete all removed source files and directories + +**Files:** +- Delete: `src/sidebar/` (entire directory) +- Delete: `src/course/` (entire directory) +- Delete: `src/exercise/` (entire directory) +- Delete: `src/problemStatement/` (entire directory) +- Delete: `src/utils/` (entire directory) +- Delete: `src/test/` (entire directory) +- Delete: `webview/` (entire directory) +- Delete: `src/shared/state.ts` +- Delete: `src/shared/repository.service.ts` +- Delete: `src/shared/websocket.ts` +- Delete: `src/participation/realtime-sync.service.ts` +- Delete: `src/participation/realtime.handlers.ts` +- Delete: `src/artemis/course.client.ts` +- Delete: `src/artemis/exercise.client.ts` +- Delete: `src/artemis/participation.client.ts` +- Delete: `src/artemis/problem-statement.client.ts` +- Delete: `shared/webview-commands.ts` +- Delete: `shared/models/course.model.ts` +- Delete: `shared/models/exercise.model.ts` +- Delete: `shared/models/feedback.model.ts` +- Delete: `shared/models/participation.model.ts` +- Delete: `shared/models/result.model.ts` +- Delete: `shared/models/submission.model.ts` +- Delete: `shared/models/testcase.model.ts` +- Delete: `media/artemis_logo.png` +- Delete: `media/artemis_logo.svg` +- Delete: `media/icon2.png` +- Delete: `media/icon2.svg` + +- [ ] **Step 1: Delete directories** + +```bash +rm -rf src/sidebar src/course src/exercise src/problemStatement src/utils src/test webview +``` + +- [ ] **Step 2: Delete individual source files** + +```bash +rm src/shared/state.ts src/shared/repository.service.ts src/shared/websocket.ts +rm src/participation/realtime-sync.service.ts src/participation/realtime.handlers.ts +rm src/artemis/course.client.ts src/artemis/exercise.client.ts src/artemis/participation.client.ts src/artemis/problem-statement.client.ts +``` + +- [ ] **Step 3: Delete shared models and webview protocol** + +```bash +rm shared/webview-commands.ts +rm shared/models/course.model.ts shared/models/exercise.model.ts shared/models/feedback.model.ts shared/models/participation.model.ts shared/models/result.model.ts shared/models/submission.model.ts shared/models/testcase.model.ts +``` + +After deleting all model files, remove the now-empty directories: + +```bash +rmdir shared/models shared +``` + +- [ ] **Step 4: Delete unused media files** + +```bash +rm media/artemis_logo.png media/artemis_logo.svg media/icon2.png media/icon2.svg +``` + +- [ ] **Step 5: Commit** + +```bash +git add -u +git commit -m "Delete all stripped source files, shared models, webview, and unused media" +``` + +--- + +### Task 2: Rewrite extension.ts + +**Files:** +- Modify: `src/extension.ts` + +- [ ] **Step 1: Replace entire contents of `src/extension.ts`** + +```typescript +import * as vscode from "vscode"; +import { ArtemisAuthenticationProvider, AUTH_ID } from "./authentication/authentication_provider"; +import { initTheia, loadTheiaEnv, theiaEnv } from "./theia/theia"; +import { initSettings } from "./shared/settings"; + +export async function activate(context: vscode.ExtensionContext) { + await loadTheiaEnv(); + await initTheia(); + initSettings(); + + const authProvider = new ArtemisAuthenticationProvider(context.secrets); + context.subscriptions.push(authProvider); + + let session = await vscode.authentication.getSession(AUTH_ID, [], { silent: true }); + if (!session && theiaEnv.ARTEMIS_TOKEN !== undefined) { + session = await authProvider.createSession([]); + } + vscode.commands.executeCommand("setContext", "scorpio.authenticated", session !== undefined); + + authProvider.onAuthSessionsChange.event(({ added, removed }) => { + if (added && added.length > 0) { + vscode.commands.executeCommand("setContext", "scorpio.authenticated", true); + } + if (removed && removed.length > 0) { + vscode.commands.executeCommand("setContext", "scorpio.authenticated", false); + } + }); + + context.subscriptions.push( + vscode.workspace.onDidChangeConfiguration(async (e) => { + if (!e.affectsConfiguration("scorpio.artemis.apiBaseUrl")) { + return; + } + if (theiaEnv.ARTEMIS_URL) { + return; + } + await authProvider.removeSession(); + vscode.commands.executeCommand("workbench.action.reloadWindow"); + }), + ); + + context.subscriptions.push( + vscode.commands.registerCommand("scorpio.restart", () => { + vscode.commands.executeCommand("workbench.action.reloadWindow"); + }), + ); + + context.subscriptions.push( + vscode.commands.registerCommand("scorpio.login", async () => { + try { + const session = await vscode.authentication.getSession(AUTH_ID, [], { + createIfNone: true, + }); + if (!session) { + vscode.window.showErrorMessage("Login failed"); + } + } catch (e: unknown) { + const message = e instanceof Error ? e.message : String(e); + vscode.window.showErrorMessage(`Failed to login: ${message}`); + } + }), + ); + + context.subscriptions.push( + vscode.commands.registerCommand("scorpio.logout", async () => { + const choice = await vscode.window.showWarningMessage( + "Sign out from Artemis - Scorpio", + { modal: true }, + "Sign out", + ); + if (choice === "Sign out") { + await authProvider.removeSession(); + } + }), + ); +} + +export function deactivate() {} +``` + +- [ ] **Step 2: Commit** + +```bash +git add src/extension.ts +git commit -m "Rewrite extension.ts: keep only auth, theia init, and three commands" +``` + +--- + +### Task 3: Edit settings.ts (remove circular dep, easter egg, restart logic) + +**Files:** +- Modify: `src/shared/settings.ts` + +- [ ] **Step 1: Replace entire contents of `src/shared/settings.ts`** + +```typescript +import * as vscode from "vscode"; +import { theiaEnv } from "../theia/theia"; + +export type Settings = { + base_url: string | undefined; + default_repo_path: string | undefined; +}; + +export var settings: Settings; + +export function initSettings() { + settings = getSettings(); + + vscode.workspace.onDidChangeConfiguration((e) => { + handleSettingsChange(e); + }); +} + +function getSettings(): Settings { + let base_url = vscode.workspace.getConfiguration("scorpio").get("artemis.apiBaseUrl"); + if (theiaEnv.ARTEMIS_URL) { + const config = vscode.workspace.getConfiguration("scorpio"); + config.update("artemis.apiBaseUrl", theiaEnv.ARTEMIS_URL, vscode.ConfigurationTarget.Global); + base_url = theiaEnv.ARTEMIS_URL; + } + + if (!base_url) { + vscode.window.showErrorMessage("Artemis Base URL not set. Please set it in the settings."); + } + + const default_repo_path = vscode.workspace + .getConfiguration("scorpio") + .get("defaults.repoPath"); + + return { + base_url: base_url, + default_repo_path: default_repo_path, + }; +} + +function handleSettingsChange(e: vscode.ConfigurationChangeEvent) { + if (e.affectsConfiguration("scorpio.artemis.apiBaseUrl")) { + if (theiaEnv.ARTEMIS_URL) { + console.warn("Artemis URL can not be changed in theia environment"); + const config = vscode.workspace.getConfiguration("scorpio"); + config.update("artemis.apiBaseUrl", settings.base_url, vscode.ConfigurationTarget.Global); + return; + } + + const base_url = vscode.workspace.getConfiguration("scorpio").get("artemis.apiBaseUrl"); + if (!base_url) { + vscode.window.showErrorMessage("Artemis Base URL not set. Please set it in the settings."); + } + settings.base_url = base_url; + } + + if (e.affectsConfiguration("scorpio.defaults.repoPath")) { + if (theiaEnv.THEIA_FLAG) { + console.warn("Default repository path can not be changed in theia environment"); + const config = vscode.workspace.getConfiguration("scorpio"); + config.update( + "defaults.repoPath", + settings.default_repo_path, + vscode.ConfigurationTarget.Global, + ); + return; + } + + const default_repo_path = vscode.workspace + .getConfiguration("scorpio") + .get("defaults.repoPath"); + settings.default_repo_path = default_repo_path; + } +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add src/shared/settings.ts +git commit -m "Strip settings.ts: remove circular dep, easter egg, and restart logic" +``` + +--- + +### Task 4: Edit cloning.service.ts (remove cloneUserRepo and dead imports) + +**Files:** +- Modify: `src/participation/cloning.service.ts` + +- [ ] **Step 1: Replace entire contents of `src/participation/cloning.service.ts`** + +Keep only `cloneByGivenURL`, `cloneIntoWorkspaceRoot`, and all helpers. Remove `cloneUserRepo` and its imports. + +```typescript +import simpleGit from "simple-git"; +import { tmpdir } from "os"; +import * as path from "path"; +import * as fs from "fs/promises"; + +type CloneMode = "subdirectory" | "workspace-root"; + +type CloneOptions = { + mode?: CloneMode; + preservedPaths?: string[]; +}; + +type PreservedWorkspaceEntry = { + relativePath: string; + backupPath: string; + isDirectory: boolean; +}; + +const THEIA_PRESERVED_PATHS = [".vscode/settings.json", ".theia", "persisted", "lost+found"]; + +export async function cloneByGivenURL( + cloneUrl: URL, + destinationPath: string, + options?: CloneOptions, +): Promise { + if (options?.mode === "workspace-root") { + return cloneIntoWorkspaceRoot( + cloneUrl, + destinationPath, + options.preservedPaths ?? THEIA_PRESERVED_PATHS, + ); + } + + const repoName = path.basename(cloneUrl.pathname, ".git"); + const clonePath = path.join(destinationPath, repoName); + + const gitForClone = simpleGit(destinationPath); + + try { + await gitForClone.clone(cloneUrl.toString(), clonePath); + } catch (e: any) { + throw new Error(`Error cloning repository: ${e.message}`); + } + + return clonePath; +} + +async function cloneIntoWorkspaceRoot( + cloneUrl: URL, + workspacePath: string, + preservedPaths: string[] = [], +): Promise { + const backupRoot = await fs.mkdtemp(path.join(tmpdir(), "scorpio-workspace-clone-")); + const preservedEntries = await movePreservedWorkspaceEntries( + workspacePath, + preservedPaths, + backupRoot, + ); + + let cloneSucceeded = false; + let restoredEntries: PreservedWorkspaceEntry[] = []; + + try { + await clearDirectory(workspacePath); + + const gitForClone = simpleGit(workspacePath); + await gitForClone.clone(cloneUrl.toString(), "."); + cloneSucceeded = true; + + return workspacePath; + } catch (e: any) { + throw new Error(`Error cloning repository into workspace root: ${e.message}`); + } finally { + restoredEntries = await restorePreservedWorkspaceEntries(workspacePath, preservedEntries); + + if (cloneSucceeded) { + await addEntriesToGitExclude(workspacePath, restoredEntries); + } + + await fs.rm(backupRoot, { recursive: true, force: true }); + } +} + +async function movePreservedWorkspaceEntries( + workspacePath: string, + preservedPaths: string[], + backupRoot: string, +): Promise { + const preservedEntries: PreservedWorkspaceEntry[] = []; + + for (const relativePath of preservedPaths) { + const sourcePath = path.join(workspacePath, relativePath); + const sourceStats = await safeStat(sourcePath); + if (!sourceStats) { + continue; + } + + const backupPath = path.join(backupRoot, relativePath); + await ensureParentDirectory(backupPath); + await copyPath(sourcePath, backupPath, sourceStats.isDirectory()); + await fs.rm(sourcePath, { recursive: true, force: true }); + + preservedEntries.push({ + relativePath, + backupPath, + isDirectory: sourceStats.isDirectory(), + }); + } + + return preservedEntries; +} + +async function restorePreservedWorkspaceEntries( + workspacePath: string, + preservedEntries: PreservedWorkspaceEntry[], +): Promise { + const restoredEntries: PreservedWorkspaceEntry[] = []; + + for (const entry of preservedEntries) { + const targetPath = path.join(workspacePath, entry.relativePath); + const targetStats = await safeStat(targetPath); + + if (!targetStats) { + await ensureParentDirectory(targetPath); + await copyPath(entry.backupPath, targetPath, entry.isDirectory); + restoredEntries.push(entry); + } + + await fs.rm(entry.backupPath, { recursive: true, force: true }); + } + + return restoredEntries; +} + +async function addEntriesToGitExclude( + workspacePath: string, + restoredEntries: PreservedWorkspaceEntry[], +): Promise { + if (restoredEntries.length === 0) { + return; + } + + const excludePath = path.join(workspacePath, ".git", "info", "exclude"); + const existingContent = await fs.readFile(excludePath, "utf8").catch(() => ""); + const existingEntries = new Set(existingContent.split(/\r?\n/).filter(Boolean)); + const newEntries = restoredEntries.map((entry) => + entry.isDirectory + ? `${normalizeGitPath(entry.relativePath)}/` + : normalizeGitPath(entry.relativePath), + ); + + let hasChanges = false; + for (const entry of newEntries) { + if (!existingEntries.has(entry)) { + existingEntries.add(entry); + hasChanges = true; + } + } + + if (!hasChanges) { + return; + } + + await ensureParentDirectory(excludePath); + const nextContent = `${Array.from(existingEntries).join("\n")}\n`; + await fs.writeFile(excludePath, nextContent, "utf8"); +} + +async function clearDirectory(directoryPath: string): Promise { + const entries = await fs.readdir(directoryPath); + await Promise.all( + entries.map((entry) => + fs.rm(path.join(directoryPath, entry), { recursive: true, force: true }), + ), + ); +} + +async function ensureParentDirectory(filePath: string): Promise { + await fs.mkdir(path.dirname(filePath), { recursive: true }); +} + +async function copyPath( + sourcePath: string, + targetPath: string, + isDirectory: boolean, +): Promise { + if (isDirectory) { + await fs.cp(sourcePath, targetPath, { recursive: true, force: true }); + } else { + await fs.copyFile(sourcePath, targetPath); + } +} + +async function safeStat(targetPath: string) { + try { + return await fs.lstat(targetPath); + } catch { + return undefined; + } +} + +function normalizeGitPath(relativePath: string): string { + return relativePath.split(path.sep).join("/"); +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add src/participation/cloning.service.ts +git commit -m "Strip cloning.service.ts: remove cloneUserRepo and dead imports" +``` + +--- + +### Task 5: Add idempotence guard to theia.ts + +**Files:** +- Modify: `src/theia/theia.ts` + +- [ ] **Step 1: Replace entire contents of `src/theia/theia.ts`** + +```typescript +import * as vscode from "vscode"; +import simpleGit, { GitConfigScope } from "simple-git"; +import { hostname } from "os"; +import * as path from "path"; +import { cloneByGivenURL } from "../participation/cloning.service"; +import { createTheiaEnvStrategy, TheiaEnv } from "./env-strategy"; + +export let theiaEnv: TheiaEnv = { + THEIA_FLAG: false, + ARTEMIS_TOKEN: undefined, + ARTEMIS_URL: undefined, + GIT_URI: undefined, + GIT_USER: undefined, + GIT_MAIL: undefined, +}; + +export async function loadTheiaEnv(): Promise { + const strategy = await createTheiaEnvStrategy(); + theiaEnv = await strategy.load(); +} + +export function getWorkspaceFolder() { + return vscode.workspace.workspaceFolders?.at(0)?.uri; +} + +function normalizeRepoUrl(raw: string): string { + try { + const url = new URL(raw); + url.username = ""; + url.password = ""; + if ( + (url.protocol === "https:" && url.port === "443") || + (url.protocol === "http:" && url.port === "80") + ) { + url.port = ""; + } + let normalized = url.origin.toLowerCase() + url.pathname; + normalized = normalized.replace(/\.git\/?$/, ""); + normalized = normalized.replace(/\/+$/, ""); + return normalized; + } catch { + return raw; + } +} + +async function isRepoAlreadyCloned(workspacePath: string, targetUri: URL): Promise { + const gitPath = path.join(workspacePath, ".git"); + try { + await import("fs/promises").then((fs) => fs.stat(gitPath)); + } catch { + return false; + } + + try { + const git = simpleGit(workspacePath); + const remotes = await git.getRemotes(true); + const origin = remotes.find((r) => r.name === "origin"); + if (!origin?.refs.fetch) { + return false; + } + return normalizeRepoUrl(origin.refs.fetch) === normalizeRepoUrl(targetUri.toString()); + } catch { + return false; + } +} + +export async function initTheia() { + if (theiaEnv.GIT_URI) { + vscode.commands.executeCommand("setContext", "scorpio.theia.givenExercise", true); + } + + if (theiaEnv.GIT_URI) { + const workspaceFolderUri = getWorkspaceFolder(); + if (!workspaceFolderUri) { + vscode.window.showErrorMessage("No workspace folder available to clone repository"); + return; + } + + const alreadyCloned = await isRepoAlreadyCloned( + workspaceFolderUri.fsPath, + theiaEnv.GIT_URI, + ); + if (alreadyCloned) { + console.log("Repository already present, skipping auto-clone"); + } else { + await cloneByGivenURL(theiaEnv.GIT_URI, workspaceFolderUri.fsPath, { + mode: "workspace-root", + }); + } + } + + if (theiaEnv.THEIA_FLAG) { + try { + const git = simpleGit(); + const hostnameConst = hostname(); + theiaEnv.GIT_USER = theiaEnv.GIT_USER ? theiaEnv.GIT_USER : hostnameConst; + theiaEnv.GIT_MAIL = theiaEnv.GIT_MAIL + ? theiaEnv.GIT_MAIL + : theiaEnv.GIT_USER + ? theiaEnv.GIT_USER + "@artemis-theia.de" + : hostnameConst + "@artemis-theia.de"; + + await git.addConfig("user.name", theiaEnv.GIT_USER, undefined, GitConfigScope.global); + await git.addConfig("user.email", theiaEnv.GIT_MAIL, undefined, GitConfigScope.global); + } catch (e: any) { + console.error(`Error setting git config: ${e.message}`); + } + } +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add src/theia/theia.ts +git commit -m "Add idempotence guard: skip auto-clone if repo already matches GIT_URI" +``` + +--- + +### Task 6: Edit env-strategy.ts (required vs optional keys, THEIA_FLAG auto-set) + +**Files:** +- Modify: `src/theia/env-strategy.ts` + +- [ ] **Step 1: Edit `parseTheiaEnv` to accept an optional `fromDataBridge` parameter** + +Replace the `parseTheiaEnv` function (lines 26-36): + +```typescript +function parseTheiaEnv( + env: Record, + fromDataBridge: boolean = false, +): TheiaEnv { + const gitUriString = env["GIT_URI"]; + const hasRequiredKeys = !!(env["ARTEMIS_TOKEN"] && env["ARTEMIS_URL"] && gitUriString); + return { + THEIA_FLAG: env["THEIA"] !== undefined || (fromDataBridge && hasRequiredKeys), + ARTEMIS_TOKEN: env["ARTEMIS_TOKEN"], + ARTEMIS_URL: env["ARTEMIS_URL"], + GIT_URI: gitUriString ? new URL(gitUriString) : undefined, + GIT_USER: env["GIT_USER"], + GIT_MAIL: env["GIT_MAIL"], + }; +} +``` + +- [ ] **Step 2: Add required keys constant and update poll completion condition** + +Add after `ENV_KEYS` (after line 20): + +```typescript +const REQUIRED_ENV_KEYS = ["ARTEMIS_TOKEN", "ARTEMIS_URL", "GIT_URI"] as const; +``` + +Then replace the completion condition in `pollForEnvironmentVariables` (line 124): + +Replace: +```typescript + if (ENV_KEYS.every((key) => Boolean(env[key]))) { + this.outputChannel.appendLine("Environment variables received from bridge"); + return parseTheiaEnv(env); + } +``` + +With: +```typescript + if (REQUIRED_ENV_KEYS.every((key) => Boolean(env[key]))) { + this.outputChannel.appendLine("Environment variables received from bridge"); + return parseTheiaEnv(env, true); + } +``` + +- [ ] **Step 3: Update the timeout fallback to also pass `fromDataBridge: false`** + +The existing `return new ProcessEnvStrategy().load();` on line 138 is already correct (ProcessEnvStrategy calls `parseTheiaEnv(env)` which defaults `fromDataBridge` to `false`). No change needed. + +- [ ] **Step 4: Commit** + +```bash +git add src/theia/env-strategy.ts +git commit -m "DataBridge: only require ARTEMIS_TOKEN/URL/GIT_URI, auto-set THEIA_FLAG" +``` + +--- + +### Task 7: Edit authentication.client.ts (remove dead VCS token functions) + +**Files:** +- Modify: `src/artemis/authentication.client.ts` + +- [ ] **Step 1: Replace entire contents of `src/artemis/authentication.client.ts`** + +```typescript +import { artemisRequest } from "../infra/http/artemis-http.client"; + +export async function authenticateToken( + username: string, + password: string, +): Promise<{ access_token: string }> { + const response = await artemisRequest("/api/core/public/authenticate", { + method: "POST", + query: { tool: "SCORPIO" }, + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + username, + password, + rememberMe: true, + }), + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`HTTP error with status: ${response.status} ${errorText}`); + } + + return response.json(); +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add src/artemis/authentication.client.ts +git commit -m "Remove dead retrieveVcsAccessToken from authentication client" +``` + +--- + +### Task 8: Update package.json + +**Files:** +- Modify: `package.json` + +- [ ] **Step 1: Replace entire contents of `package.json`** + +```json +{ + "name": "artemis-scorpio", + "displayName": "Artemis - Scorpio", + "version": "0.0.0", + "description": "", + "private": true, + "categories": [ + "Other" + ], + "bugs": { + "url": "https://github.com/EduIDE/scorpio/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/EduIDE/scorpio.git" + }, + "publisher": "tum-aet", + "main": "./dist/extension.js", + "scripts": { + "install:all": "npm install --no-scripts", + "build": "webpack --mode production", + "watch": "webpack --watch", + "install:extension": "npm install --no-scripts", + "build:extension": "webpack --mode production", + "compile:extension": "webpack", + "watch:extension": "webpack --watch", + "lint": "eslint src", + "package": "vsce package", + "vscode:prepublish": "npm run build", + "fmt": "oxfmt", + "fmt:check": "oxfmt --check" + }, + "dependencies": { + "simple-git": "^3.27.0" + }, + "devDependencies": { + "@types/node": "^22.0.0", + "@types/vscode": "^1.94.0", + "@typescript-eslint/eslint-plugin": "^8.9.0", + "@typescript-eslint/parser": "^8.9.0", + "@vscode/vsce": "^3.1.1", + "eslint": "^9.39.3", + "oxfmt": "^0.31.0", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", + "typescript": "^5.5.4", + "webpack": "^5.93.0", + "webpack-cli": "^5.1.4" + }, + "contributes": { + "authentication": [ + { + "id": "artemis", + "label": "Credentials" + } + ], + "configuration": { + "title": "Scorpio - Artemis", + "properties": { + "scorpio.artemis.apiBaseUrl": { + "order": 1, + "description": "The base URL of the Artemis Server", + "type": "string", + "format": "uri", + "editPresentation": "singlelineText", + "default": "https://artemis.cit.tum.de" + }, + "scorpio.defaults.repoPath": { + "order": 3, + "description": "The default to search for and clone repositories into - has to be an absolute path", + "editPresentation": "singlelineText", + "type": "string", + "format": "path" + } + } + }, + "commands": [ + { + "command": "scorpio.restart", + "category": "Scorpio", + "title": "Restart Extension" + }, + { + "command": "scorpio.login", + "category": "Scorpio", + "title": "Login" + }, + { + "command": "scorpio.logout", + "category": "Scorpio", + "title": "Logout" + } + ], + "menus": { + "commandPalette": [ + { + "command": "scorpio.login", + "when": "!scorpio.authenticated" + }, + { + "command": "scorpio.logout", + "when": "scorpio.authenticated" + } + ] + } + }, + "activationEvents": [ + "onStartupFinished" + ], + "extensionKind": [ + "workspace" + ], + "icon": "media/icon.png", + "engines": { + "vscode": "^1.95.0" + } +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add package.json +git commit -m "Strip package.json: remove unused deps, views, commands, menus, browser config" +``` + +--- + +### Task 9: Update tsconfig.json + +**Files:** +- Modify: `tsconfig.json` + +- [ ] **Step 1: Replace entire contents of `tsconfig.json`** + +```json +{ + "compilerOptions": { + "module": "Node16", + "target": "ES2020", + "outDir": "dist", + "lib": ["ES2020"], + "sourceMap": true, + "rootDir": "./", + "strict": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "noImplicitThis": true, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add tsconfig.json +git commit -m "tsconfig: remove shared aliases, WebWorker lib, webview exclude" +``` + +--- + +### Task 10: Update webpack.config.js + +**Files:** +- Modify: `webpack.config.js` + +- [ ] **Step 1: Replace entire contents of `webpack.config.js`** + +```javascript +//@ts-check +"use strict"; + +/** @typedef {import('webpack').Configuration} WebpackConfig **/ + +const path = require("path"); + +/** @type WebpackConfig */ +const extensionConfig = { + mode: "none", + target: "node", + entry: { + extension: "./src/extension.ts", + }, + output: { + filename: "[name].js", + path: path.join(__dirname, "dist"), + libraryTarget: "commonjs", + devtoolModuleFilenameTemplate: "../[resource-path]", + }, + resolve: { + mainFields: ["main", "module"], + extensions: [".ts", ".js"], + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: "ts-loader", + }, + ], + }, + ], + }, + externals: { + vscode: "commonjs vscode", + }, + performance: { + hints: false, + }, + devtool: "nosources-source-map", + infrastructureLogging: { + level: "log", + }, +}; + +module.exports = [extensionConfig]; +``` + +- [ ] **Step 2: Commit** + +```bash +git add webpack.config.js +git commit -m "webpack: Node-only config, remove browser polyfills, test entry, plugins" +``` + +--- + +### Task 11: Clean install, build, lint + +**Files:** None (verification only) + +- [ ] **Step 1: Regenerate lockfile and install** + +```bash +rm -rf node_modules dist package-lock.json && npm install +``` + +- [ ] **Step 2: Build** + +```bash +npm run build:extension +``` + +Expected: successful webpack build with no errors. + +- [ ] **Step 3: Lint** + +```bash +npm run lint +``` + +Expected: no errors. If there are warnings from naming conventions, fix them. + +- [ ] **Step 4: Verify dist output** + +```bash +ls -la dist/extension.js +``` + +Expected: single bundled file exists. + +- [ ] **Step 5: Commit lockfile** + +```bash +git add package-lock.json +git commit -m "Regenerate package-lock.json after dependency cleanup" +``` + +- [ ] **Step 6: Manual verification checklist** + +These cannot be automated in this plan. Verify each manually: + +1. **Theia auto-clone**: In a Theia/EduIDE environment with `GIT_URI` set, confirm the repository is cloned into the workspace root (not a subdirectory), `.theia`/`persisted`/`lost+found` are preserved, and `.git/info/exclude` contains restored entries. +2. **Idempotence guard**: Reload the extension (Cmd+Shift+P > "Developer: Reload Window") with an existing cloned repo. Confirm the extension host log shows "Repository already present, skipping auto-clone" and the workspace is NOT wiped. +3. **VS Code Desktop login/logout**: Open command palette, run "Scorpio: Login", enter credentials, confirm `scorpio.authenticated` context is set. Then run "Scorpio: Logout", confirm session is cleared. +4. **Extension host errors**: Open Output panel > "Extension Host" channel. Confirm no errors from scorpio on activation. From 30376356c685d0e93f71f5473c5bd4ce9c73baaa Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:22:09 +0200 Subject: [PATCH 03/17] Delete all stripped source files, shared models, webview, and unused media --- media/artemis_logo.png | Bin 17702 -> 0 bytes media/artemis_logo.svg | 10 - media/icon2.png | Bin 2878 -> 0 bytes media/icon2.svg | 5 - shared/models/course.model.ts | 39 - shared/models/exercise.model.ts | 117 - shared/models/feedback.model.ts | 25 - shared/models/participation.model.ts | 73 - shared/models/result.model.ts | 36 - shared/models/submission.model.ts | 26 - shared/models/testcase.model.ts | 25 - shared/webview-commands.ts | 22 - src/artemis/course.client.ts | 27 - src/artemis/exercise.client.ts | 115 - src/artemis/participation.client.ts | 41 - src/artemis/problem-statement.client.ts | 18 - src/course/course.ts | 47 - src/exercise/exercise.ts | 168 - src/participation/realtime-sync.service.ts | 154 - src/participation/realtime.handlers.ts | 110 - src/problemStatement/problem_statement.ts | 14 - src/problemStatement/uml.db.ts | 80 - src/problemStatement/uml.service.ts | 21 - src/shared/repository.service.ts | 129 - src/shared/state.ts | 78 - src/shared/websocket.ts | 202 - src/sidebar/getNonce.ts | 16 - src/sidebar/getUri.ts | 16 - src/sidebar/sidebarProvider.ts | 297 - src/test/suite/extension.test.ts | 15 - src/test/suite/index.ts | 29 - src/utils/filetree.ts | 25 - webview/.gitignore | 43 - webview/.vscode/launch.json | 20 - webview/.vscode/tasks.json | 42 - webview/README.md | 19 - webview/angular.json | 93 - webview/package-lock.json | 9319 ----------------- webview/package.json | 58 - webview/src/app/app.component.html | 21 - webview/src/app/app.component.ts | 54 - .../src/app/course/course-selection.view.css | 3 - .../src/app/course/course-selection.view.html | 34 - .../src/app/course/course-selection.view.ts | 87 - webview/src/app/easteregg/pet.component.css | 8 - webview/src/app/easteregg/pet.component.html | 1 - webview/src/app/easteregg/pet.component.ts | 217 - .../clone-button/ clone-button.component.css | 0 .../clone-button/clone-button.component.html | 1 - .../clone-button/clone-button.component.ts | 23 - .../exercise-detail/exercise-detail.view.css | 0 .../exercise-detail/exercise-detail.view.html | 8 - .../exercise-detail/exercise-detail.view.ts | 52 - .../header-table/overview.component.css | 14 - .../header-table/overview.component.html | 32 - .../header-table/overview.component.ts | 29 - .../overall-score/score-button.component.css | 0 .../overall-score/score-button.component.html | 21 - .../overall-score/score-button.component.ts | 25 - .../artemis-text-replacement.plugin.ts | 23 - .../markdown-util/markdown.converter.ts | 91 - .../markdown-util/plant-uml.plugin.ts | 163 - .../markdown-util/task.plugin.ts | 35 - .../problem-statement.component.css | 0 .../problem-statement.component.html | 1 - .../problem-statement.component.ts | 190 - .../programming-exercise.service.ts | 127 - .../problem-statement/regex.util.ts | 3 - .../task/task-button.component.css | 0 .../task/task-button.component.html | 40 - .../task/task-button.component.ts | 53 - .../problem-statement/task/task.model.ts | 2 - .../submit-button/submit-button.component.css | 0 .../submit-button.component.html | 1 - .../submit-button/submit-button.component.ts | 19 - .../test-result/feedback-list.component.css | 11 - .../test-result/feedback-list.component.html | 36 - .../test-result/feedback-list.component.ts | 33 - .../app/exercise/exercise-selection.view.css | 3 - .../app/exercise/exercise-selection.view.html | 55 - .../app/exercise/exercise-selection.view.ts | 87 - webview/src/app/login/login.view.css | 0 webview/src/app/login/login.view.html | 7 - webview/src/app/login/login.view.ts | 19 - webview/src/app/state.service.ts | 90 - webview/src/app/vscode.ts | 83 - webview/src/assets/penguin-hat.gif | Bin 27294 -> 0 bytes webview/src/assets/penguin-walking.gif | Bin 13282 -> 0 bytes webview/src/assets/penguin.png | Bin 91425 -> 0 bytes webview/src/environments/environment.prod.ts | 3 - webview/src/environments/environment.ts | 16 - webview/src/index.html | 12 - webview/src/main.ts | 12 - webview/src/polyfills.ts | 52 - webview/src/types/markdown-it-class.d.ts | 5 - webview/src/vscode.css | 133 - webview/tsconfig.app.json | 12 - webview/tsconfig.json | 33 - webview/vscode-variables.css | 760 -- 99 files changed, 14414 deletions(-) delete mode 100644 media/artemis_logo.png delete mode 100644 media/artemis_logo.svg delete mode 100644 media/icon2.png delete mode 100644 media/icon2.svg delete mode 100644 shared/models/course.model.ts delete mode 100644 shared/models/exercise.model.ts delete mode 100644 shared/models/feedback.model.ts delete mode 100644 shared/models/participation.model.ts delete mode 100644 shared/models/result.model.ts delete mode 100644 shared/models/submission.model.ts delete mode 100644 shared/models/testcase.model.ts delete mode 100644 shared/webview-commands.ts delete mode 100644 src/artemis/course.client.ts delete mode 100644 src/artemis/exercise.client.ts delete mode 100644 src/artemis/participation.client.ts delete mode 100644 src/artemis/problem-statement.client.ts delete mode 100644 src/course/course.ts delete mode 100644 src/exercise/exercise.ts delete mode 100644 src/participation/realtime-sync.service.ts delete mode 100644 src/participation/realtime.handlers.ts delete mode 100644 src/problemStatement/problem_statement.ts delete mode 100644 src/problemStatement/uml.db.ts delete mode 100644 src/problemStatement/uml.service.ts delete mode 100644 src/shared/repository.service.ts delete mode 100644 src/shared/state.ts delete mode 100644 src/shared/websocket.ts delete mode 100644 src/sidebar/getNonce.ts delete mode 100644 src/sidebar/getUri.ts delete mode 100644 src/sidebar/sidebarProvider.ts delete mode 100644 src/test/suite/extension.test.ts delete mode 100644 src/test/suite/index.ts delete mode 100644 src/utils/filetree.ts delete mode 100644 webview/.gitignore delete mode 100644 webview/.vscode/launch.json delete mode 100644 webview/.vscode/tasks.json delete mode 100644 webview/README.md delete mode 100644 webview/angular.json delete mode 100644 webview/package-lock.json delete mode 100644 webview/package.json delete mode 100644 webview/src/app/app.component.html delete mode 100644 webview/src/app/app.component.ts delete mode 100644 webview/src/app/course/course-selection.view.css delete mode 100644 webview/src/app/course/course-selection.view.html delete mode 100644 webview/src/app/course/course-selection.view.ts delete mode 100644 webview/src/app/easteregg/pet.component.css delete mode 100644 webview/src/app/easteregg/pet.component.html delete mode 100644 webview/src/app/easteregg/pet.component.ts delete mode 100644 webview/src/app/exercise-detail/clone-button/ clone-button.component.css delete mode 100644 webview/src/app/exercise-detail/clone-button/clone-button.component.html delete mode 100644 webview/src/app/exercise-detail/clone-button/clone-button.component.ts delete mode 100644 webview/src/app/exercise-detail/exercise-detail.view.css delete mode 100644 webview/src/app/exercise-detail/exercise-detail.view.html delete mode 100644 webview/src/app/exercise-detail/exercise-detail.view.ts delete mode 100644 webview/src/app/exercise-detail/header-table/overview.component.css delete mode 100644 webview/src/app/exercise-detail/header-table/overview.component.html delete mode 100644 webview/src/app/exercise-detail/header-table/overview.component.ts delete mode 100644 webview/src/app/exercise-detail/overall-score/score-button.component.css delete mode 100644 webview/src/app/exercise-detail/overall-score/score-button.component.html delete mode 100644 webview/src/app/exercise-detail/overall-score/score-button.component.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/markdown-util/artemis-text-replacement.plugin.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/markdown-util/markdown.converter.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/markdown-util/plant-uml.plugin.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/markdown-util/task.plugin.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/problem-statement.component.css delete mode 100644 webview/src/app/exercise-detail/problem-statement/problem-statement.component.html delete mode 100644 webview/src/app/exercise-detail/problem-statement/problem-statement.component.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/programming-exercise.service.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/regex.util.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/task/task-button.component.css delete mode 100644 webview/src/app/exercise-detail/problem-statement/task/task-button.component.html delete mode 100644 webview/src/app/exercise-detail/problem-statement/task/task-button.component.ts delete mode 100644 webview/src/app/exercise-detail/problem-statement/task/task.model.ts delete mode 100644 webview/src/app/exercise-detail/submit-button/submit-button.component.css delete mode 100644 webview/src/app/exercise-detail/submit-button/submit-button.component.html delete mode 100644 webview/src/app/exercise-detail/submit-button/submit-button.component.ts delete mode 100644 webview/src/app/exercise-detail/test-result/feedback-list.component.css delete mode 100644 webview/src/app/exercise-detail/test-result/feedback-list.component.html delete mode 100644 webview/src/app/exercise-detail/test-result/feedback-list.component.ts delete mode 100644 webview/src/app/exercise/exercise-selection.view.css delete mode 100644 webview/src/app/exercise/exercise-selection.view.html delete mode 100644 webview/src/app/exercise/exercise-selection.view.ts delete mode 100644 webview/src/app/login/login.view.css delete mode 100644 webview/src/app/login/login.view.html delete mode 100644 webview/src/app/login/login.view.ts delete mode 100644 webview/src/app/state.service.ts delete mode 100644 webview/src/app/vscode.ts delete mode 100644 webview/src/assets/penguin-hat.gif delete mode 100644 webview/src/assets/penguin-walking.gif delete mode 100644 webview/src/assets/penguin.png delete mode 100644 webview/src/environments/environment.prod.ts delete mode 100644 webview/src/environments/environment.ts delete mode 100644 webview/src/index.html delete mode 100644 webview/src/main.ts delete mode 100644 webview/src/polyfills.ts delete mode 100644 webview/src/types/markdown-it-class.d.ts delete mode 100644 webview/src/vscode.css delete mode 100644 webview/tsconfig.app.json delete mode 100644 webview/tsconfig.json delete mode 100644 webview/vscode-variables.css diff --git a/media/artemis_logo.png b/media/artemis_logo.png deleted file mode 100644 index e6cb6895d5ebd5ad8d8f957e6eba06f84f62d299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17702 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 auZOaa|D{yMF;VakWNKuAeRJF`;{OA*pM-S) diff --git a/media/artemis_logo.svg b/media/artemis_logo.svg deleted file mode 100644 index d3aaf1c..0000000 --- a/media/artemis_logo.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/media/icon2.png b/media/icon2.png deleted file mode 100644 index 243dc5e80fe98d2d03dd752501cbad7bb2ecd79e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2878 zcmV-E3&He>P)K@;Fw6{ZH5*ge@U!zBy`)X~I2p zjDd#L&9@;bvOdu@40;0R_IK21K^{UEFo9bb%mntoC@+hSip2__k!hkksHyZC z6;n-{XxonDzL!fr+mrYl!vTiDp18TG47#@^_u0bu^RE)QH#`o*L1S)iPA4srF(z?% z*{Ho;u^;kenHZvn1C|@>)OcmBBXNA$z)rTw??~+HKurdqJ9^;Ik}=0+P#f!&r7gL? z77hR@+=`nwiK9@fp)y-TCH0csZx2%rgM05S^A?@srjSQvzf(;ce#9j!_Iat|XIoH1 z)`M*nWa8xH$&)7aW?jqECY6XifjS+@eYY{ixJrv;1be2qy()?1z8R*J6k)_A>p<=1 z(oJPr75hywjVv!O>r8!dA+pSNrhQ~ma;y&gO%n8v;xrsr)|1>WfgR|kW;g(a4TkXE zD`OM|r>Ie;jrheSt7l)R(rh+Eq(!>cLya;z%RWL`R0W7bh@TXZ4v!r@dK9y>-#i6l z3pGkmlNX(*3ULQluU;LTK7D%hy{K-+*gbd^5mszYoH&7{rKMf(J$33-(To3v$UHb^ zff*tk^AsM7bLY-|c}?P;Iddj|*+pc;EbuBK8fql*2lr|M~Oh^IKb6!3rRun`nkWfmO5F+>MkS zio1K5Lx&Cp4ID#zFy*`{JVR-aVWg~txQWg`e*Bmt03kh?A%M7xi;I1q;u0clY9kOK z1@`@=sUQ5yn>TO17uBW*@Q8@0lTc|>D1lS>oxsh7-A4ArS8Q%>rpN~8y&;0FAYL3Q zP4bx*ab)8DxA;e@7mGB8Vvq!WXog6eLU^#xX*e`=N8<9bH=jOz+7iw65AZio?|rn% zx4;bk(jw|-$BLUHn(IfR`Md@{KT6dURWq*@F5d#vm-BH4Q~#Pm(lbRNf(wx=Zw4EP zz22fmp%n%@RJt(6&jQEh9X}RO?DTK5y$a1+T^p)(SzH*cQ*|Z_6UYtzkZ!c zr+48HQQ^A1v9ZyGV|;mV3b*2NWc{tNxP%D4C{A#iMp4@2BjECpCefGp2i*0&93^Rx zDZ@1C7i7N<>H;s*dwh7X%V{`WVa_68;mK>Wv$M2+S83E;*Iw*eUFII<>w9R`S8xdppj&~6K1dwP!x4`#5tI)UzL@>~uzXnoV4gnc*icRH^- z!YBpO9@!bDQLl#kvVoJd$weP*GcD>u-E#@@tg3o1MXwA7h%{<_m_~8f!TPEQ+X6G# z8!fsI{WK_*+|Kx1hiR0p2;2Iq2-^bN>XWFCH2G;8Cb{kJVSzl25>2dekYsyRgiV1{ zn5RYgfI$oT1et?OB0qoreCzGow=l(K+GJB;(~}}$zRa64fJ0v7SFng^UK7qa1z<3N zCh3VN-AY$yOJLK$iX*Ej+sFe++Hkm{xHE&9h1S1!_gs!k3ULy%goMCL=}!M$GZzD^otx+=m% z;1ucw_dE?U@t{dCiEVUq-vn8oEqjA-WUUn0?GGP5+!LNif#iKCVzMg2q!z8ZI)Njr zDgOj_P}5meqWl@^BT|IQ=vZDqrzpLPLX07Tub(tVqi9vcj82_e*Mn69D~>FfvOXL( zLRVrN)zpY?7!sFBZeJNV(uxXX-INMi(|dG+EC#i}Do=xaRG3JNNe|@a!p;|77Xv1O z&hgQ3J9>|9WR+A!DR88|RW!fSEul!8);2aalx_?ifmIf5KY+)nHK_jC8M@i%0(Ft) zt}T>b+(*OxsCo?DJY3}i!Yi2&PP&CqolmVQFoV4Jx=4d2L1Mg<+_n$<(|GBo(8{e< zL{?3kRQuqLNn#91f*)dSJm{Ms#^5FQJzw`958Unufpi5qlx799NBjb%J%kle{pf~ zp$M#&#LK0Tw5EbUgJZf#ki{8Shp#!Z342{c z_#;O6`jmtIF5Oic|pZrr%Du&~h0Usn!0 c)$C7x0~ - - - - diff --git a/shared/models/course.model.ts b/shared/models/course.model.ts deleted file mode 100644 index 3e97df5..0000000 --- a/shared/models/course.model.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Exercise } from "./exercise.model"; - -export class Course { - public id?: number; - public title?: string; - public description?: string; - public shortName?: string; - public startDate?: Date; - public endDate?: Date; - public semester?: string; - public testCourse?: boolean; - - public presentationScore?: number; - public maxComplaints?: number; - public maxTeamComplaints?: number; - public maxComplaintTimeDays?: number; - public maxComplaintTextLimit?: number; - public maxComplaintResponseTextLimit?: number; - public complaintsEnabled?: boolean; - public requestMoreFeedbackEnabled?: boolean; - public maxRequestMoreFeedbackTimeDays?: number; - public maxPoints?: number; - public accuracyOfScores?: number; - - // the following values are only used in course administration - public numberOfStudents?: number; - public numberOfTeachingAssistants?: number; - public numberOfEditors?: number; - public numberOfInstructors?: number; - - public exercises?: Exercise[]; - - // helper attributes - public relativeScore?: number; - public absoluteScore?: number; - public maxScore?: number; - - constructor() {} -} diff --git a/shared/models/exercise.model.ts b/shared/models/exercise.model.ts deleted file mode 100644 index a785f11..0000000 --- a/shared/models/exercise.model.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Course } from "./course.model"; -import { getLatestResult, StudentParticipation } from "./participation.model"; -import { TestCase } from "./testcase.model"; - -export abstract class Exercise { - public id?: number; - public problemStatement?: string; - public title?: string; - public shortName?: string; - public releaseDate?: Date; - public startDate?: Date; - public dueDate?: Date; - public assessmentDueDate?: Date; - public maxPoints?: number; - public bonusPoints?: number; - public assessmentType?: AssessmentType; - public allowComplaintsForAutomaticAssessments?: boolean; - public allowFeedbackRequests?: boolean; - public difficulty?: DifficultyLevel; - public mode?: ExerciseMode = ExerciseMode.INDIVIDUAL; // default value - public includedInOverallScore?: IncludedInOverallScore = - IncludedInOverallScore.INCLUDED_COMPLETELY; // default value - // public categories?: ExerciseCategory[]; - public type?: ExerciseType; - public exampleSolutionPublicationDate?: Date; - - public studentParticipations?: StudentParticipation[]; - public testCases?: TestCase[]; - public course?: Course; - - constructor(_: ExerciseType) {} -} - -export class ProgrammingExercise extends Exercise { - public projectKey?: string; - - public programmingLanguage?: ProgrammingLanguage; - public showTestNamesToStudents?: boolean; - - /** - * This attribute is used to generate a programming exercise with no connection to the VCS and CI. - * This functionality is only for testing purposes. - */ - public noVersionControlAndContinuousIntegrationAvailable?: boolean; - - constructor(course: Course | undefined) { - super(ExerciseType.PROGRAMMING); - this.course = course; - } -} - -export enum AssessmentType { - AUTOMATIC = "AUTOMATIC", - SEMI_AUTOMATIC = "SEMI_AUTOMATIC", - MANUAL = "MANUAL", - AUTOMATIC_ATHENA = "AUTOMATIC_ATHENA", -} - -export enum DifficultyLevel { - EASY = "EASY", - MEDIUM = "MEDIUM", - HARD = "HARD", -} - -export enum ExerciseMode { - INDIVIDUAL = "INDIVIDUAL", - TEAM = "TEAM", -} - -export enum IncludedInOverallScore { - INCLUDED_COMPLETELY = "INCLUDED_COMPLETELY", - INCLUDED_AS_BONUS = "INCLUDED_AS_BONUS", - NOT_INCLUDED = "NOT_INCLUDED", -} - -export enum ExerciseType { - PROGRAMMING = "programming", - MODELING = "modeling", - QUIZ = "quiz", - TEXT = "text", - FILE_UPLOAD = "file-upload", -} - -export enum ProgrammingLanguage { - EMPTY = "EMPTY", - ASSEMBLER = "ASSEMBLER", - C = "C", - C_PLUS_PLUS = "C_PLUS_PLUS", - C_SHARP = "C_SHARP", - HASKELL = "HASKELL", - JAVA = "JAVA", - JAVASCRIPT = "JAVASCRIPT", - KOTLIN = "KOTLIN", - OCAML = "OCAML", - PYTHON = "PYTHON", - R = "R", - RUST = "RUST", - SWIFT = "SWIFT", - TYPESCRIPT = "TYPESCRIPT", - VHDL = "VHDL", -} - -export function getProjectKey( - course: Course | undefined, - exercise: Exercise | undefined, -): string | undefined { - if (!course || !exercise) { - return undefined; - } - - return `${course.shortName!.toUpperCase()}${exercise.shortName!.toUpperCase()}`; -} - -export function getScoreString(exercise: Exercise): string { - const score = getLatestResult(exercise.studentParticipations?.at(0))?.score; - return score !== undefined && score !== null ? `${score} %` : "No graded result"; -} diff --git a/shared/models/feedback.model.ts b/shared/models/feedback.model.ts deleted file mode 100644 index 531e024..0000000 --- a/shared/models/feedback.model.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Result } from "./result.model"; -import { TestCase } from "./testcase.model"; - -export enum FeedbackType { - MANUAL = "MANUAL", - MANUAL_UNREFERENCED = "MANUAL_UNREFERENCED", - AUTOMATIC_ADAPTED = "AUTOMATIC_ADAPTED", - AUTOMATIC = "AUTOMATIC", -} - -export class Feedback { - public id?: number; - public text?: string; - public detailText?: string; - public hasLongFeedbackText?: boolean; - public reference?: string; - public credits?: number; - public type?: FeedbackType; - public result?: Result; - public positive?: boolean; - public testCase?: TestCase; - public testCaseId?: number; - - constructor() {} -} diff --git a/shared/models/participation.model.ts b/shared/models/participation.model.ts deleted file mode 100644 index fe4275a..0000000 --- a/shared/models/participation.model.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Exercise } from "./exercise.model"; -import { Result } from "./result.model"; -import { ProgrammingSubmission } from "./submission.model"; - -export class StudentParticipation { - public id?: number; - - public individualDueDate?: Date; - public submissions?: ProgrammingSubmission[]; - public exercise?: Exercise; - - // workaround for strict template here, only used in case of StudentParticipation - public participantName?: string; - public participantIdentifier?: string; - - public repositoryUri?: string; - public buildPlanId?: string; - public branch?: string; - - constructor() {} -} - -export function getLatestSubmission( - participation: StudentParticipation | undefined, -): ProgrammingSubmission | undefined { - if (!participation || !participation.submissions || participation.submissions.length === 0) { - return undefined; - } - - return participation?.submissions?.reduce((latestSubmission, currentSubmission) => { - return latestSubmission.id! > currentSubmission.id! ? latestSubmission : currentSubmission; - }); -} - -export function getLatestResultBySubmission( - submission: ProgrammingSubmission | undefined, -): Result | undefined { - if (!submission || !submission.results || submission.results.length === 0) { - return undefined; - } - - return submission?.results?.reduce((latestResult, currentResult) => { - return latestResult.id! > currentResult.id! ? latestResult : currentResult; - }); -} - -export function getLatestResult( - participation: StudentParticipation | undefined, -): Result | undefined { - return getLatestResultBySubmission(getLatestSubmission(participation)); -} - -export function getProjectKeyFromRepoUrl(repoUrl: string): string { - // extract projectKey {protocol}://{username}@{host}:{port}/git/{PROJECT_KEY}/{project_key}-{username}.git - const parts = repoUrl.split("/"); - if (parts.length < 5) { - throw new Error("Invalid artemis repository URL does not contain project key"); - } - - const projectKey = parts[4]; - return projectKey; -} - -export function addVcsTokenToUrl(url: string, username: string, vsctoken: string): string { - const credentials = `://${username}:${vsctoken}@`; - if (!url.includes("@")) { - // the url has the format https://vcs-server.com - return url.replace("://", credentials); - } else { - // the url has the format https://username@vcs-server.com -> replace ://username@ - return url.replace(/:\/\/.*@/, credentials); - } -} diff --git a/shared/models/result.model.ts b/shared/models/result.model.ts deleted file mode 100644 index e243bc4..0000000 --- a/shared/models/result.model.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AssessmentType } from "./exercise.model"; -import { Feedback } from "./feedback.model"; -import { ProgrammingSubmission } from "./submission.model"; - -export class Result { - public id?: number; - public completionDate?: Date; - public successful?: boolean; - - /** - * Current score in percent i.e. between 1 - 100 - * - Can be larger than 100 if bonus points are available - */ - public score?: number; - public assessmentType?: AssessmentType; - public rated?: boolean; - public hasComplaint?: boolean; - public exampleResult?: boolean; - public testCaseCount?: number; - public passedTestCaseCount?: number; - public codeIssueCount?: number; - - public submission?: ProgrammingSubmission = new ProgrammingSubmission(); - public feedbacks: Feedback[] = []; - - constructor() {} - - static fromJSON(json: any): Result { - const result = Object.assign(new Result(), json); - if (json.submission) { - result.submission = Object.assign(new ProgrammingSubmission(), json.submission); - } - - return result; - } -} diff --git a/shared/models/submission.model.ts b/shared/models/submission.model.ts deleted file mode 100644 index d4bcf6c..0000000 --- a/shared/models/submission.model.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { StudentParticipation } from "./participation.model"; -import { Result } from "./result.model"; - -const enum SubmissionType { - MANUAL = "MANUAL", - TIMEOUT = "TIMEOUT", - INSTRUCTOR = "INSTRUCTOR", - EXTERNAL = "EXTERNAL", - TEST = "TEST", - ILLEGAL = "ILLEGAL", -} - -export class ProgrammingSubmission { - public id?: number; - public submitted?: boolean; - public submissionDate?: Date; - public type?: SubmissionType; - public exampleSubmission?: boolean; - public durationInMinutes?: number; - public results?: Result[]; - - public commitHash?: string; - public buildFailed?: boolean; - - public participation?: StudentParticipation; -} diff --git a/shared/models/testcase.model.ts b/shared/models/testcase.model.ts deleted file mode 100644 index 169113e..0000000 --- a/shared/models/testcase.model.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ProgrammingExercise } from "./exercise.model"; - -export enum TestCaseType { - STRUCTURAL = "STRUCTURAL", - BEHAVIORAL = "BEHAVIORAL", - DEFAULT = "DEFAULT", -} - -export enum Visibility { - ALWAYS = "ALWAYS", - AFTER_DUE_DATE = "AFTER_DUE_DATE", - NEVER = "NEVER", -} - -export class TestCase { - id?: number; - testName?: string; - weight?: number; - bonusMultiplier?: number; - bonusPoints?: number; - active?: boolean; - visibility?: Visibility; - exercise?: ProgrammingExercise; - type?: TestCaseType; -} diff --git a/shared/webview-commands.ts b/shared/webview-commands.ts deleted file mode 100644 index 5a3a29f..0000000 --- a/shared/webview-commands.ts +++ /dev/null @@ -1,22 +0,0 @@ -export enum CommandFromWebview { - INFO = "info", - ERROR = "error", - LOGIN = "login", - GET_COURSE_OPTIONS = "getCourseOptions", - GET_EXERCISE_OPTIONS = "getExerciseOptions", - GET_EXERCISE_DETAILS = "getExerciseDetails", - GET_UML = "getUml", - OPEN_UML = "openUml", - CLONE_REPOSITORY = "cloneRepository", - SUBMIT = "submit", - SET_COURSE_AND_EXERCISE = "setCourseAndExercise", -} - -export enum CommandFromExtension { - SEND_LOGIN_STATE = "showLogin", - SEND_COURSE_EXERCISE_REPOKEY = "sendCourseAndExercise", - SEND_COURSE_OPTIONS = "sendCourseOptions", - SEND_EXERCISE_OPTIONS = "sendExerciseOptions", - SEND_UML = "sendUml", - EASTER_EGG = "easterEgg", -} diff --git a/src/artemis/course.client.ts b/src/artemis/course.client.ts deleted file mode 100644 index 91e482d..0000000 --- a/src/artemis/course.client.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Course } from "@shared/models/course.model"; -import { artemisRequestJson } from "../infra/http/artemis-http.client"; - -export async function fetchAllCourses(token: string): Promise { - const data = await artemisRequestJson("/api/core/courses/for-dashboard", { token }); - - return ( - data.courses - ?.map((courseAndScore: any) => { - const course: Course = courseAndScore.course as Course; - course.maxPoints = courseAndScore.totalScores.maxPoints; - course.absoluteScore = courseAndScore.totalScores.studentScores.absoluteScore; - course.relativeScore = courseAndScore.totalScores.studentScores.relativeScore; - return course; - }) - .map((course: Course) => { - course.exercises = course.exercises - ?.filter((exercise) => exercise.type == "programming") - .map((exercise) => { - exercise.dueDate = exercise.dueDate ? new Date(exercise.dueDate!) : undefined; - return exercise; - }); - return course; - }) - .filter((course: Course) => course.exercises && course.exercises.length > 0) ?? [] - ); -} diff --git a/src/artemis/exercise.client.ts b/src/artemis/exercise.client.ts deleted file mode 100644 index d4b78e4..0000000 --- a/src/artemis/exercise.client.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { Course } from "@shared/models/course.model"; -import { Exercise } from "@shared/models/exercise.model"; -import { Feedback } from "@shared/models/feedback.model"; -import { Result } from "@shared/models/result.model"; -import { ProgrammingSubmission } from "@shared/models/submission.model"; -import { TestCase } from "@shared/models/testcase.model"; -import { artemisRequestJson } from "../infra/http/artemis-http.client"; -import { fetchResultDetails } from "./participation.client"; - -export async function fetchProgrammingExercisesByCourseId( - token: string, - courseId: number, -): Promise { - const data = await artemisRequestJson(`/api/core/courses/${courseId}/for-dashboard`, { - token, - }); - - return ( - data.course.exercises - ?.filter((exercise: Exercise) => exercise.type == "programming") - .map((exercise: Exercise) => { - exercise.dueDate = exercise.dueDate ? new Date(exercise.dueDate) : undefined; - return exercise; - }) ?? ([] as Exercise[]) - ); -} - -export async function fetchExerciseById( - token: string, - exerciseId: number, -): Promise<{ course: Course; exercise: Exercise }> { - const data = await artemisRequestJson<{ [key: string]: any }>( - `/api/exercise/exercises/${exerciseId}`, - { token }, - ); - return { course: data.course as Course, exercise: data as Exercise }; -} - -export async function fetchExerciseDetailesById( - token: string, - exerciseId: number, -): Promise { - const response = await artemisRequestJson(`/api/exercise/exercises/${exerciseId}/details`, { - token, - }); - const exercise = response.exercise as Exercise; - exercise.dueDate = exercise.dueDate ? new Date(exercise.dueDate) : undefined; - - const testCasesById = new Map(); - const normalizedParticipations = []; - for (const participation of exercise.studentParticipations ?? []) { - const normalizedSubmissions: ProgrammingSubmission[] = (participation.submissions ?? []).map( - (submission: any) => ({ - ...submission, - submissionDate: submission.submissionDate ? new Date(submission.submissionDate) : undefined, - results: (submission.results ?? []).map((result: any) => ({ - ...result, - completionDate: result.completionDate ? new Date(result.completionDate) : undefined, - submission: undefined, - })) as Result[], - participation: undefined, - }), - ); - - const latestSubmission = getLatestById(normalizedSubmissions); - const latestResult: Result | undefined = latestSubmission - ? getLatestById(latestSubmission.results ?? []) - : undefined; - - if (latestSubmission) { - latestSubmission.results = latestResult ? [latestResult] : []; - } - - if (latestResult?.id && participation.id) { - const feedbacks: Feedback[] = await fetchResultDetails( - token, - participation.id, - latestResult.id, - ); - latestResult.feedbacks = feedbacks; - for (const feedback of feedbacks) { - const testCase = feedback.testCase; - if (testCase?.id !== undefined) { - testCasesById.set(testCase.id, testCase); - } - } - } - - normalizedParticipations.push({ - ...participation, - submissions: latestSubmission ? [latestSubmission] : [], - results: undefined, - }); - } - exercise.studentParticipations = normalizedParticipations; - - if (testCasesById.size > 0) { - exercise.testCases = Array.from(testCasesById.values()); - } - - return exercise; -} - -// Assumes ids are -function getLatestById(items: T[]): T | undefined { - if (items.length === 0) { - return undefined; - } - - return items.reduce((latest, current) => { - const latestId = latest.id ?? -1; - const currentId = current.id ?? -1; - return currentId > latestId ? current : latest; - }); -} diff --git a/src/artemis/participation.client.ts b/src/artemis/participation.client.ts deleted file mode 100644 index 58ad1e5..0000000 --- a/src/artemis/participation.client.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Feedback } from "@shared/models/feedback.model"; -import { StudentParticipation } from "@shared/models/participation.model"; -import { artemisRequestJson } from "../infra/http/artemis-http.client"; - -export async function startExercise( - token: string, - exerciseId: number, -): Promise { - return artemisRequestJson( - `/api/exercise/exercises/${exerciseId}/participations`, - { - method: "POST", - token, - }, - ); -} - -export async function fetchParticipationByRepoName( - token: string, - repoName: string, -): Promise { - return artemisRequestJson( - `/api/programming/programming-exercise-participations`, - { - method: "GET", - token, - query: { repoName }, - }, - ); -} - -export async function fetchResultDetails( - token: string, - participationId: number, - resultId: number, -): Promise { - return artemisRequestJson( - `/api/assessment/participations/${participationId}/results/${resultId}/details`, - { token }, - ); -} diff --git a/src/artemis/problem-statement.client.ts b/src/artemis/problem-statement.client.ts deleted file mode 100644 index e1d7ed8..0000000 --- a/src/artemis/problem-statement.client.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { artemisRequestText } from "../infra/http/artemis-http.client"; - -export async function fetchUml( - token: string, - plantUml: string, - useDarkTheme: boolean = false, -): Promise { - return artemisRequestText("/api/programming/plantuml/svg", { - token, - headers: { - "Content-Type": "text/plain", - }, - query: { - plantuml: plantUml, - useDarkTheme, - }, - }); -} diff --git a/src/course/course.ts b/src/course/course.ts deleted file mode 100644 index a565356..0000000 --- a/src/course/course.ts +++ /dev/null @@ -1,47 +0,0 @@ -import * as vscode from "vscode"; -import { fetchAllCourses } from "../artemis/course.client"; -import { Course } from "@shared/models/course.model"; -import { AUTH_ID } from "../authentication/authentication_provider"; -import { NotAuthenticatedError } from "../authentication/not_authenticated.error"; - -export type CourseOption = { - label: string; - description: string; - detail: string; - course: Course; -}; - -export async function buildCourseOptions(): Promise { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - - if (!session) { - throw new NotAuthenticatedError(); - } - const courses: Course[] = await fetchAllCourses(session.accessToken); - - const courseOptions: CourseOption[] = courses.map((course) => ({ - label: course.title!, - detail: (() => { - const nextExercise = course.exercises - ?.filter((exercise) => exercise.dueDate && exercise.dueDate > new Date()) - .sort((a, b) => (a.dueDate! > b.dueDate! ? 1 : -1)) - .at(0); - return nextExercise - ? `Next exercise: ${nextExercise.title} due on ${nextExercise.dueDate!.toLocaleString()}` - : "No upcoming exercise"; - })(), - description: `${course.absoluteScore}/${course.maxPoints} Points`, - course: course, - })); - - const selectedCourse = await vscode.window.showQuickPick(courseOptions, { - placeHolder: "Select a course", - }); - if (!selectedCourse) { - throw new Error("No course was selected"); - } - - return selectedCourse.course; -} diff --git a/src/exercise/exercise.ts b/src/exercise/exercise.ts deleted file mode 100644 index 48d65fe..0000000 --- a/src/exercise/exercise.ts +++ /dev/null @@ -1,168 +0,0 @@ -import * as vscode from "vscode"; -import { getState } from "../shared/state"; -import { AUTH_ID } from "../authentication/authentication_provider"; -import { Course } from "@shared/models/course.model"; -import { Exercise, getScoreString } from "@shared/models/exercise.model"; -import { fetchParticipationByRepoName, startExercise } from "../artemis/participation.client"; -import { NotAuthenticatedError } from "../authentication/not_authenticated.error"; -import { fetchExerciseById, fetchExerciseDetailesById } from "../artemis/exercise.client"; -import { cloneUserRepo } from "../participation/cloning.service"; - -export async function buildExerciseOptions(course: Course): Promise { - const exercises = course.exercises; - if (!exercises) { - throw new Error("No exercises found in the course"); - } - - const now = new Date(); - const exerciseOptionsNoDueDate = exercises - .filter((exercise) => !exercise.dueDate) - .map((exercise) => ({ - kind: vscode.QuickPickItemKind.Default, - label: exercise.title!, - description: getScoreString(exercise), - detail: "No due date", - exercise: exercise, - })); - - const exerciseOptionsPastDueDate = exercises - .filter((exercise) => exercise.dueDate && exercise.dueDate < now) - .map((exercise) => ({ - kind: vscode.QuickPickItemKind.Default, - label: exercise.title!, - description: getScoreString(exercise), - detail: `Due on ${exercise.dueDate!.toLocaleString()}`, - exercise: exercise, - })) - .sort((a, b) => b.exercise.dueDate!.getTime() - a.exercise.dueDate!.getTime()); - - const exerciseOptionsDue = exercises - .filter((exercise) => exercise.dueDate && exercise.dueDate >= now) - .map((exercise) => ({ - kind: vscode.QuickPickItemKind.Default, - label: exercise.title!, - description: getScoreString(exercise), - detail: `Due on ${exercise.dueDate!.toLocaleString()}`, - exercise: exercise, - })) - .sort((a, b) => a.exercise.dueDate!.getTime() - b.exercise.dueDate!.getTime()); - - const selectedExercise = await vscode.window.showQuickPick( - [ - { - kind: vscode.QuickPickItemKind.Separator, - label: "Due coming up", - exercise: undefined, - }, - ...exerciseOptionsDue, - { - kind: vscode.QuickPickItemKind.Separator, - label: "Past due date", - exercise: undefined, - }, - ...exerciseOptionsPastDueDate, - { - kind: vscode.QuickPickItemKind.Separator, - label: "No due date", - exercise: undefined, - }, - ...exerciseOptionsNoDueDate, - ], - { - placeHolder: "Select an exercise", - }, - ); - if (!selectedExercise || !selectedExercise.exercise) { - throw new Error("No exercise was selected"); - } - - return selectedExercise.exercise; -} - -export async function cloneCurrentExercise() { - const displayedExercise = getState().displayedExercise; - if (!displayedExercise) { - throw new Error("No exercise selected"); - } - - let participation = displayedExercise.studentParticipations?.at(0); - if (!participation) { - if (displayedExercise.dueDate! < new Date()) { - throw new Error("Exercise is past due date and cannot be started"); - } - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - if (!session) { - throw new NotAuthenticatedError(); - } - - participation = await startExercise(session.accessToken, displayedExercise.id!); - } - displayedExercise.studentParticipations = [participation]; - - await cloneUserRepo(participation.repositoryUri!, participation.participantIdentifier!); -} - -export async function getProblemStatementDetails(exercise: Exercise) { - // check if exercise has an active participation - let course: Course; - - const studentParticipation = exercise.studentParticipations?.at(0); - if (studentParticipation) { - // if so query the details by repoUrl of the latest participation - ({ course: course, exercise: exercise } = await getCourseExerciseByRepoUrl( - studentParticipation.repositoryUri!, - )); - } else { - // if not query the details (mainly the problem statement) by the exercise id - ({ course, exercise } = await getCourseExerciseByExerciseId(exercise.id!)); - } - - return { course: course, exercise: exercise }; -} - -/** - * - * @param repoUrl the repository url of the exercise - * @returns the course plus the exercise with the latest submission/result details - */ -export async function getCourseExerciseByRepoUrl( - repoUrl: string, -): Promise<{ course: Course; exercise: Exercise }> { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - - if (!session) { - throw new NotAuthenticatedError(); - } - - const repoName = repoUrl.split("/").pop()!.replace(".git", ""); - - const participation = await fetchParticipationByRepoName(session.accessToken, repoName); - const exerciseId = participation.exercise?.id!; - - // fetch the exercise details to get the submissions and results - const exercise = await fetchExerciseDetailesById(session.accessToken, exerciseId); - const course = exercise.course!; - - return { course: course, exercise: exercise }; -} - -async function getCourseExerciseByExerciseId(exerciseId: number) { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - - if (!session) { - throw new NotAuthenticatedError(); - } - - const { course: course, exercise: exercise } = await fetchExerciseById( - session.accessToken, - exerciseId, - ); - - return { course: course, exercise: exercise }; -} diff --git a/src/participation/realtime-sync.service.ts b/src/participation/realtime-sync.service.ts deleted file mode 100644 index 81b0efc..0000000 --- a/src/participation/realtime-sync.service.ts +++ /dev/null @@ -1,154 +0,0 @@ -import * as vscode from "vscode"; -import { Result } from "@shared/models/result.model"; -import { ProgrammingSubmission } from "@shared/models/submission.model"; -import { GenericWebSocket, WebSocketConnectionState } from "../shared/websocket"; -import { AUTH_ID } from "../authentication/authentication_provider"; -import { fetchExerciseDetailesById } from "../artemis/exercise.client"; -import { getState, setDisplayedState } from "../shared/state"; -import { handleResultMessage, handleSubmissionMessage } from "./realtime.handlers"; - -const RESULTS_TOPIC = `/user/topic/newResults`; -const SUBMISSIONS_TOPIC = `/user/topic/newSubmissions`; -const INITIAL_CONNECTION_TIMEOUT_MS = 12000; -const FALLBACK_POLL_INTERVAL_MS = 10000; - -export class RealtimeSyncService implements vscode.Disposable { - private readonly disposables: vscode.Disposable[] = []; - private fallbackPollTimer: NodeJS.Timeout | undefined; - private fallbackPollInFlight: Promise | undefined; - private subscriptionsInitialized = false; - - constructor(private readonly webSocket: GenericWebSocket = GenericWebSocket.instance) { - this.disposables.push( - this.webSocket.onConnectionStateChange((state) => { - this.handleConnectionState(state); - }), - ); - } - - public async start() { - const connected = await this.webSocket.awaitConnected(INITIAL_CONNECTION_TIMEOUT_MS); - - if (connected) { - this.ensureRealtimeSubscriptions(); - // populate with initial data - await this.refreshNow(); - return; - } - - this.startFallbackPolling(); - } - - public async refreshNow(): Promise { - await this.pollDisplayedExerciseDetails(); - } - - public dispose(): void { - if (this.fallbackPollTimer) { - clearInterval(this.fallbackPollTimer); - this.fallbackPollTimer = undefined; - } - - for (const disposable of this.disposables) { - disposable.dispose(); - } - } - - private handleConnectionState(state: WebSocketConnectionState) { - if (state === "connected") { - this.ensureRealtimeSubscriptions(); - this.stopFallbackPolling(); - this.refreshNow().catch((error) => { - console.debug("Refresh after websocket reconnect failed", error); - }); - return; - } - - if (state === "error" || state === "disconnected") { - this.startFallbackPolling(); - } - } - - private ensureRealtimeSubscriptions() { - if (this.subscriptionsInitialized) { - return; - } - - const resultSubscription = this.webSocket.subscribeToTopic(RESULTS_TOPIC); - this.disposables.push( - resultSubscription.event((result) => { - handleResultMessage(result); - }), - ); - - const submissionSubscription = - this.webSocket.subscribeToTopic(SUBMISSIONS_TOPIC); - this.disposables.push( - submissionSubscription.event((submission) => { - handleSubmissionMessage(submission); - }), - ); - - this.subscriptionsInitialized = true; - } - - private startFallbackPolling() { - if (this.fallbackPollTimer) { - return; - } - - this.fallbackPollTimer = setInterval(() => { - this.pollDisplayedExerciseDetails().catch((error) => { - console.debug("Fallback polling failed", error); - }); - }, FALLBACK_POLL_INTERVAL_MS); - - this.pollDisplayedExerciseDetails().catch((error) => { - console.debug("Initial fallback poll failed", error); - }); - } - - private stopFallbackPolling() { - if (!this.fallbackPollTimer) { - return; - } - clearInterval(this.fallbackPollTimer); - this.fallbackPollTimer = undefined; - } - - private async pollDisplayedExerciseDetails() { - if (this.fallbackPollInFlight) { - return this.fallbackPollInFlight; - } - - this.fallbackPollInFlight = this.runPollDisplayedExerciseDetails(); - try { - await this.fallbackPollInFlight; - } finally { - this.fallbackPollInFlight = undefined; - } - } - - private async runPollDisplayedExerciseDetails() { - const state = getState(); - const displayedExerciseId = state.displayedExercise?.id; - - if (!displayedExerciseId) { - return; - } - - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - - if (!session) { - return; - } - - const refreshedExercise = await fetchExerciseDetailesById( - session.accessToken, - displayedExerciseId, - ); - setDisplayedState(refreshedExercise.course ?? state.displayedCourse, refreshedExercise); - } -} diff --git a/src/participation/realtime.handlers.ts b/src/participation/realtime.handlers.ts deleted file mode 100644 index 3b88fef..0000000 --- a/src/participation/realtime.handlers.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Result } from "@shared/models/result.model"; -import { ProgrammingSubmission } from "@shared/models/submission.model"; -import { getLatestSubmission } from "@shared/models/participation.model"; -import { getState, setDisplayedState } from "../shared/state"; - -export function handleSubmissionMessage(submission: ProgrammingSubmission) { - const participationId = submission.participation?.id; - if (!participationId) { - return; - } - - const state = getState(); - const displayedStudentParticipation = state.displayedExercise?.studentParticipations?.find( - (participation) => participation.id === participationId, - ); - - if (!displayedStudentParticipation) { - return; - } - - const normalizedSubmission: ProgrammingSubmission = { - ...submission, - participation: undefined, - }; - - const currentLatestSubmission = getLatestSubmission(displayedStudentParticipation); - if ( - currentLatestSubmission && - (currentLatestSubmission.id ?? -1) > (normalizedSubmission.id ?? -1) - ) { - return; - } - - const existingResultsForSameSubmission = - currentLatestSubmission?.id === normalizedSubmission.id - ? currentLatestSubmission?.results - : undefined; - normalizedSubmission.results = getLatestResultArray( - normalizedSubmission.results, - existingResultsForSameSubmission, - ); - displayedStudentParticipation.submissions = [normalizedSubmission]; - - setDisplayedState(state.displayedCourse, state.displayedExercise); -} - -export function handleResultMessage(result: Result) { - const participationId = result.submission?.participation?.id; - if (!participationId) { - return; - } - - const state = getState(); - const displayedStudentParticipation = state.displayedExercise?.studentParticipations?.find( - (participation) => participation.id === participationId, - ); - - if (!displayedStudentParticipation) { - return; - } - - const submission = result.submission; - if (!submission?.id) { - return; - } - - const currentLatestSubmission = getLatestSubmission(displayedStudentParticipation); - if (currentLatestSubmission && (currentLatestSubmission.id ?? -1) > submission.id) { - return; - } - - const normalizedResult: Result = { - ...result, - submission: undefined, - }; - - const nextLatestSubmission: ProgrammingSubmission = - currentLatestSubmission && currentLatestSubmission.id === submission.id - ? { - ...currentLatestSubmission, - results: getLatestResultArray(currentLatestSubmission.results, [normalizedResult]), - } - : { - ...submission, - participation: undefined, - results: [normalizedResult], - }; - - displayedStudentParticipation.submissions = [nextLatestSubmission]; - - setDisplayedState(state.displayedCourse, state.displayedExercise); -} - -function getLatestResultArray(...resultArrays: Array): Result[] { - const allResults = resultArrays.flatMap((results) => results ?? []); - const latest = getLatestById(allResults); - return latest ? [latest] : []; -} - -function getLatestById(items: T[]): T | undefined { - if (items.length === 0) { - return undefined; - } - - return items.reduce((latest, current) => { - const latestId = latest.id ?? -1; - const currentId = current.id ?? -1; - return currentId > latestId ? current : latest; - }); -} diff --git a/src/problemStatement/problem_statement.ts b/src/problemStatement/problem_statement.ts deleted file mode 100644 index e4996fd..0000000 --- a/src/problemStatement/problem_statement.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as vscode from "vscode"; -import { getState, setDisplayedState } from "../shared/state"; - -export async function sync_problem_statement_with_workspace() { - const state = getState(); - if (!state.repoCourse || !state.repoExercise) { - await vscode.commands.executeCommand("scorpio.workspace.detectRepo"); - } - if (!state.repoCourse || !state.repoExercise) { - return; - } - - setDisplayedState(state.repoCourse, state.repoExercise); -} diff --git a/src/problemStatement/uml.db.ts b/src/problemStatement/uml.db.ts deleted file mode 100644 index f7947f0..0000000 --- a/src/problemStatement/uml.db.ts +++ /dev/null @@ -1,80 +0,0 @@ -import * as vscode from "vscode"; - -export class UmlFileProvider implements vscode.FileSystemProvider { - umlStorage = new Map(); - - // Required for changes tracking (even if unused) - onDidChangeFile: vscode.Event = new vscode.EventEmitter< - vscode.FileChangeEvent[] - >().event; - - // Fetch metadata (simplified) - stat(uri: vscode.Uri): vscode.FileStat { - if (!this.umlStorage.has(uri.path)) { - throw vscode.FileSystemError.FileNotFound(uri); - } - - const content = this.umlStorage.get(uri.path)!; - return { - type: vscode.FileType.File, - ctime: Date.now(), - mtime: Date.now(), - size: Buffer.byteLength(content), - }; - } - - // Read the SVG string as bytes - readFile(uri: vscode.Uri): Uint8Array { - const content = this.umlStorage.get(uri.path); - if (!content) { - throw vscode.FileSystemError.FileNotFound(uri); - } - - return content; - } - - // Only need to implement minimal methods - writeFile(uri: vscode.Uri, content: Uint8Array): void { - const { resultId } = this.uriToIds(uri); - - // check if all existing umls have the same resultId - // if not, clear the storage (displayed Result has changed) - const existingKeys = Array.from(this.umlStorage.keys()); - for (const k of existingKeys) { - const { resultId: existingResultId } = this.uriToIds(vscode.Uri.parse(k)); - - if (existingResultId !== resultId) { - this.umlStorage.delete(k); - } - } - - this.umlStorage.set(uri.path, content); - } - - // uml-preview:/resultId/umlId.svg - private uriToIds(uri: vscode.Uri): { resultId: string; umlId: string } { - const parts = uri.path.split("/").slice(1); // remove the leading "uml-preview:/" - if (parts.length !== 2) { - throw new Error("Invalid URI format"); - } - - return { resultId: parts[0], umlId: parts[1].split(".svg", 1)[0] }; - } - - public idsToUri(resultId: string, umlId: string): vscode.Uri { - return vscode.Uri.parse(`uml-preview:/${resultId}/${umlId}.svg`); - } - - // The rest are optional for read-only FS - readDirectory(): [string, vscode.FileType][] { - return []; - } - createDirectory(): void {} - delete(): void {} - rename(): void {} - watch(): vscode.Disposable { - return { dispose: () => {} }; - } -} - -export const umlFileProvider = new UmlFileProvider(); diff --git a/src/problemStatement/uml.service.ts b/src/problemStatement/uml.service.ts deleted file mode 100644 index 19b2f1c..0000000 --- a/src/problemStatement/uml.service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as vscode from "vscode"; - -export function isEditorDarkTheme(): boolean { - const theme = vscode.window.activeColorTheme.kind; - return theme === vscode.ColorThemeKind.Dark || theme === vscode.ColorThemeKind.HighContrast; -} - -export function getUmlBackgroundColor(): string { - return isEditorDarkTheme() - ? "#1e1e1e" // Default dark theme background - : "#ffffff"; // Default light theme background; -} - -export function addBackgroundColorToSvg(svg: string, backgroundColor: string): string { - return svg.replace( - /]*)>/, - ` - - `, - ); -} diff --git a/src/shared/repository.service.ts b/src/shared/repository.service.ts deleted file mode 100644 index b6be6b2..0000000 --- a/src/shared/repository.service.ts +++ /dev/null @@ -1,129 +0,0 @@ -import * as vscode from "vscode"; -import { settings } from "./settings"; -import { NotAuthenticatedError } from "../authentication/not_authenticated.error"; -import { AUTH_ID } from "../authentication/authentication_provider"; -import { Course } from "@shared/models/course.model"; -import { Exercise, getProjectKey } from "@shared/models/exercise.model"; -import { clearRepoState, setRepoState, getState } from "./state"; -import simpleGit, { RemoteWithRefs, SimpleGit } from "simple-git"; -import { getLevel1SubfoldersOfWorkspace } from "../utils/filetree"; -import { getCourseExerciseByRepoUrl } from "../exercise/exercise"; -import { getProjectKeyFromRepoUrl } from "@shared/models/participation.model"; - -var gitRepo: SimpleGit | undefined; - -export async function submitCurrentWorkspace() { - if (!gitRepo) { - throw new Error("No repository in workspace"); - } - - const diff = await gitRepo.diff(); - if (!diff || diff.length == 0) { - throw new Error("No changes to commit"); - } - - const confirm = await vscode.window.showWarningMessage( - `Are you sure you want to submit your workspace \n`, - { modal: true }, - "Confirm", - ); - - if (confirm !== "Confirm") { - throw new Error("Commit process cancelled"); - } - await gitRepo.add("."); - await gitRepo.commit("Submit workspace from artemis plugin"); - await gitRepo.push(); - - vscode.window.showInformationMessage("Workspace submitted successfully"); -} - -export async function detectRepoCourseAndExercise() { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - if (!session) { - throw new NotAuthenticatedError(); - } - - const foundRepoAndRemote = await getArtemisRepo(); - if (!foundRepoAndRemote) { - gitRepo = undefined; - clearRepoState(); - - console.log("No Artemis repository found"); - return; - } - - const repoUrl = foundRepoAndRemote.remote.refs.fetch!; - if ( - getProjectKeyFromRepoUrl(repoUrl) === - getProjectKey(getState().repoCourse, getState().repoExercise) - ) { - console.log("Repo already detected"); - gitRepo = foundRepoAndRemote.repo; - return; - } - - const course_exercise: { course: Course; exercise: Exercise } = - await getCourseExerciseByRepoUrl(repoUrl); - - gitRepo = foundRepoAndRemote.repo; - setRepoState(course_exercise.course, course_exercise.exercise); -} - -async function getArtemisRepo(): Promise<{ repo: SimpleGit; remote: RemoteWithRefs } | undefined> { - if (!settings.base_url) { - throw new Error("Base URL is not set"); - } - - const workspaceFolders = vscode.workspace.workspaceFolders; - if (!workspaceFolders || workspaceFolders.length === 0) { - console.log("No workspace folder available to detect repository"); - return undefined; - } - - // Check if the workspace is a git repository - for (const folder of workspaceFolders) { - var foundRepo = await checkIfArtemisRepo(folder.uri.fsPath, settings.base_url); - if (foundRepo) { - return foundRepo; - } - } - - // Get all level 1 subfolders of the workspace - const level1SubfoldersPath = await getLevel1SubfoldersOfWorkspace(workspaceFolders); - - // Check each level 1 subfolder for a git repository - for (const folderPath of level1SubfoldersPath) { - var foundRepo = await checkIfArtemisRepo(folderPath.fsPath, settings.base_url); - if (foundRepo) { - return foundRepo; - } - } - - return undefined; -} - -async function checkIfArtemisRepo( - workDirectory: string, - artemisUrl: string, -): Promise<{ repo: SimpleGit; remote: RemoteWithRefs } | undefined> { - const git: SimpleGit = simpleGit(workDirectory); - try { - const isRepo = await git.checkIsRepo(); - if (isRepo) { - const remotes = await git.getRemotes(true); - for (const remote of remotes) { - const url = new URL(remote.refs.fetch!); - if (url.hostname == new URL(artemisUrl).hostname) { - return { repo: git, remote: remote }; - } - } - } - } catch (error: any) { - console.error(`Error checking if folder is a repository: ${error.message}`); - } - - return undefined; -} diff --git a/src/shared/state.ts b/src/shared/state.ts deleted file mode 100644 index e74c51a..0000000 --- a/src/shared/state.ts +++ /dev/null @@ -1,78 +0,0 @@ -import * as vscode from "vscode"; -import { Course } from "@shared/models//course.model"; -import { Exercise, getProjectKey } from "@shared/models/exercise.model"; - -export interface State { - displayedCourse: Course | undefined; - displayedExercise: Exercise | undefined; - repoCourse: Course | undefined; - repoExercise: Exercise | undefined; -} - -export const onStateChange: vscode.EventEmitter = new vscode.EventEmitter(); - -let _state: State = { - displayedCourse: undefined, - displayedExercise: undefined, - repoCourse: undefined, - repoExercise: undefined, -}; - -export function getState(): State { - return _state; -} - -export function setDisplayedState(course: Course | undefined, exercise: Exercise | undefined) { - _state.displayedCourse = course; - _state.displayedExercise = exercise; - - if (course) { - // if an exercise is displayed and it was not due yet, set the displayedKey to enable the clone button - if (exercise && (!exercise.dueDate || new Date(exercise.dueDate) >= new Date())) { - vscode.commands.executeCommand( - "setContext", - "scorpio.displayedKey", - getProjectKey(course, exercise), - ); - } else { - // if the exercise was due, disable the clone button - vscode.commands.executeCommand("setContext", "scorpio.displayedKey", null); - } - - // if either is displayed, show back button - vscode.commands.executeCommand("setContext", "scorpio.displayBackButton", true); - } else { - // nothing is selected (in course selection) -> no back button - vscode.commands.executeCommand("setContext", "scorpio.displayedKey", null); - vscode.commands.executeCommand("setContext", "scorpio.displayBackButton", false); - } - - onStateChange.fire(_state); -} - -export function setRepoState(course: Course, exercise: Exercise) { - _state.repoCourse = course; - _state.repoExercise = exercise; - - // if the exercise is not due yet, set the repoKey to enable the push button - if (!exercise.dueDate || new Date(exercise.dueDate) >= new Date()) { - vscode.commands.executeCommand("setContext", "scorpio.repoKey", [ - getProjectKey(course, exercise), - ]); - } - - if (!_state.displayedCourse || !_state.displayedExercise) { - // this methode will fire the onStateChange event - setDisplayedState(course, exercise); - } else { - onStateChange.fire(_state); - } -} - -export function clearRepoState() { - _state.repoCourse = undefined; - _state.repoExercise = undefined; - - vscode.commands.executeCommand("setContext", "scorpio.repoKey", null); - onStateChange.fire(_state); -} diff --git a/src/shared/websocket.ts b/src/shared/websocket.ts deleted file mode 100644 index 45237ee..0000000 --- a/src/shared/websocket.ts +++ /dev/null @@ -1,202 +0,0 @@ -import * as vscode from "vscode"; -import { EventEmitter } from "vscode"; -import { AUTH_ID } from "../authentication/authentication_provider"; -import WebSocket from "ws"; -import { settings } from "./settings"; -// @ts-expect-error No type declarations -import * as StompJs from "@stomp/stompjs"; - -export type WebSocketConnectionState = "disconnected" | "connecting" | "connected" | "error"; - -export class GenericWebSocket { - static #instance: GenericWebSocket | undefined; - - private stompClient: any; - private setupPromise: Promise | undefined; - private connectionState: WebSocketConnectionState = "disconnected"; - private subscriptions = new Map>(); - private topicSubscriptions = new Map(); - private readonly stateChangeEmitter = new EventEmitter(); - private readonly connectedEmitter = new EventEmitter(); - - private constructor() { - // use GenericWebSocket.instance - } - - public static get instance(): GenericWebSocket { - if (!GenericWebSocket.#instance) { - GenericWebSocket.#instance = new GenericWebSocket(); - } - return GenericWebSocket.#instance; - } - - public get connected(): boolean { - return this.stompClient && this.stompClient.connected; - } - - public get onConnectionStateChange(): vscode.Event { - return this.stateChangeEmitter.event; - } - - public async ensureConnection(): Promise { - await this.setup(); - if (this.connected || this.connectionState === "connecting") { - return; - } - - this.setConnectionState("connecting"); - this.stompClient.activate(); - } - - public async awaitConnected(timeoutMs: number = 10000): Promise { - if (this.connected) { - return true; - } - - const startTime = Date.now(); - await this.ensureConnection(); - - if (this.connected) { - return true; - } - - return new Promise((resolve) => { - const elapsedMs = Date.now() - startTime; - const remainingTimeoutMs = Math.max(0, timeoutMs - elapsedMs); - - const timeout = setTimeout(() => { - disposable.dispose(); - resolve(false); - }, remainingTimeoutMs); - - const disposable = this.connectedEmitter.event(() => { - clearTimeout(timeout); - disposable.dispose(); - resolve(true); - }); - }); - } - - private async setup() { - if (this.setupPromise) { - return this.setupPromise; - } - - this.setupPromise = this.createClient().catch((error) => { - this.setupPromise = undefined; - throw error; - }); - return this.setupPromise; - } - - private async createClient() { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - - if (!session) { - throw Error("Not authenticated"); - } - - const url = new URL(settings.base_url!); - url.pathname = "/websocket/websocket"; - - this.stompClient = new StompJs.Client({ - brokerURL: url.toString(), - webSocketFactory: () => - new WebSocket(url, { headers: { Authorization: `Bearer ${session.accessToken}` } }), - connectHeaders: { - Authorization: `Bearer ${session.accessToken}`, - }, - debug: function (str: string) { - console.debug(str); - }, - reconnectDelay: 5000, - heartbeatIncoming: 10000, - heartbeatOutgoing: 10000, - }); - - this.stompClient.onConnect = (frame: any) => { - this.onConnect(frame); - }; - this.stompClient.onDisconnect = () => { - this.setConnectionState("disconnected"); - }; - this.stompClient.onWebSocketClose = () => { - this.setConnectionState("disconnected"); - }; - this.stompClient.onWebSocketError = (_event: Event) => { - this.setConnectionState("error"); - }; - this.stompClient.onStompError = (frame: any) => { - console.error(`Error: ${frame.body}`); - this.setConnectionState("error"); - }; - } - - public subscribeToTopic(topic: string): EventEmitter { - if (this.subscriptions.has(topic)) { - return this.subscriptions.get(topic)!; - } - - if (!this.connected) { - throw Error(`Cannot subscribe to topic ${topic}: WebSocket is not connected.`); - } - - const subscription = new EventEmitter(); - this.subscriptions.set(topic, subscription); - - this.subscribeInternal(topic, subscription); - console.debug(`Subscribed to topic: ${topic}`); - return subscription; - } - - public sendMessage(topic: string, message: object): void { - if (!this.connected) { - console.error("Cannot send message: WebSocket is not connected."); - return; - } - - this.stompClient.publish({ - destination: topic, - body: JSON.stringify(message), - }); - } - - public disconnect(): void { - this.stompClient?.deactivate(); - this.setConnectionState("disconnected"); - } - - private setConnectionState(nextState: WebSocketConnectionState) { - if (this.connectionState === nextState) { - return; - } - this.connectionState = nextState; - this.stateChangeEmitter.fire(nextState); - } - - private onConnect(_frame: any) { - this.setConnectionState("connected"); - this.connectedEmitter.fire(); - - for (const [topic, emitter] of this.subscriptions.entries()) { - this.subscribeInternal(topic, emitter); - } - } - - private subscribeInternal(topic: string, subscription: EventEmitter) { - this.topicSubscriptions.get(topic)?.unsubscribe(); - - const stompSubscription = this.stompClient.subscribe(topic, (message: any) => { - try { - const json = JSON.parse(message.body); - subscription.fire(json as T); - } catch (error) { - console.error(`Failed to parse websocket message from ${topic}`, error); - } - }); - - this.topicSubscriptions.set(topic, stompSubscription); - } -} diff --git a/src/sidebar/getNonce.ts b/src/sidebar/getNonce.ts deleted file mode 100644 index c57706e..0000000 --- a/src/sidebar/getNonce.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * A helper function that returns a unique alphanumeric identifier called a nonce. - * - * @remarks This function is primarily used to help enforce content security - * policies for resources/scripts being executed in a webview context. - * - * @returns A nonce - */ -export function getNonce() { - let text = ""; - const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; -} diff --git a/src/sidebar/getUri.ts b/src/sidebar/getUri.ts deleted file mode 100644 index 7145499..0000000 --- a/src/sidebar/getUri.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Uri, Webview } from "vscode"; - -/** - * A helper function which will get the webview URI of a given file or resource. - * - * @remarks This URI can be used within a webview's HTML as a link to the - * given file/resource. - * - * @param webview A reference to the extension webview - * @param extensionUri The URI of the directory containing the extension - * @param pathList An array of strings representing the path to a file/resource - * @returns A URI pointing to the file/resource - */ -export function getUri(webview: Webview, extensionUri: Uri, pathList: string[]) { - return webview.asWebviewUri(Uri.joinPath(extensionUri, ...pathList)); -} diff --git a/src/sidebar/sidebarProvider.ts b/src/sidebar/sidebarProvider.ts deleted file mode 100644 index 68b4f2a..0000000 --- a/src/sidebar/sidebarProvider.ts +++ /dev/null @@ -1,297 +0,0 @@ -import * as vscode from "vscode"; -import { onStateChange, setDisplayedState, getState } from "../shared/state"; -import { AUTH_ID } from "../authentication/authentication_provider"; -import { settings } from "../shared/settings"; -import { Course } from "@shared/models/course.model"; -import { getUri } from "./getUri"; -import { getNonce } from "./getNonce"; -import { fetchAllCourses } from "../artemis/course.client"; -import { fetchProgrammingExercisesByCourseId } from "../artemis/exercise.client"; -import { CommandFromExtension, CommandFromWebview } from "@shared/webview-commands"; -import { getProblemStatementDetails } from "../exercise/exercise"; -import { fetchUml } from "../artemis/problem-statement.client"; -import { getProjectKey } from "@shared/models/exercise.model"; -import { umlFileProvider } from "../problemStatement/uml.db"; -import { getUmlBackgroundColor, isEditorDarkTheme } from "../problemStatement/uml.service"; - -export class SidebarProvider implements vscode.WebviewViewProvider { - _view?: vscode.WebviewView; - htmlContent?: string; - - constructor( - private readonly _extensionUri: vscode.Uri, - private readonly onAuthSessionsChange: vscode.EventEmitter, - ) { - onStateChange.event(() => { - this.displayExercise(); - }); - - this.onAuthSessionsChange.event(async ({ added, removed }) => { - if (added && added.length > 0) { - this.login(added[0]); - return; - } - if (removed && removed.length > 0) { - this.logout(); - return; - } - }); - - vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("scorpio.?")) { - this.easterEgg(); - } - }); - } - - public resolveWebviewView(webviewView: vscode.WebviewView) { - this._view = webviewView; - - webviewView.webview.options = { - // Allow scripts in the webview - enableScripts: true, - localResourceRoots: [ - // vscode.Uri.joinPath(this._extensionUri, "out"), - vscode.Uri.joinPath(this._extensionUri, "dist"), - vscode.Uri.joinPath(this._extensionUri, "webview/build"), - ], - }; - - this.initHTML(); - - this.initState(); - - webviewView.webview.onDidReceiveMessage(async (data) => { - const pathParts = data.command.split("/"); - switch (pathParts[0]) { - case CommandFromWebview.INFO: { - if (!data.text) { - return; - } - vscode.window.showInformationMessage(`Sidebar: ${data.text}`); - break; - } - case CommandFromWebview.ERROR: { - if (!data.text) { - return; - } - console.error(data.text); - vscode.window.showErrorMessage(`Sidebar: ${data.text}`); - break; - } - case CommandFromWebview.LOGIN: { - vscode.commands.executeCommand("scorpio.login"); - break; - } - case CommandFromWebview.GET_COURSE_OPTIONS: { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - if (!session) { - return; - } - const courses: Course[] = await fetchAllCourses(session.accessToken); - this._view?.webview.postMessage({ - command: CommandFromExtension.SEND_COURSE_OPTIONS, - text: JSON.stringify(courses), - }); - break; - } - case CommandFromWebview.GET_EXERCISE_OPTIONS: { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - if (!session) { - return; - } - const exercises = await fetchProgrammingExercisesByCourseId( - session.accessToken, - getState().displayedCourse!.id!, - ); - this._view?.webview.postMessage({ - command: CommandFromExtension.SEND_EXERCISE_OPTIONS, - text: JSON.stringify(exercises), - }); - break; - } - case CommandFromWebview.GET_EXERCISE_DETAILS: { - const { course: course, exercise: exercise } = await getProblemStatementDetails( - getState().displayedExercise!, - ); - setDisplayedState(course, exercise); - break; - } - case CommandFromWebview.GET_UML: { - if (!data.text) { - return; - } - - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - if (!session) { - return; - } - var plantUml = await fetchUml(session.accessToken, data.text, isEditorDarkTheme()); - - // send the uml to the webview for rendering - this._view?.webview.postMessage({ - command: CommandFromExtension.SEND_UML + "/" + pathParts[1] + "/" + pathParts[2], - text: plantUml, - }); - - // save the uml to the file system for later pop out functionality - const previewUri = umlFileProvider.idsToUri(pathParts[1], pathParts[2]); - // add a background color to the svg - plantUml = plantUml.replace( - /]*)>/, - ` - - `, - ); - umlFileProvider.writeFile(previewUri, Buffer.from(plantUml, "utf-8")); - break; - } - case CommandFromWebview.OPEN_UML: { - const previewUri = umlFileProvider.idsToUri(pathParts[1], pathParts[2]); - await vscode.commands.executeCommand( - "vscode.openWith", - previewUri, - "imagePreview.previewEditor", - ); - break; - } - case CommandFromWebview.CLONE_REPOSITORY: { - vscode.commands.executeCommand("scorpio.displayedExercise.clone"); - break; - } - case CommandFromWebview.SUBMIT: { - vscode.commands.executeCommand("scorpio.workspace.submit"); - break; - } - case CommandFromWebview.SET_COURSE_AND_EXERCISE: { - if (!data.text) { - return; - } - const { course, exercise } = JSON.parse(data.text); - - setDisplayedState(course, exercise); - break; - } - } - }); - } - - private initHTML() { - if (!this._view) { - return; - } - - // The CSS file from the Angular build output - const stylesUri = getUri(this._view.webview, this._extensionUri, [ - "webview", - "build", - "browser", - "styles.css", - ]); - // The JS files from the Angular build output - const polyfillsUri = getUri(this._view.webview, this._extensionUri, [ - "webview", - "build", - "browser", - "polyfills.js", - ]); - const scriptUri = getUri(this._view.webview, this._extensionUri, [ - "webview", - "build", - "browser", - "main.js", - ]); - const petImageUri = getUri(this._view.webview, this._extensionUri, [ - "webview", - "build", - "browser", - "assets", - "penguin.png", - ]); - - const nonce = getNonce(); - - this._view.webview.html = ` - - - - - - - - Hello World - - - - - - - - - `; - } - - private async initState() { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - if (session) { - this.login(session); - this.displayExercise(); - } - - this.easterEgg(); - } - - private login(_: vscode.AuthenticationSession) { - this._view?.webview.postMessage({ - command: CommandFromExtension.SEND_LOGIN_STATE, - text: true, - }); - } - - private logout() { - this._view?.webview.postMessage({ - command: CommandFromExtension.SEND_LOGIN_STATE, - text: false, - }); - } - - private displayExercise() { - const state = getState(); - const repoKey = - state.repoCourse && state.repoExercise - ? getProjectKey(state.repoCourse, state.repoExercise) - : undefined; - const course = state.displayedCourse; - const exercise = state.displayedExercise; - - this._view?.webview.postMessage({ - command: CommandFromExtension.SEND_COURSE_EXERCISE_REPOKEY, - text: JSON.stringify({ - course: course, - exercise: exercise, - repoKey: repoKey, - }), - }); - } - - private easterEgg() { - this._view?.webview.postMessage({ - command: CommandFromExtension.EASTER_EGG, - text: `${settings.easter_egg}`, - }); - } - - public revive(panel: vscode.WebviewView) { - this._view = panel; - - this.initState(); - } -} diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts deleted file mode 100644 index 60bf994..0000000 --- a/src/test/suite/extension.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as assert from "assert"; - -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it -import * as vscode from "vscode"; -// import * as myExtension from '../../extension'; - -suite("Web Extension Test Suite", () => { - vscode.window.showInformationMessage("Start all tests."); - - test("Sample test", () => { - assert.strictEqual(-1, [1, 2, 3].indexOf(5)); - assert.strictEqual(-1, [1, 2, 3].indexOf(0)); - }); -}); diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts deleted file mode 100644 index a604d25..0000000 --- a/src/test/suite/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Imports mocha for the browser, defining the `mocha` global. -require("mocha/mocha"); - -export function run(): Promise { - return new Promise((c, e) => { - mocha.setup({ - ui: "tdd", - reporter: undefined, - }); - - // Bundles all files in the current directory matching `*.test` - const importAll = (r: __WebpackModuleApi.RequireContext) => r.keys().forEach(r); - importAll(require.context(".", true, /\.test$/)); - - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err); - } - }); -} diff --git a/src/utils/filetree.ts b/src/utils/filetree.ts deleted file mode 100644 index ad771ce..0000000 --- a/src/utils/filetree.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as vscode from "vscode"; - -export async function getLevel1Subfolders(folderUri: vscode.Uri): Promise { - const subfolders: vscode.Uri[] = []; - const entries = await vscode.workspace.fs.readDirectory(folderUri); - - for (const [name, type] of entries) { - if (type === vscode.FileType.Directory) { - subfolders.push(vscode.Uri.joinPath(folderUri, name)); - } - } - - return subfolders; -} - -export async function getLevel1SubfoldersOfWorkspace( - workspaceFolders: readonly vscode.WorkspaceFolder[], -): Promise { - return Promise.all(workspaceFolders.map((folder) => getLevel1Subfolders(folder.uri))).then( - (results) => { - const level1SubfoldersPath = results.flat(); - return level1SubfoldersPath; - }, - ); -} diff --git a/webview/.gitignore b/webview/.gitignore deleted file mode 100644 index 8219217..0000000 --- a/webview/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# Compiled output -/dist -/build -/tmp -/out-tsc -/bazel-out - -# Node -/node_modules -npm-debug.log -yarn-error.log - -# IDEs and editors -.idea/ -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# Visual Studio Code -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# Miscellaneous -/.angular/cache -.sass-cache/ -/connect.lock -/coverage -/libpeerconnection.log -testem.log -/typings - -# System files -.DS_Store -Thumbs.db \ No newline at end of file diff --git a/webview/.vscode/launch.json b/webview/.vscode/launch.json deleted file mode 100644 index 740e35a..0000000 --- a/webview/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "ng serve", - "type": "pwa-chrome", - "request": "launch", - "preLaunchTask": "npm: start", - "url": "http://localhost:4200/" - }, - { - "name": "ng test", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: test", - "url": "http://localhost:9876/debug.html" - } - ] -} diff --git a/webview/.vscode/tasks.json b/webview/.vscode/tasks.json deleted file mode 100644 index a298b5b..0000000 --- a/webview/.vscode/tasks.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "start", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - }, - { - "type": "npm", - "script": "test", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - } - ] -} diff --git a/webview/README.md b/webview/README.md deleted file mode 100644 index 1a1df77..0000000 --- a/webview/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Angular Webview - -This webview is based on the repository [angular-webview](https://github.com/microsoft/vscode-webview-ui-toolkit-samples/tree/main/frameworks/hello-world-angular) from the [vscode-webview-ui-toolkit-samples](https://github.com/microsoft/vscode-webview-ui-toolkit-samples/tree/main) - -```bash -# Install dependencies for both the extension and webview UI source code -npm run install:all - -# Build webview UI source code -npm run build:webview - -# Open sample in VS Code -code . -``` - -Once the sample is open inside VS Code you can run the extension by doing the following: - -1. Press `F5` to open a new Extension Development Host window -2. Inside the host window, open the command palette (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) diff --git a/webview/angular.json b/webview/angular.json deleted file mode 100644 index 41650b0..0000000 --- a/webview/angular.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "scorpio-webview": { - "projectType": "application", - "schematics": { - "@schematics/angular:application": { - "strict": true - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular/build:application", - "options": { - "outputPath": { - "base": "build" - }, - "index": "src/index.html", - "polyfills": ["src/polyfills.ts", "@angular/localize/init"], - "tsConfig": "tsconfig.app.json", - "assets": ["src/assets"], - "styles": [ - "node_modules/highlight.js/styles/atom-one-dark.css", - "node_modules/bootstrap/dist/css/bootstrap.min.css", - "src/vscode.css" - ], - "scripts": [], - "allowedCommonJsDependencies": [ - "@vscode/markdown-it-katex", - "dompurify", - "markdown-it-class" - ], - "inlineStyleLanguage": "css", - "browser": "src/main.ts" - }, - "configurations": { - "production": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "1mb", - "maximumError": "3mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" - } - ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "outputHashing": "all" - }, - "development": { - "optimization": false, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular/build:dev-server", - "configurations": { - "production": { - "buildTarget": "scorpio-webview:build:production" - }, - "development": { - "buildTarget": "scorpio-webview:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular/build:extract-i18n", - "options": { - "buildTarget": "scorpio-webview:build" - } - } - } - } - } -} diff --git a/webview/package-lock.json b/webview/package-lock.json deleted file mode 100644 index f68adec..0000000 --- a/webview/package-lock.json +++ /dev/null @@ -1,9319 +0,0 @@ -{ - "name": "scorpio-webview", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "scorpio-webview", - "version": "0.0.1", - "dependencies": { - "@angular/animations": "^19.0.5", - "@angular/common": "^19.0.5", - "@angular/compiler": "^19.0.5", - "@angular/core": "^19.0.5", - "@angular/forms": "^19.0.5", - "@angular/platform-browser": "^19.0.5", - "@angular/platform-browser-dynamic": "^19.0.5", - "@angular/router": "^19.0.5", - "@floating-ui/core": "^1.6.9", - "@fortawesome/angular-fontawesome": "^1.0.0", - "@fortawesome/fontawesome-free": "^6.7.2", - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-regular-svg-icons": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@ng-bootstrap/ng-bootstrap": "^18.0.0", - "@popperjs/core": "^2.11.8", - "@vscode/markdown-it-katex": "^1.1.2", - "@vscode/webview-ui-toolkit": "^1.4.0", - "bootstrap": "^5.3.8", - "dompurify": "^3.2.4", - "highlight.js": "^11.11.1", - "markdown-it": "^14.1.1", - "markdown-it-class": "^1.0.0", - "markdown-it-highlightjs": "^4.2.0", - "rxjs": "~7.8.2", - "trusted-types": "^2.0.0", - "tslib": "^2.8.0", - "zone.js": "~0.15.0" - }, - "devDependencies": { - "@angular-eslint/builder": "18.3.1", - "@angular-eslint/eslint-plugin": "18.3.1", - "@angular-eslint/eslint-plugin-template": "18.3.1", - "@angular-eslint/schematics": "18.3.1", - "@angular-eslint/template-parser": "18.3.1", - "@angular/build": "^19.0.6", - "@angular/cli": "^19.0.6", - "@angular/compiler-cli": "^19.0.5", - "@angular/language-service": "^19.0.5", - "@angular/localize": "^19.0.5", - "@types/bootstrap": "^5.2.10", - "@types/katex": "^0.16.8", - "@types/markdown-it": "^14.1.2", - "@types/vscode-webview": "^1.57.0", - "typescript": "^5.5.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.0.6", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/architect/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.12.tgz", - "integrity": "sha512-NtB6ypsaDyPE6/fqWOdfTmACs+yK5RqfH5tStEzWFeeDsIEDYKsJ06ypuRep7qTjYus5Rmttk0Ds+cFgz8JdUQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.12.tgz", - "integrity": "sha512-mMea9txHbnCX5lXLHlo0RAgfhFHDio45/jMsREM2PA8UtVf2S8ltXz7ZwUrUyMQRv8vaSfn4ijDstF4hDMnRgQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@angular-devkit/core": "18.2.12", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.11", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular-eslint/builder": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.1.tgz", - "integrity": "sha512-cPc7Ye9zDs5M4i+feL6vob+mh7yX5vxvOS5KQIhneUrp5e9D+IGuNFMmBLlOPpmklSc9XJBtuvI5Zjuh4z1ETw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.3.1.tgz", - "integrity": "sha512-sikmkjfsXPpPTku1aQkQ1MNNEKGBgGGRvUN/WeNS9dhCJ4dxU3O7dZctt1aQWj+W3nbuUtDiimAWF5fZHGFE2Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-eslint/eslint-plugin": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.1.tgz", - "integrity": "sha512-MP4Nm+SHboF8KdnN0KpPEGAaTTzDLPm3+S/4W3Mg8onqWCyadyd4mActh9mK/pvCj8TVlb/SW1zeTtdMYhwonw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "@angular-eslint/utils": "18.3.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.1.tgz", - "integrity": "sha512-hBJ3+f7VSidvrtYaXH7Vp0sWvblA9jLK2c6uQzhYGWdEDUcTg7g7VI9ThW39WvMbHqkyzNE4PPOynK69cBEDGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "@angular-eslint/utils": "18.3.1", - "aria-query": "5.3.0", - "axobject-query": "4.1.0" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.3.1.tgz", - "integrity": "sha512-BTsQHDu7LjvXannJTb5BqMPCFIHRNN94eRyb60VfjJxB/ZFtsbAQDFFOi5lEZsRsd4mBeUMuL9mW4IMcPtUQ9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/eslint-plugin": "18.3.1", - "@angular-eslint/eslint-plugin-template": "18.3.1", - "ignore": "5.3.2", - "semver": "7.6.3", - "strip-json-comments": "3.1.1" - }, - "peerDependencies": { - "@angular-devkit/core": ">= 18.0.0 < 19.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0" - } - }, - "node_modules/@angular-eslint/template-parser": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.1.tgz", - "integrity": "sha512-JUUkfWH1G+u/Uk85ZYvJSt/qwN/Ko+jlXFtzBEcknJZsTWTwBcp36v77gPZe5FmKSziJZpyPUd+7Kiy6tuSCTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "eslint-scope": "^8.0.2" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/utils": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.1.tgz", - "integrity": "sha512-sd9niZI7h9H2FQ7OLiQsLFBhjhRQTASh+Q0+4+hyjv9idbSHBJli8Gsi2fqj9zhtMKpAZFTrWzuLUpubJ9UYbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular/animations": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", - "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.5" - } - }, - "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", - "@babel/core": "7.26.0", - "@babel/helper-annotate-as-pure": "7.25.9", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", - "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", - "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", - "magic-string": "0.30.12", - "mrmime": "2.0.0", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", - "semver": "7.6.3", - "vite": "5.4.11", - "watchpack": "2.4.2" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "lmdb": "3.1.5" - }, - "peerDependencies": { - "@angular/compiler": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@angular/localize": "^19.0.0", - "@angular/platform-server": "^19.0.0", - "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", - "less": "^4.2.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "@inquirer/prompts": "7.1.0", - "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", - "@yarnpkg/lockfile": "1.1.0", - "ini": "5.0.0", - "jsonc-parser": "3.3.1", - "listr2": "8.2.5", - "npm-package-arg": "12.0.0", - "npm-pick-manifest": "10.0.0", - "pacote": "20.0.0", - "resolve": "1.22.8", - "semver": "7.6.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.0.6", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@angular/cli/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.5", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.5" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } - } - }, - "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", - "license": "MIT", - "dependencies": { - "@babel/core": "7.26.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/compiler": "19.0.5", - "typescript": ">=5.5 <5.7" - } - }, - "node_modules/@angular/compiler-cli/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@angular/compiler-cli/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "license": "MIT", - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" - } - }, - "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/language-service": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.0.5.tgz", - "integrity": "sha512-E4WFEsCzHuF3DYe4EfOCiMGW1zWmq3UYi5XXOBNLyzWDvwU5xTfdme6ECXGawHMc2kCaWMVNL4DzYpVsUgLG0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - } - }, - "node_modules/@angular/localize": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-19.0.5.tgz", - "integrity": "sha512-4Uk0cNYXZpjPvUXo5gAy0rjCcemyAVOG319q5BJyLSeCV0DJ+MTIR6ylGK3oLSXqKACpF3r3+Wa235xj7vxk3Q==", - "license": "MIT", - "dependencies": { - "@babel/core": "7.26.0", - "@types/babel__core": "7.20.5", - "fast-glob": "3.3.2", - "yargs": "^17.2.1" - }, - "bin": { - "localize-extract": "tools/bundles/src/extract/cli.js", - "localize-migrate": "tools/bundles/src/migrate/cli.js", - "localize-translate": "tools/bundles/src/translate/cli.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/compiler": "19.0.5", - "@angular/compiler-cli": "19.0.5" - } - }, - "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.5.tgz", - "integrity": "sha512-KKFdue/uJVxkWdrntRAXkz+ycp4nD3SuGOH5pPf2svCBxieuHuFlWDi+DYVuFSEpC/ICCmlhrtzIAm44A4qzzQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/compiler": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5" - } - }, - "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.5", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "peer": true, - "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/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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", - "peer": true - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, - "node_modules/@fortawesome/angular-fontawesome": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-1.0.0.tgz", - "integrity": "sha512-EC2fYuXIuw2ld1kzJi+zysWus6OeGGfLQtbh0hW9zyyq5aBo8ZJkcJKBsVQ8E6Mg7nHyTWaXn+sdcXTPDWz+UQ==", - "license": "MIT", - "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.7.1", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "@angular/core": "^19.0.0" - } - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", - "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", - "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", - "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", - "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", - "license": "MIT", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.2.tgz", - "integrity": "sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==", - "license": "(CC-BY-4.0 AND MIT)", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", - "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", - "license": "(CC-BY-4.0 AND MIT)", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", - "external-editor": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/type": "^3.0.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.2", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", - "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/type": "^1.5.5" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@microsoft/fast-element": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.14.0.tgz", - "integrity": "sha512-zXvuSOzvsu8zDTy9eby8ix8VqLop2rwKRgp++ZN2kTCsoB3+QJVoaGD2T/Cyso2ViZQFXNpiNCVKfnmxBvmWkQ==", - "license": "MIT" - }, - "node_modules/@microsoft/fast-foundation": { - "version": "2.50.0", - "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.50.0.tgz", - "integrity": "sha512-8mFYG88Xea1jZf2TI9Lm/jzZ6RWR8x29r24mGuLojNYqIR2Bl8+hnswoV6laApKdCbGMPKnsAL/O68Q0sRxeVg==", - "license": "MIT", - "dependencies": { - "@microsoft/fast-element": "^1.14.0", - "@microsoft/fast-web-utilities": "^5.4.1", - "tabbable": "^5.2.0", - "tslib": "^1.13.0" - } - }, - "node_modules/@microsoft/fast-foundation/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@microsoft/fast-react-wrapper": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.25.tgz", - "integrity": "sha512-jKzmk2xJV93RL/jEFXEZgBvXlKIY4N4kXy3qrjmBfFpqNi3VjY+oUTWyMnHRMC5EUhIFxD+Y1VD4u9uIPX3jQw==", - "license": "MIT", - "dependencies": { - "@microsoft/fast-element": "^1.14.0", - "@microsoft/fast-foundation": "^2.50.0" - }, - "peerDependencies": { - "react": ">=16.9.0" - } - }, - "node_modules/@microsoft/fast-web-utilities": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz", - "integrity": "sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==", - "license": "MIT", - "dependencies": { - "exenv-es6": "^1.1.1" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@napi-rs/nice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.1", - "@napi-rs/nice-android-arm64": "1.0.1", - "@napi-rs/nice-darwin-arm64": "1.0.1", - "@napi-rs/nice-darwin-x64": "1.0.1", - "@napi-rs/nice-freebsd-x64": "1.0.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", - "@napi-rs/nice-linux-arm64-gnu": "1.0.1", - "@napi-rs/nice-linux-arm64-musl": "1.0.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", - "@napi-rs/nice-linux-s390x-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-musl": "1.0.1", - "@napi-rs/nice-win32-arm64-msvc": "1.0.1", - "@napi-rs/nice-win32-ia32-msvc": "1.0.1", - "@napi-rs/nice-win32-x64-msvc": "1.0.1" - } - }, - "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", - "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", - "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", - "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", - "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", - "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", - "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", - "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", - "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", - "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", - "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", - "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", - "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ng-bootstrap/ng-bootstrap": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-18.0.0.tgz", - "integrity": "sha512-GeSAz4yiGq49psdte8kcf+Y562wB3jK/qKRAkh6iA32lcXmy2sfQXVAmlHdjZ3AyP+E8lf3yMwuPdSKiYcDgSg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^19.0.0", - "@angular/core": "^19.0.0", - "@angular/forms": "^19.0.0", - "@angular/localize": "^19.0.0", - "@popperjs/core": "^2.11.8", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/git": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.1.tgz", - "integrity": "sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", - "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@parcel/watcher/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", - "jsonc-parser": "3.3.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.0.6", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@schematics/angular/node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@schematics/angular/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.0.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.0.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/bootstrap": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz", - "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.2" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/vscode-webview": { - "version": "1.57.5", - "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.5.tgz", - "integrity": "sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", - "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", - "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", - "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", - "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", - "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.18.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@vscode/markdown-it-katex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vscode/markdown-it-katex/-/markdown-it-katex-1.1.2.tgz", - "integrity": "sha512-+4IIv5PgrmhKvW/3LpkpkGg257OViEhXkOOgCyj5KMsjsOfnRXkni8XAuuF9Ui5p3B8WnUovlDXAQNb8RJ/RaQ==", - "license": "MIT", - "dependencies": { - "katex": "^0.16.4" - } - }, - "node_modules/@vscode/webview-ui-toolkit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz", - "integrity": "sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==", - "license": "MIT", - "dependencies": { - "@microsoft/fast-element": "^1.12.0", - "@microsoft/fast-foundation": "^2.49.4", - "@microsoft/fast-react-wrapper": "^0.3.22", - "tslib": "^2.6.2" - }, - "peerDependencies": { - "react": ">=16.9.0" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-media-query-parser": "^0.2.3" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "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/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "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": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/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/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/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==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/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==", - "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/cliui/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==", - "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/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", - "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "engines": { - "node": ">=20" - }, - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.75", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", - "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "peer": true, - "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/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/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", - "peer": true - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "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", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "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", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/exenv-es6": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz", - "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==", - "license": "MIT" - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true, - "license": "Apache-2.0" - }, - "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/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-core-module": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", - "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/katex": { - "version": "0.16.21", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", - "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "msgpackr": "^1.11.2", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.2.2", - "ordered-binary": "^1.5.3", - "weak-lru-cache": "^1.2.2" - }, - "bin": { - "download-lmdb-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it-class": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-class/-/markdown-it-class-1.0.0.tgz", - "integrity": "sha512-CVDYqSgmErLAqInwWu8WmAR2nX6MMIBIt8LB6qg8DNldca9+aoC6ZyuY0lvBMsaTSHNFJRkcHVR1XjLw9nr9qQ==", - "license": "MIT" - }, - "node_modules/markdown-it-highlightjs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-4.2.0.tgz", - "integrity": "sha512-NC7pXE8KkOl6xWJVRNt8p6wgJVznXKsE0HgYGdk6DD2tn1l4L9f0ALf3VIoGVkotNU1uGQatSxfBF1zZPUMmuQ==", - "license": "Unlicense", - "dependencies": { - "highlight.js": "^11.9.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/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", - "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/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-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/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/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/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-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "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/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/msgpackr": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", - "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", - "dev": true, - "license": "MIT", - "optional": true, - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "tar": "^7.4.3", - "which": "^5.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-bundled": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-install-checks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-packlist": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", - "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^7.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^3.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ordered-binary": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", - "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "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-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pacote": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", - "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" - } - }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.0.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/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/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/tabbable": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", - "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", - "license": "MIT" - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/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/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/minizlib/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/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/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/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/trusted-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trusted-types/-/trusted-types-2.0.0.tgz", - "integrity": "sha512-Eam+AUp6lg04YjmYkuLNhEJX+6ByocrKTpY/TtfRK/gV6OmxeN0OwkIasor28SUJ606snArpPLGtPMGbqdaaUA==", - "license": "W3C-20150513" - }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tuf-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", - "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/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-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "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/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi/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/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/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/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/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==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/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==", - "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/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zone.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", - "license": "MIT" - } - } -} diff --git a/webview/package.json b/webview/package.json deleted file mode 100644 index f8030be..0000000 --- a/webview/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "scorpio-webview", - "version": "0.0.1", - "private": true, - "scripts": { - "ng": "ng", - "build": "ng build --output-hashing=none", - "watch": "ng build --watch --configuration development", - "test": "ng test" - }, - "dependencies": { - "@angular/animations": "^19.0.5", - "@angular/common": "^19.0.5", - "@angular/compiler": "^19.0.5", - "@angular/core": "^19.0.5", - "@angular/forms": "^19.0.5", - "@angular/platform-browser": "^19.0.5", - "@angular/platform-browser-dynamic": "^19.0.5", - "@angular/router": "^19.0.5", - "@floating-ui/core": "^1.6.9", - "@fortawesome/angular-fontawesome": "^1.0.0", - "@fortawesome/fontawesome-free": "^6.7.2", - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-regular-svg-icons": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@ng-bootstrap/ng-bootstrap": "^18.0.0", - "@popperjs/core": "^2.11.8", - "@vscode/markdown-it-katex": "^1.1.2", - "@vscode/webview-ui-toolkit": "^1.4.0", - "bootstrap": "^5.3.8", - "dompurify": "^3.2.4", - "highlight.js": "^11.11.1", - "markdown-it": "^14.1.1", - "markdown-it-class": "^1.0.0", - "markdown-it-highlightjs": "^4.2.0", - "rxjs": "~7.8.2", - "trusted-types": "^2.0.0", - "tslib": "^2.8.0", - "zone.js": "~0.15.0" - }, - "devDependencies": { - "@angular-eslint/builder": "18.3.1", - "@angular-eslint/eslint-plugin": "18.3.1", - "@angular-eslint/eslint-plugin-template": "18.3.1", - "@angular-eslint/schematics": "18.3.1", - "@angular-eslint/template-parser": "18.3.1", - "@angular/build": "^19.0.6", - "@angular/cli": "^19.0.6", - "@angular/compiler-cli": "^19.0.5", - "@angular/language-service": "^19.0.5", - "@angular/localize": "^19.0.5", - "@types/bootstrap": "^5.2.10", - "@types/katex": "^0.16.8", - "@types/markdown-it": "^14.1.2", - "@types/vscode-webview": "^1.57.0", - "typescript": "^5.5.4" - } -} diff --git a/webview/src/app/app.component.html b/webview/src/app/app.component.html deleted file mode 100644 index cf3dfe5..0000000 --- a/webview/src/app/app.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
- - @switch (viewState()) { - @case (ViewState.LOGIN) { - - } - @case (ViewState.COURSE_SELECTION) { - - } - @case (ViewState.EXERCISE_SELECTION) { - - } - @case (ViewState.PROBLEM_STATEMENT) { - - } - } -
diff --git a/webview/src/app/app.component.ts b/webview/src/app/app.component.ts deleted file mode 100644 index 13ec3c1..0000000 --- a/webview/src/app/app.component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, OnInit, signal, WritableSignal } from "@angular/core"; -import { provideVSCodeDesignSystem, vsCodeButton } from "@vscode/webview-ui-toolkit"; -import { StateService, ViewState } from "./state.service"; -import { BrowserModule } from "@angular/platform-browser"; -import { LoginView } from "./login/login.view"; -import { CourseSelectionView } from "./course/course-selection.view"; -import { ExerciseSelectionView } from "./exercise/exercise-selection.view"; -import { ExerciseDetailView } from "./exercise-detail/exercise-detail.view"; -import { Course } from "@shared/models/course.model"; -import { Exercise } from "@shared/models/exercise.model"; -import { PetComponent } from "./easteregg/pet.component"; - -provideVSCodeDesignSystem().register(vsCodeButton()); - -@Component({ - selector: "app-root", - templateUrl: "./app.component.html", - standalone: true, - imports: [ - BrowserModule, - LoginView, - CourseSelectionView, - ExerciseSelectionView, - ExerciseDetailView, - PetComponent, - ], -}) -export class AppComponent implements OnInit { - protected ViewState = ViewState; - protected signal = signal; - - viewState: WritableSignal = signal(ViewState.LOGIN); - course: WritableSignal = signal(undefined); - exercise: WritableSignal = signal(undefined); - repoKey: WritableSignal = signal(undefined); - showPet: WritableSignal = signal(false); - - constructor(private stateService: StateService) {} - - ngOnInit() { - this.stateService.viewState$.subscribe( - ({ viewState: viewState, course: course, exercise: exercise, repoKey: repoKey }) => { - this.viewState.set(viewState); - this.course.set(course); - this.exercise.set(exercise); - this.repoKey.set(repoKey); - }, - ); - - this.stateService.petVisibleObservable.subscribe((visible) => { - this.showPet.set(visible); - }); - } -} diff --git a/webview/src/app/course/course-selection.view.css b/webview/src/app/course/course-selection.view.css deleted file mode 100644 index 5fea465..0000000 --- a/webview/src/app/course/course-selection.view.css +++ /dev/null @@ -1,3 +0,0 @@ -.fill-grid { - grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); -} diff --git a/webview/src/app/course/course-selection.view.html b/webview/src/app/course/course-selection.view.html deleted file mode 100644 index 0d8abba..0000000 --- a/webview/src/app/course/course-selection.view.html +++ /dev/null @@ -1,34 +0,0 @@ -

Courses

-@if (coursesWithNextDue().length === 0) { -

You are not enrolled into any courses that have a released programming exercise

-} -
- @for (courseWithNextDue of coursesWithNextDue(); track courseWithNextDue) { - - } -
diff --git a/webview/src/app/course/course-selection.view.ts b/webview/src/app/course/course-selection.view.ts deleted file mode 100644 index 741e939..0000000 --- a/webview/src/app/course/course-selection.view.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { - AfterViewInit, - ChangeDetectionStrategy, - Component, - CUSTOM_ELEMENTS_SCHEMA, - OnInit, - signal, - WritableSignal, -} from "@angular/core"; -import { vscode } from "../vscode"; -import { CommonModule } from "@angular/common"; -import { Course } from "@shared/models/course.model"; -import { Exercise } from "@shared/models/exercise.model"; -import { CommandFromExtension, CommandFromWebview } from "@shared/webview-commands"; -import * as bootstrap from "bootstrap"; - -@Component({ - selector: "course-selection", - templateUrl: "./course-selection.view.html", - styleUrls: ["./course-selection.view.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA], -}) -export class CourseSelectionView implements OnInit, AfterViewInit { - coursesWithNextDue: WritableSignal<{ course: Course; nextDueExercise: Exercise | undefined }[]> = - signal([]); - - constructor() {} - - ngOnInit() { - // query courses from API - window.addEventListener("message", (event) => { - const message = event.data; // The JSON data - if (message.command === CommandFromExtension.SEND_COURSE_OPTIONS) { - const courses = JSON.parse(message.text); - const coursesWithNextDue = courses - // filter out courses without exercises, as they are not interesting for programming - .filter((course: Course) => { - return course.exercises; - }) - // for some reason, the dueDate is not correctly deserialized - .map((course: Course) => { - course.exercises = course.exercises!.map((exercise: Exercise) => { - exercise.dueDate = exercise.dueDate ? new Date(exercise.dueDate) : undefined; - return exercise; - }); - return course; - }) - .map((course: Course) => { - return { course: course, nextDueExercise: this.getNextDueExercise(course) }; - }); - this.coursesWithNextDue.set(coursesWithNextDue); - } - }); - vscode.postMessage({ command: CommandFromWebview.GET_COURSE_OPTIONS, text: undefined }); - } - - ngAfterViewInit(): void { - // Initialize all tooltips - var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); - tooltipTriggerList.map(function (tooltipTriggerEl) { - return new bootstrap.Tooltip(tooltipTriggerEl); - }); - } - - clickCourse(course: any) { - vscode.postMessage({ - command: CommandFromWebview.SET_COURSE_AND_EXERCISE, - text: JSON.stringify({ course: course, exercise: undefined }), - }); - - // view change is triggered by editor - } - - getNextDueExercise(course: Course): Exercise | undefined { - if (!course.exercises || course.exercises.length === 0) { - return undefined; - } - - const now = new Date(); - return course.exercises - .filter((exercise) => (exercise.dueDate ? exercise.dueDate > now : false)) - .sort((a, b) => new Date(a.dueDate!).getTime() - new Date(b.dueDate!).getTime())[0]; - } -} diff --git a/webview/src/app/easteregg/pet.component.css b/webview/src/app/easteregg/pet.component.css deleted file mode 100644 index 33e2dbc..0000000 --- a/webview/src/app/easteregg/pet.component.css +++ /dev/null @@ -1,8 +0,0 @@ -.pet { - position: fixed; - bottom: 0; - left: 0; - width: 2rem; - height: auto; - z-index: 9999; -} diff --git a/webview/src/app/easteregg/pet.component.html b/webview/src/app/easteregg/pet.component.html deleted file mode 100644 index d0d89ea..0000000 --- a/webview/src/app/easteregg/pet.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/webview/src/app/easteregg/pet.component.ts b/webview/src/app/easteregg/pet.component.ts deleted file mode 100644 index c80e30a..0000000 --- a/webview/src/app/easteregg/pet.component.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { - AfterContentInit, - AfterViewInit, - Component, - ElementRef, - HostListener, - Renderer2, - ViewChild, - effect, - input, -} from "@angular/core"; - -@Component({ - selector: "app-pet", - imports: [], - templateUrl: "./pet.component.html", - styleUrl: "./pet.component.css", -}) -export class PetComponent implements AfterViewInit { - @ViewChild("pet") petRef!: ElementRef; - petImageUrl = (window as any).petImageUrl; - - visible = input.required(); - private animationFrameId: number = 0; - - private readonly minSpeed = 0.04; - private readonly maxSpeed = 0.2; - private speed = this.randomSpeed(); - - private readonly minDirectionChangePause = 1500; - private readonly maxDirectionChangePause = 3000; - private directionChangePause = this.randomDirectionPause(); - - private clockwise = 1; - private edge: "bottom" | "right" | "top" | "left" = "bottom"; - private pos = { x: 0, y: 0 }; - - private boundaries = { - left: 0, - right: 0, - top: 0, - bottom: 0, - }; - - @HostListener("window:resize") - onResize() { - if (!this.visible()) { - return; - } - - this.updateBoundaries(); - } - - constructor(private renderer: Renderer2) { - effect(() => { - if (this.visible()) { - this.showPet(); - } else if (!this.visible()) { - this.hidePet(); - } - }); - } - - ngAfterViewInit(): void { - // make sure that boundaries are correct after image was loaded - const pet = this.petRef.nativeElement; - this.renderer.listen(pet, "load", () => { - this.updateBoundaries(); - }); - - if (pet.complete) { - this.updateBoundaries(); - } - } - - showPet() { - this.updateBoundaries(); - this.animationFrameId = requestAnimationFrame((timestamp) => this.animate(timestamp)); - } - - private lastTimeStamp?: number; - animate(timestamp: number) { - const delta = this.lastTimeStamp ? timestamp - this.lastTimeStamp : 0; - this.lastTimeStamp = timestamp; - this.move(delta); - this.changeDirection(delta); - this.animationFrameId = requestAnimationFrame((timestamp) => this.animate(timestamp)); - } - - hidePet() { - cancelAnimationFrame(this.animationFrameId); - this.lastTimeStamp = undefined; - } - - updateBoundaries() { - const pet = this.petRef.nativeElement; - this.boundaries.left = 0; - this.boundaries.right = window.innerWidth - pet.offsetWidth; - this.boundaries.top = window.innerHeight - pet.offsetHeight + 8; - this.boundaries.bottom = 0; - - if (this.edge === "bottom") { - this.setPosition(this.pos.x, this.boundaries.bottom); - } else if (this.edge === "right") { - this.setPosition(this.boundaries.right, this.pos.y); - } else if (this.edge === "top") { - this.setPosition(this.pos.x, this.boundaries.top); - } else if (this.edge === "left") { - this.setPosition(this.boundaries.left, this.pos.y); - } - } - - move(delta: number) { - if (this.speed === 0) return; - - const normalizedSpeed = this.speed * delta; - - const pet = this.petRef.nativeElement; - - switch (this.edge) { - case "bottom": - this.pos.x += normalizedSpeed * this.clockwise; - this.pos.y = this.boundaries.bottom; - if (this.pos.x > this.boundaries.right) { - this.edge = "right"; - this.pos.x = this.boundaries.right; - pet.style.transform = `rotate(-90deg) scaleX(${this.clockwise})`; - } else if (this.pos.x < this.boundaries.left) { - this.edge = "left"; - this.pos.x = this.boundaries.left; - pet.style.transform = `rotate(90deg) scaleX(${this.clockwise})`; - } - break; - case "right": - this.pos.y += normalizedSpeed * this.clockwise; - this.pos.x = this.boundaries.right; - if (this.pos.y > this.boundaries.top) { - this.edge = "top"; - this.pos.y = this.boundaries.top; - pet.style.transform = `rotate(180deg) scaleX(${this.clockwise})`; - } else if (this.pos.y < this.boundaries.bottom) { - this.edge = "bottom"; - this.pos.y = this.boundaries.bottom; - pet.style.transform = `rotate(0deg) scaleX(${this.clockwise})`; - } - break; - case "top": - this.pos.x -= normalizedSpeed * this.clockwise; - this.pos.y = this.boundaries.top; - if (this.pos.x < this.boundaries.left) { - this.edge = "left"; - this.pos.x = this.boundaries.left; - pet.style.transform = `rotate(90deg) scaleX(${this.clockwise})`; - } else if (this.pos.x > this.boundaries.right) { - this.edge = "right"; - this.pos.x = this.boundaries.right; - pet.style.transform = `rotate(-90deg) scaleX(${this.clockwise})`; - } - break; - case "left": - this.pos.y -= normalizedSpeed * this.clockwise; - this.pos.x = this.boundaries.left; - if (this.pos.y < this.boundaries.bottom) { - this.edge = "bottom"; - this.pos.y = this.boundaries.bottom; - pet.style.transform = `rotate(0deg) scaleX(${this.clockwise})`; - } else if (this.pos.y > this.boundaries.top) { - this.edge = "top"; - this.pos.y = this.boundaries.top; - pet.style.transform = `rotate(180deg) scaleX(${this.clockwise})`; - } - break; - } - - this.setPosition(this.pos.x, this.pos.y); - } - - passedTimeSinceLastDirectionChange = 0; - changeDirection(delta: number) { - this.passedTimeSinceLastDirectionChange += delta; - if (this.passedTimeSinceLastDirectionChange < this.directionChangePause) { - return; - } - this.passedTimeSinceLastDirectionChange = 0; - this.directionChangePause = this.randomDirectionPause(); - - const pet = this.petRef.nativeElement; - // 50% chance to pause - if (Math.random() < 0.5) { - // 50% chance to change direction - const turn = Math.random() < 0.5 ? -1 : 1; - this.clockwise *= turn; - this.speed = this.randomSpeed(); - pet.style.transform = `${pet.style.transform} scaleX(${turn})`; - } else { - this.speed = 0; - } - } - - setPosition(x: number, y: number) { - const pet = this.petRef.nativeElement; - pet.style.left = `${x}px`; - pet.style.bottom = `${y}px`; - } - - randomSpeed(): number { - const tmp = Math.random() * (this.maxSpeed - this.minSpeed) + this.minSpeed; - return tmp; - } - - randomDirectionPause(): number { - return ( - Math.random() * (this.maxDirectionChangePause - this.minDirectionChangePause) + - this.minDirectionChangePause - ); - } -} diff --git a/webview/src/app/exercise-detail/clone-button/ clone-button.component.css b/webview/src/app/exercise-detail/clone-button/ clone-button.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/webview/src/app/exercise-detail/clone-button/clone-button.component.html b/webview/src/app/exercise-detail/clone-button/clone-button.component.html deleted file mode 100644 index 4ca4d37..0000000 --- a/webview/src/app/exercise-detail/clone-button/clone-button.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/webview/src/app/exercise-detail/clone-button/clone-button.component.ts b/webview/src/app/exercise-detail/clone-button/clone-button.component.ts deleted file mode 100644 index 6bc068b..0000000 --- a/webview/src/app/exercise-detail/clone-button/clone-button.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { ChangeDetectionStrategy, Component, input } from "@angular/core"; -import { Exercise } from "@shared/models/exercise.model"; -import { CommandFromWebview } from "@shared/webview-commands"; -import { vscode } from "src/app/vscode"; - -@Component({ - selector: "clone-button", - templateUrl: "./clone-button.component.html", - styleUrls: ["./clone-button.component.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule], -}) -export class CloneButton { - constructor() {} - - protected onClick() { - vscode.postMessage({ - command: CommandFromWebview.CLONE_REPOSITORY, - }); - } -} diff --git a/webview/src/app/exercise-detail/exercise-detail.view.css b/webview/src/app/exercise-detail/exercise-detail.view.css deleted file mode 100644 index e69de29..0000000 diff --git a/webview/src/app/exercise-detail/exercise-detail.view.html b/webview/src/app/exercise-detail/exercise-detail.view.html deleted file mode 100644 index d14d2e8..0000000 --- a/webview/src/app/exercise-detail/exercise-detail.view.html +++ /dev/null @@ -1,8 +0,0 @@ -

{{ exercise().title }}

-@if( !exercise().dueDate || exercise().dueDate! > now()){ @if(repoKeyEqualsDisplayed()){ - -}@else{ - -} } - - diff --git a/webview/src/app/exercise-detail/exercise-detail.view.ts b/webview/src/app/exercise-detail/exercise-detail.view.ts deleted file mode 100644 index c25c30e..0000000 --- a/webview/src/app/exercise-detail/exercise-detail.view.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - effect, - input, - OnInit, - Signal, -} from "@angular/core"; -import { CommonModule } from "@angular/common"; -import { ProblemStatementComponent } from "./problem-statement/problem-statement.component"; -import { CommandFromWebview } from "@shared/webview-commands"; -import { Result } from "@shared/models/result.model"; -import { vscode } from "src/app/vscode"; -import { ProgrammingExercise } from "@shared/models/exercise.model"; -import { Course } from "@shared/models/course.model"; -import { CloneButton } from "./clone-button/clone-button.component"; -import { ExerciseOverview } from "./header-table/overview.component"; -import { getLatestResult } from "@shared/models/participation.model"; -import { SubmitButton } from "./submit-button/submit-button.component"; - -@Component({ - selector: "exercise-detail", - templateUrl: "./exercise-detail.view.html", - styleUrls: ["./exercise-detail.view.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule, CloneButton, SubmitButton, ExerciseOverview, ProblemStatementComponent], -}) -export class ExerciseDetailView implements OnInit { - course = input.required(); - - exercise = input.required(); - - repoKey = input.required(); - protected repoKeyEqualsDisplayed = computed(() => this.repoKey() === this.exercise().projectKey); - - now = computed(() => new Date()); - - constructor() {} - - ngOnInit() { - // query exercise details for problem statement - // this will set the displayed exercise so retrieval is not needed - vscode.postMessage({ - command: CommandFromWebview.GET_EXERCISE_DETAILS, - text: JSON.stringify({ - exerciseId: this.exercise().id, - }), - }); - } -} diff --git a/webview/src/app/exercise-detail/header-table/overview.component.css b/webview/src/app/exercise-detail/header-table/overview.component.css deleted file mode 100644 index be5a25f..0000000 --- a/webview/src/app/exercise-detail/header-table/overview.component.css +++ /dev/null @@ -1,14 +0,0 @@ -table { - margin-top: 10px; - margin-bottom: 10px; - border-spacing: 10px 5px; - width: 100%; -} - -th { - text-align: left; -} - -td { - text-align: right; -} diff --git a/webview/src/app/exercise-detail/header-table/overview.component.html b/webview/src/app/exercise-detail/header-table/overview.component.html deleted file mode 100644 index 08c8418..0000000 --- a/webview/src/app/exercise-detail/header-table/overview.component.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - @if (exercise().difficulty) { - - - - - } -
Points - -
Submission due - @if (exercise().dueDate) { - {{ exercise().dueDate!.toLocaleString() }} - } @else { - No Due date - } -
Difficulty - {{ exercise().difficulty }} -
diff --git a/webview/src/app/exercise-detail/header-table/overview.component.ts b/webview/src/app/exercise-detail/header-table/overview.component.ts deleted file mode 100644 index 6e8792b..0000000 --- a/webview/src/app/exercise-detail/header-table/overview.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core"; -import { Exercise } from "@shared/models/exercise.model"; -import { ScoreButton } from "../overall-score/score-button.component"; -import { - getLatestResultBySubmission, - getLatestSubmission, -} from "@shared/models/participation.model"; - -@Component({ - selector: "overview", - templateUrl: "./overview.component.html", - styleUrls: ["./overview.component.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule, ScoreButton], -}) -export class ExerciseOverview { - exercise = input.required(); - - private latestSubmission = computed(() => - getLatestSubmission(this.exercise().studentParticipations?.at(0)), - ); - - protected latestResult = computed(() => getLatestResultBySubmission(this.latestSubmission())); - protected loading = computed(() => !!this.latestSubmission() && !this.latestResult()); - - constructor() {} -} diff --git a/webview/src/app/exercise-detail/overall-score/score-button.component.css b/webview/src/app/exercise-detail/overall-score/score-button.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/webview/src/app/exercise-detail/overall-score/score-button.component.html b/webview/src/app/exercise-detail/overall-score/score-button.component.html deleted file mode 100644 index 8fd53bf..0000000 --- a/webview/src/app/exercise-detail/overall-score/score-button.component.html +++ /dev/null @@ -1,21 +0,0 @@ -@if (loading()) { -
- Loading... -
- Loading... -} @else if (result()) { - - - - {{ absoluteScore() }} / {{ maxPoints() }} -} @else { - No Graded Result -} diff --git a/webview/src/app/exercise-detail/overall-score/score-button.component.ts b/webview/src/app/exercise-detail/overall-score/score-button.component.ts deleted file mode 100644 index 5c78bbb..0000000 --- a/webview/src/app/exercise-detail/overall-score/score-button.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core"; -import { Result } from "@shared/models/result.model"; -import { FeedbackListComponent } from "../test-result/feedback-list.component"; - -@Component({ - selector: "score-button", - templateUrl: "./score-button.component.html", - styleUrls: ["./score-button.component.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule, FeedbackListComponent], -}) -export class ScoreButton { - loading = input.required(); - result = input(); - - maxPoints = input.required(); - - protected absoluteScore = computed(() => { - return ((this.result()!.score! * this.maxPoints()) / 100).toFixed(1); - }); - - constructor() {} -} diff --git a/webview/src/app/exercise-detail/problem-statement/markdown-util/artemis-text-replacement.plugin.ts b/webview/src/app/exercise-detail/problem-statement/markdown-util/artemis-text-replacement.plugin.ts deleted file mode 100644 index ee4ab72..0000000 --- a/webview/src/app/exercise-detail/problem-statement/markdown-util/artemis-text-replacement.plugin.ts +++ /dev/null @@ -1,23 +0,0 @@ -import MarkdownIt, { PluginSimple } from "markdown-it"; - -/** - * Markdown-It plugin that allows replacing text in the raw markdown before tokenizing. - * See more about Markdown-It plugins here: https://github.com/markdown-it/markdown-it/tree/master/docs - */ -export abstract class ArtemisTextReplacementPlugin { - getExtension(): PluginSimple { - return (md: MarkdownIt): void => { - md.core.ruler.before("normalize", "artemis_text_replacement", (state: any) => { - // Perform the replacement on the raw markdown text - state.src = this.replaceText(state.src); - }); - }; - } - - /** - * Performs text replacement on the raw markdown before parsing. - * @param text The raw markdown text. - * @returns The modified markdown text after replacements. - */ - abstract replaceText(text: string): string; -} diff --git a/webview/src/app/exercise-detail/problem-statement/markdown-util/markdown.converter.ts b/webview/src/app/exercise-detail/problem-statement/markdown-util/markdown.converter.ts deleted file mode 100644 index 8deede7..0000000 --- a/webview/src/app/exercise-detail/problem-statement/markdown-util/markdown.converter.ts +++ /dev/null @@ -1,91 +0,0 @@ -import DOMPurify, { Config } from "dompurify"; -import type { PluginSimple } from "markdown-it"; -import markdownIt from "markdown-it"; -import markdownItClass from "markdown-it-class"; -import markdownItKatex from "@vscode/markdown-it-katex"; -import markdownItHighlightjs from "markdown-it-highlightjs"; -import { ArtemisTextReplacementPlugin } from "./artemis-text-replacement.plugin"; - -// An inline math formula has some other characters before or after the formula and uses $$ as delimiters -const inlineFormulaRegex = /(?:.+\$\$[^\$]+\$\$)|(?:\$\$[^\$]+\$\$.+)/g; - -class FormulaCompatibilityPlugin extends ArtemisTextReplacementPlugin { - replaceText(text: string): string { - return text - .split("\n") - .map((line) => { - if (line.match(inlineFormulaRegex)) { - line = line.replace(/\$\$/g, "$"); - } - if (line.includes("\\\\begin") || line.includes("\\\\end")) { - line = line.replaceAll("\\\\begin", "\\begin").replaceAll("\\\\end", "\\end"); - } - return line; - }) - .join("\n"); - } -} - -/** - * Add these classes to the converted html. - */ -const classMap: { [key: string]: string } = { - table: "table", -}; -const formulaCompatibilityPlugin = new FormulaCompatibilityPlugin(); - -/** - * Converts markdown into html (string) and sanitizes it. Does NOT declare it as safe to bypass further security - * Note: If possible, please use safeHtmlForMarkdown - * - * @param {string} markdownText the original Markdown text - * @param extensions to use for markdown parsing - * @param {string[]} allowedHtmlTags to allow during sanitization - * @param {string[]} allowedHtmlAttributes to allow during sanitization - * @returns {string} the resulting html as a SafeHtml object that can be inserted into the angular template - */ -export function htmlForMarkdown( - markdownText?: string, - extensions: PluginSimple[] = [], - allowedHtmlTags: string[] | undefined = undefined, - allowedHtmlAttributes: string[] | undefined = undefined, -): string { - if (!markdownText || markdownText === "") { - return ""; - } - - const md = markdownIt({ - html: true, - linkify: true, - breaks: false, // Avoid line breaks after tasks - }); - for (const extension of extensions) { - md.use(extension); - } - - // Add default extensions (Code Highlight, Latex) - md.use(markdownItHighlightjs) - .use(formulaCompatibilityPlugin.getExtension()) - .use(markdownItKatex, { - enableMathInlineInHtml: true, - }) - .use(markdownItClass, classMap); - let markdownRender = md.render(markdownText); - if (markdownRender.endsWith("\n")) { - // Keep legacy behavior from showdown where the output does not end with \n. - // This is needed because e.g. for quiz questions, we render the markdown in multiple small parts and then concatenate them. - markdownRender = markdownRender.slice(0, -1); - } - - // return markdownRender; - const purifyParameters = {} as Config; - // Prevents sanitizer from deleting id - purifyParameters["ADD_TAGS"] = ["testid"]; - if (allowedHtmlTags) { - purifyParameters["ALLOWED_TAGS"] = allowedHtmlTags; - } - if (allowedHtmlAttributes) { - purifyParameters["ALLOWED_ATTR"] = allowedHtmlAttributes; - } - return DOMPurify.sanitize(markdownRender, purifyParameters) as string; -} diff --git a/webview/src/app/exercise-detail/problem-statement/markdown-util/plant-uml.plugin.ts b/webview/src/app/exercise-detail/problem-statement/markdown-util/plant-uml.plugin.ts deleted file mode 100644 index 0e0f835..0000000 --- a/webview/src/app/exercise-detail/problem-statement/markdown-util/plant-uml.plugin.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { Injectable } from "@angular/core"; -import { Subject } from "rxjs"; -import DOMPurify from "dompurify"; -import { ArtemisTextReplacementPlugin } from "./artemis-text-replacement.plugin"; -import { escapeStringForUseInRegex } from "../regex.util"; -import { Result } from "@shared/models/result.model"; -import { CommandFromExtension, CommandFromWebview } from "@shared/webview-commands"; -import { vscode } from "src/app/vscode"; -import { - ProgrammingExerciseInstructionService, - TestCaseState, -} from "../programming-exercise.service"; - -type umlIndexed = { id: number; plantUml: string }; - -@Injectable({ providedIn: "root" }) -export class ProgrammingExercisePlantUmlExtensionWrapper extends ArtemisTextReplacementPlugin { - private latestResult?: Result; - private injectableElementsFoundSubject = new Subject<() => void>(); - - // unique index, even if multiple plant uml diagrams are shown from different problem statements on the same page (in different tabs) - private plantUmlIndex = 0; - - constructor( - private programmingExerciseInstructionService: ProgrammingExerciseInstructionService, - ) { - super(); - } - - /** - * Sets latest result according to parameter. - * @param result - either a result or undefined. - */ - public setLatestResult(result?: Result) { - this.latestResult = result; - } - - /** - * Subscribes to injectableElementsFoundSubject. - */ - subscribeForInjectableElementsFound() { - return this.injectableElementsFoundSubject.asObservable(); - } - - /** - * (green == implemented, red == not yet implemented, grey == unknown) - - * */ - private colorUML(uml: umlIndexed): umlIndexed { - // This regex is the same as in the server: ProgrammingExerciseTaskService.java - const testsColorRegex = /testsColor\((\s*[^()\s]+(\([^()]*\))?)\)/g; - - uml.plantUml = uml.plantUml.replace(testsColorRegex, (match: string, capture: string) => { - const tests = this.programmingExerciseInstructionService.convertTestListToIds( - capture, - undefined, - ); - const { testCaseState } = this.programmingExerciseInstructionService.testStatusForTask( - tests, - this.latestResult, - ); - switch (testCaseState) { - case TestCaseState.SUCCESS: - return "green"; - case TestCaseState.FAIL: - return "red"; - default: - return "grey"; - } - }); - return uml; - } - - /** - * For the stringified plantUml provided, render the plantUml on the server and inject it into the html. - * @param plantUml a stringified version of one plantUml. - * @param index the index of the plantUml in html - */ - private loadAndInjectPlantUml(uml: umlIndexed) { - // query courses from API - window.addEventListener("message", (event) => { - const message = event.data; // The JSON data - const pathParts = message.command.split("/"); - if ( - pathParts[0] === CommandFromExtension.SEND_UML && - pathParts[1] === this.latestResult?.id?.toString() && - pathParts[2] === uml.id.toString() - ) { - const plantUmlHtmlContainer = document.getElementById( - `plantUml-${this.latestResult?.id}-${uml.id}`, - ); - if (plantUmlHtmlContainer) { - // We need to sanitize the received svg as it could contain malicious code in a script tag. - plantUmlHtmlContainer.innerHTML = DOMPurify.sanitize(message.text); - - // make svg clickable - const svgElement = plantUmlHtmlContainer.querySelector("svg"); - if (svgElement) { - svgElement.style.cursor = "pointer"; - svgElement.addEventListener("click", () => { - vscode.postMessage({ - command: `${CommandFromWebview.OPEN_UML}/${this.latestResult?.id}/${uml.id}`, - }); - }); - } - } - } - }); - - vscode.postMessage({ - command: `${CommandFromWebview.GET_UML}/${this.latestResult?.id}/${uml.id}`, - text: uml.plantUml, - }); - } - - /** - * The extension provides a custom rendering mechanism for embedded plantUml diagrams. - * The mechanism works as follows: - * 1) Find (multiple) embedded plantUml diagrams based on a regex (startuml, enduml). - * 2) Replace the whole plantUml with a simple plantUml div container and a unique placeholder id - * 3) Add colors for test results in the plantUml (red, green, grey) - * 4) Send the plantUml content to the server for rendering a svg (the result will be cached for performance reasons) - * 5) Inject the computed svg for the plantUml (from the server) into the plantUml div container based on the unique placeholder id (see step 2) - */ - replaceText(text: string): string { - const idPlaceholder = "%idPlaceholder%"; - // E.g. [task][Implement BubbleSort](testBubbleSort) - const plantUmlRegex = /@startuml([^@]*)@enduml/g; - // E.g. Implement BubbleSort, testBubbleSort - const plantUmlContainer = `
`; - - // Replace test status markers. - const plantUmls = text.match(plantUmlRegex) ?? []; - // Assign unique ids to uml data structure at the beginning. - const plantUmlsIndexed = plantUmls.map((plantUml) => { - const nextIndex = this.plantUmlIndex; - // increase the global unique index so that the next plantUml gets a unique global id - this.plantUmlIndex++; - return { id: nextIndex, plantUml }; - }); - // custom markdown to html rendering: replace the plantUml in the markdown with a simple
container with a unique id placeholder - // with the global unique id so that we can find the plantUml later on, when it was rendered, and then inject the 'actual' inner html (actually a svg image) - const replacedText = plantUmlsIndexed.reduce((acc: string, umlIndexed: umlIndexed): string => { - return acc.replace( - new RegExp(escapeStringForUseInRegex(umlIndexed.plantUml), "g"), - plantUmlContainer.replace(idPlaceholder, umlIndexed.id.toString()), - ); - }, text); - - const coloredUmls = plantUmlsIndexed.map((plantUmlIndexed: umlIndexed) => - this.colorUML(plantUmlIndexed), - ); - - // send the adapted plantUml to the server for rendering and inject the result into the html DOM based on the unique plantUml id - this.injectableElementsFoundSubject.next(() => { - coloredUmls.forEach((plantUmlIndexed: umlIndexed) => { - this.loadAndInjectPlantUml(plantUmlIndexed); - }); - }); - - return replacedText; - } -} diff --git a/webview/src/app/exercise-detail/problem-statement/markdown-util/task.plugin.ts b/webview/src/app/exercise-detail/problem-statement/markdown-util/task.plugin.ts deleted file mode 100644 index ac1d5a0..0000000 --- a/webview/src/app/exercise-detail/problem-statement/markdown-util/task.plugin.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Injectable } from "@angular/core"; -import { ArtemisTextReplacementPlugin } from "./artemis-text-replacement.plugin"; - -/** - * Regular expression for finding tasks. - * A Task starts with the identifier `[task]` and the task name in square brackets. - * This gets followed by a list of test cases in parentheses. - * @example [task][Implement BubbleSort](testBubbleSort) - * - * The regular expression is used to find all tasks inside a problem statement and therefore uses the global flag. - * - * This is coupled to the value used in `ProgrammingExerciseTaskService` in the server. - * If you change the regex, make sure to change it in all places! - */ -export const taskRegex = - /\[task]\[([^[\]]+)]\(((?:[^(),]+(?:\([^()]*\)[^(),]*)?(?:,[^(),]+(?:\([^()]*\)[^(),]*)?)*)?)\)/g; - -@Injectable({ providedIn: "root" }) -export class ProgrammingExerciseTaskExtensionWrapper extends ArtemisTextReplacementPlugin { - /** - * The task regex is coupled to the value used in ProgrammingExerciseTaskService in the server - * and `TaskCommand` in the client - * If you change the regex, make sure to change it in all places! - */ - replaceText(text: string): string { - return text.replace(taskRegex, (match) => { - return this.escapeTaskSpecialCharactersForMarkdown(match); - }); - } - - private escapeTaskSpecialCharactersForMarkdown = (text: string) => { - // We want to avoid special characters (such as underscores) in the task or test case names to be interpreted as markdown, as this may interfere with the preview. - return text.replace(/[`.*_+\-!${}()|[\]\\]/g, "\\$&"); - }; -} diff --git a/webview/src/app/exercise-detail/problem-statement/problem-statement.component.css b/webview/src/app/exercise-detail/problem-statement/problem-statement.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/webview/src/app/exercise-detail/problem-statement/problem-statement.component.html b/webview/src/app/exercise-detail/problem-statement/problem-statement.component.html deleted file mode 100644 index 6407940..0000000 --- a/webview/src/app/exercise-detail/problem-statement/problem-statement.component.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/webview/src/app/exercise-detail/problem-statement/problem-statement.component.ts b/webview/src/app/exercise-detail/problem-statement/problem-statement.component.ts deleted file mode 100644 index 9be77af..0000000 --- a/webview/src/app/exercise-detail/problem-statement/problem-statement.component.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - input, - Signal, - ViewChild, - ElementRef, - inject, - Renderer2, - ViewContainerRef, - OnDestroy, - effect, -} from "@angular/core"; -import hljs from "highlight.js"; -import { htmlForMarkdown } from "./markdown-util/markdown.converter"; -import { CommonModule } from "@angular/common"; -import { Task, TaskArray } from "./task/task.model"; -import { TaskButton } from "./task/task-button.component"; -import { Feedback } from "@shared/models/feedback.model"; -import { Exercise } from "@shared/models/exercise.model"; -import { PluginSimple } from "markdown-it"; -import { escapeStringForUseInRegex } from "./regex.util"; -import { ProgrammingExercisePlantUmlExtensionWrapper } from "./markdown-util/plant-uml.plugin"; -import { merge, Subscription } from "rxjs"; -import { ProgrammingExerciseInstructionService } from "./programming-exercise.service"; -import { ProgrammingExerciseTaskExtensionWrapper, taskRegex } from "./markdown-util/task.plugin"; -import { - getLatestResult, - getLatestResultBySubmission, - getLatestSubmission, -} from "@shared/models/participation.model"; - -const taskDivElement = (exerciseId: number, taskId: number) => `pe-${exerciseId}-task-${taskId}`; - -@Component({ - selector: "problem-statement", - templateUrl: "./problem-statement.component.html", - styleUrls: ["./problem-statement.component.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule], -}) -export class ProblemStatementComponent implements OnDestroy { - // accept exercise as input - exercise = input.required(); - - latestSubmission = computed(() => - getLatestSubmission(this.exercise().studentParticipations?.at(0)), - ); - latestResult = computed(() => getLatestResultBySubmission(this.latestSubmission())); - loading = computed(() => !!this.latestSubmission() && !this.latestResult()); - - problemStatement: Signal = computed(() => - this.renderMarkdown(this.exercise().problemStatement), - ); - - public tasks: TaskArray = []; - private taskIndex = 0; - - @ViewChild("problemContainer", { static: false }) problemContainer!: ElementRef; - private renderer = inject(Renderer2); - private viewContainerRef = inject(ViewContainerRef); - - private markdownExtensions: PluginSimple[]; - private injectableContentFoundSubscription: Subscription; - private injectableContentForMarkdownCallbacks: Array<() => void> = []; - - constructor( - private programmingExerciseInstructionService: ProgrammingExerciseInstructionService, - private taskPlugin: ProgrammingExerciseTaskExtensionWrapper, - private plantUmlPlugin: ProgrammingExercisePlantUmlExtensionWrapper, - ) { - effect(() => { - this.plantUmlPlugin.setLatestResult(this.latestResult()); - }); - - this.markdownExtensions = [this.taskPlugin.getExtension(), this.plantUmlPlugin.getExtension()]; - - this.injectableContentFoundSubscription = merge( - plantUmlPlugin.subscribeForInjectableElementsFound(), - ).subscribe((injectableCallback) => { - this.injectableContentForMarkdownCallbacks = [ - ...this.injectableContentForMarkdownCallbacks, - injectableCallback, - ]; - }); - } - - ngOnDestroy(): void { - this.injectableContentFoundSubscription.unsubscribe(); - } - - renderMarkdown(problemStatement: string | undefined): string { - if (!problemStatement) { - return ""; - } - - let html = htmlForMarkdown(problemStatement, this.markdownExtensions); - html = this.prepareTasks(html); - setTimeout(() => { - this.injectableContentForMarkdownCallbacks.forEach((callback) => { - callback(); - }); - this.injectTasksIntoDocument(); - this.highlightCodeBlocks(); - }, 1); - - return html; - } - - prepareTasks(problemStatementHtml: string) { - const tasks = Array.from(problemStatementHtml.matchAll(taskRegex)); - if (!tasks) { - return problemStatementHtml; - } - - this.tasks = tasks - // check that all groups (full match, name, tests) are present - .filter((testMatch) => testMatch?.length === 3) - .map((testMatch: RegExpMatchArray | null) => { - const nextIndex = this.taskIndex; - this.taskIndex++; - return { - id: nextIndex, - completeString: testMatch![0], - taskName: testMatch![1], - testIds: testMatch![2] - ? this.programmingExerciseInstructionService.convertTestListToIds( - testMatch![2], - this.exercise().testCases, - ) - : [], - }; - }); - - return this.tasks.reduce( - (acc: string, { completeString: task, id }): string => - // Insert anchor divs into the text so that injectable elements can be inserted into them. - // Without class="d-flex" the injected components height would be 0. - // Added zero-width space as content so the div actually consumes a line to prevent a
    display bug in Safari - acc.replace( - new RegExp(escapeStringForUseInRegex(task), "g"), - `
    ​
    `, - ), - problemStatementHtml, - ); - } - - private injectTasksIntoDocument = () => { - this.renderer.setProperty( - this.problemContainer.nativeElement, - "innerHTML", - this.problemStatement(), - ); - - this.tasks.forEach((task) => { - const taskHtmlContainers = document.getElementsByClassName( - taskDivElement(this.exercise().id!, task.id), - ); - - for (let i = 0; i < taskHtmlContainers.length; i++) { - const taskHtmlContainer = taskHtmlContainers[i]; - this.createTaskComponent(taskHtmlContainer, task); - } - }); - }; - - private createTaskComponent(taskHtmlContainer: Element, task: Task) { - const componentRef = this.viewContainerRef.createComponent(TaskButton); - - componentRef.setInput("task", task); - const matchedFeedback = - this.latestResult()?.feedbacks?.filter((feedback: Feedback) => { - const feedbackTestCaseId = feedback.testCase?.id ?? feedback.testCaseId; - return feedbackTestCaseId !== undefined && task.testIds.includes(feedbackTestCaseId); - }) ?? []; - componentRef.setInput("feedbackList", matchedFeedback ?? []); - componentRef.setInput("loading", this.loading()); - - this.renderer.appendChild(taskHtmlContainer, componentRef.location.nativeElement); - } - - private highlightCodeBlocks() { - const codeBlocks = this.problemContainer.nativeElement.querySelectorAll("pre code"); - codeBlocks.forEach((block: HTMLElement) => { - hljs.highlightBlock(block); - }); - } -} diff --git a/webview/src/app/exercise-detail/problem-statement/programming-exercise.service.ts b/webview/src/app/exercise-detail/problem-statement/programming-exercise.service.ts deleted file mode 100644 index 95e049f..0000000 --- a/webview/src/app/exercise-detail/problem-statement/programming-exercise.service.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { Injectable } from "@angular/core"; -import { Result } from "@shared/models/result.model"; -import { TestCase } from "@shared/models/testcase.model"; - -/** - * Enumeration defining state of the test case. - */ -export enum TestCaseState { - NOT_EXECUTED = "NOT_EXECUTED", - SUCCESS = "SUCCESS", - FAIL = "FAIL", - NO_RESULT = "NO_RESULT", -} - -type SplitTests = { - successfulTests: number[]; - failedTests: number[]; - notExecutedTests: number[]; -}; - -export type TaskResult = { - testCaseState: TestCaseState; - detailed: SplitTests; -}; - -const testIdRegex = /(\d+)<\/testid>/; -const testSplitRegex = /,(?![^(]*?\))/; - -@Injectable({ providedIn: "root" }) -export class ProgrammingExerciseInstructionService { - /** - * @function testStatusForTask - * @desc Callback function for renderers to set the appropriate test status. - * @param testIds all test case ids that are included into the task. - * @param latestResult the result to check for if the tests were successful. - */ - public testStatusForTask = (testIds: number[], latestResult?: Result): TaskResult => { - if ( - latestResult?.successful && - (!latestResult.feedbacks || !latestResult.feedbacks.length) && - testIds - ) { - // Case 1: Submission fulfills all test cases and there are no feedbacks (legacy case), no further checking needed. - return { - testCaseState: TestCaseState.SUCCESS, - detailed: { successfulTests: testIds, failedTests: [], notExecutedTests: [] }, - }; - } - - if (latestResult?.feedbacks?.length) { - // Case 2: At least one test case is not successful, tests need to checked to find out if they were not fulfilled - const splitTests = this.separateTests(testIds, latestResult); - - let testCaseState; - if (splitTests.failedTests.length > 0) { - testCaseState = TestCaseState.FAIL; - } else if (splitTests.notExecutedTests.length > 0 || testIds.length === 0) { - testCaseState = TestCaseState.NOT_EXECUTED; - } else { - testCaseState = TestCaseState.SUCCESS; - } - return { - testCaseState, - detailed: splitTests, - }; - } else { - // Case 3: There are no results - return { - testCaseState: TestCaseState.NO_RESULT, - detailed: { successfulTests: [], failedTests: [], notExecutedTests: testIds }, - }; - } - }; - - private separateTests(tests: number[], latestResult: Result): SplitTests { - return tests.reduce( - (acc, testId) => { - const feedback = latestResult?.feedbacks?.find( - (feedback) => feedback.testCase?.id === testId || feedback.testCaseId === testId, - ); - - return { - successfulTests: - feedback?.positive === true ? [...acc.successfulTests, testId] : acc.successfulTests, - failedTests: - feedback?.positive === false ? [...acc.failedTests, testId] : acc.failedTests, - notExecutedTests: - feedback?.positive === undefined - ? [...acc.notExecutedTests, testId] - : acc.notExecutedTests, - }; - }, - { - successfulTests: [] as number[], - failedTests: [] as number[], - notExecutedTests: [] as number[], - }, - ); - } - - public convertTestListToIds(testList: string, testCases: TestCase[] | undefined): number[] { - // If there are test names, e.g., during the markdown preview, map the test to its corresponding id using the given testCases array. - // Otherwise, use the id directly provided within the section. - // split the tests by "," only when there is not a closing bracket without a previous opening bracket - return testList - .split(testSplitRegex) - .map((text) => text.trim()) - .map((text) => { - // -1 to indicate a not found test - return this.convertProblemStatementTextToTestId(text, testCases) ?? -1; - }); - } - - public convertProblemStatementTextToTestId( - test: string, - testCases?: TestCase[], - ): number | undefined { - // If the text contains and , directly use the number inside - const match = testIdRegex.exec(test); - if (match) { - // If there already is an id, return it directly - return parseInt(match[1]); - } - // otherwise find its corresponding id by the test case name - return testCases?.find((testCase) => testCase.testName === test)?.id; - } -} diff --git a/webview/src/app/exercise-detail/problem-statement/regex.util.ts b/webview/src/app/exercise-detail/problem-statement/regex.util.ts deleted file mode 100644 index 401338a..0000000 --- a/webview/src/app/exercise-detail/problem-statement/regex.util.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const escapeStringForUseInRegex = (text: string) => { - return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); -}; diff --git a/webview/src/app/exercise-detail/problem-statement/task/task-button.component.css b/webview/src/app/exercise-detail/problem-statement/task/task-button.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/webview/src/app/exercise-detail/problem-statement/task/task-button.component.html b/webview/src/app/exercise-detail/problem-statement/task/task-button.component.html deleted file mode 100644 index 641f5c1..0000000 --- a/webview/src/app/exercise-detail/problem-statement/task/task-button.component.html +++ /dev/null @@ -1,40 +0,0 @@ - - - -@if (loading()) { -
    - Loading... -
    -} @else { - @switch (status()) { - @case (TaskStatus.NO_RESULT) { - - } - @case (TaskStatus.SUCCESS) { - - } - @case (TaskStatus.FAIL) { - - } - } -} -  - -  -@if (!loading()) { - @switch (status()) { - @case (TaskStatus.NO_RESULT) { - No Test Results - } - @case (TaskStatus.SUCCESS) { - {{ positiveFeedback().length }} of {{ totalTests() }} passed - } - @case (TaskStatus.FAIL) { - {{ positiveFeedback().length }} of {{ totalTests() }} passed - - } - } -} diff --git a/webview/src/app/exercise-detail/problem-statement/task/task-button.component.ts b/webview/src/app/exercise-detail/problem-statement/task/task-button.component.ts deleted file mode 100644 index 351833e..0000000 --- a/webview/src/app/exercise-detail/problem-statement/task/task-button.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core"; -import { Task } from "./task.model"; -import { Feedback } from "@shared/models/feedback.model"; -import { FeedbackListComponent } from "../../test-result/feedback-list.component"; -import { FaIconComponent } from "@fortawesome/angular-fontawesome"; -import { - faCircleCheck, - faCircleQuestion, - faCircleXmark, -} from "@fortawesome/free-regular-svg-icons"; - -@Component({ - selector: "task-button", - templateUrl: "./task-button.component.html", - styleUrls: ["./task-button.component.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule, FeedbackListComponent, FaIconComponent], -}) -export class TaskButton { - task = input.required(); - feedbackList = input.required(); - loading = input.required(); - - protected totalTests = computed( - () => this.task().testIds.filter((testId) => testId !== -1).length, - ); - protected positiveFeedback = computed(() => - this.feedbackList().filter((feedback) => feedback.positive), - ); - protected TaskStatus = TaskStatus; - protected status = computed(() => { - if (this.feedbackList().length === 0) { - return TaskStatus.NO_RESULT; - } - return this.positiveFeedback().length === this.feedbackList().length - ? TaskStatus.SUCCESS - : TaskStatus.FAIL; - }); - - protected readonly faCircleQuestion = faCircleQuestion; - protected readonly faCircleCheck = faCircleCheck; - protected readonly faCircleXmark = faCircleXmark; - - constructor() {} -} - -enum TaskStatus { - NO_RESULT = "NO_RESULT", - SUCCESS = "SUCCESS", - FAIL = "FAIL", -} diff --git a/webview/src/app/exercise-detail/problem-statement/task/task.model.ts b/webview/src/app/exercise-detail/problem-statement/task/task.model.ts deleted file mode 100644 index 7c39301..0000000 --- a/webview/src/app/exercise-detail/problem-statement/task/task.model.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type Task = { id: number; completeString: string; taskName: string; testIds: number[] }; -export type TaskArray = Array; diff --git a/webview/src/app/exercise-detail/submit-button/submit-button.component.css b/webview/src/app/exercise-detail/submit-button/submit-button.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/webview/src/app/exercise-detail/submit-button/submit-button.component.html b/webview/src/app/exercise-detail/submit-button/submit-button.component.html deleted file mode 100644 index 533140a..0000000 --- a/webview/src/app/exercise-detail/submit-button/submit-button.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/webview/src/app/exercise-detail/submit-button/submit-button.component.ts b/webview/src/app/exercise-detail/submit-button/submit-button.component.ts deleted file mode 100644 index 2daa37e..0000000 --- a/webview/src/app/exercise-detail/submit-button/submit-button.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component } from "@angular/core"; -import { CommandFromWebview } from "@shared/webview-commands"; -import { vscode } from "src/app/vscode"; - -@Component({ - selector: "submit-button", - imports: [], - templateUrl: "./submit-button.component.html", - styleUrl: "./submit-button.component.css", -}) -export class SubmitButton { - constructor() {} - - protected onClick() { - vscode.postMessage({ - command: CommandFromWebview.SUBMIT, - }); - } -} diff --git a/webview/src/app/exercise-detail/test-result/feedback-list.component.css b/webview/src/app/exercise-detail/test-result/feedback-list.component.css deleted file mode 100644 index bb14d47..0000000 --- a/webview/src/app/exercise-detail/test-result/feedback-list.component.css +++ /dev/null @@ -1,11 +0,0 @@ -.container-success { - background-color: var(--vscode-inputValidation-infoBackground); - border-color: var(--vscode-inputValidation-infoBorder); - min-height: 3rem; -} - -.container-fail { - background-color: var(--vscode-inputValidation-errorBackground); - border-color: var(--vscode-inputValidation-errorBorder); - min-height: 3rem; -} diff --git a/webview/src/app/exercise-detail/test-result/feedback-list.component.html b/webview/src/app/exercise-detail/test-result/feedback-list.component.html deleted file mode 100644 index d4f4c2b..0000000 --- a/webview/src/app/exercise-detail/test-result/feedback-list.component.html +++ /dev/null @@ -1,36 +0,0 @@ -
    - -
    -@if (feedbackList().length === 0) { -
    - No test results available yet. Please make sure your code is submitted and the build is - succeeding. -
    -} @else { -
    - @for (failedFeedback of failedFeedbackList(); track failedFeedback) { -
    - Test Case - {{ failedFeedback.detailText }} -
    - } -
    -
    - @for (passedFeedback of passedFeedbackList(); track passedFeedback) { -
    - Test Case - {{ passedFeedback.credits | number: "1.1-1" }} -
    - } -
    -} diff --git a/webview/src/app/exercise-detail/test-result/feedback-list.component.ts b/webview/src/app/exercise-detail/test-result/feedback-list.component.ts deleted file mode 100644 index 3dcc6a4..0000000 --- a/webview/src/app/exercise-detail/test-result/feedback-list.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { ChangeDetectionStrategy, Component, computed, input, output } from "@angular/core"; -import { Feedback } from "@shared/models/feedback.model"; -import { faX } from "@fortawesome/free-solid-svg-icons"; -import { FaIconComponent } from "@fortawesome/angular-fontawesome"; - -@Component({ - selector: "feedback-list", - templateUrl: "./feedback-list.component.html", - styleUrls: ["./feedback-list.component.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule, FaIconComponent], -}) -export class FeedbackListComponent { - onClose = output(); - feedbackList = input.required(); - - protected failedFeedbackList = computed(() => - this.feedbackList().filter((feedback) => !feedback.positive), - ); - protected passedFeedbackList = computed(() => - this.feedbackList().filter((feedback) => feedback.positive), - ); - - protected readonly faX = faX; - - constructor() {} - - closeDialog() { - this.onClose.emit(); - } -} diff --git a/webview/src/app/exercise/exercise-selection.view.css b/webview/src/app/exercise/exercise-selection.view.css deleted file mode 100644 index 5fea465..0000000 --- a/webview/src/app/exercise/exercise-selection.view.css +++ /dev/null @@ -1,3 +0,0 @@ -.fill-grid { - grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); -} diff --git a/webview/src/app/exercise/exercise-selection.view.html b/webview/src/app/exercise/exercise-selection.view.html deleted file mode 100644 index 99b0abb..0000000 --- a/webview/src/app/exercise/exercise-selection.view.html +++ /dev/null @@ -1,55 +0,0 @@ -

    Exercises in {{ course.title }}

    -@if (exercisesDue().length > 0) { -
    Due Next
    -
    - -
    -} @if (exercisesPastDueDate().length > 0) { -
    Past Due Date
    -
    - -
    -} @if (exercisesNoDueDate().length > 0) { -
    No Due Date
    -
    - -
    -} - - - @for (exercise of exercises; track exercise) { - - } - diff --git a/webview/src/app/exercise/exercise-selection.view.ts b/webview/src/app/exercise/exercise-selection.view.ts deleted file mode 100644 index fe9183c..0000000 --- a/webview/src/app/exercise/exercise-selection.view.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { - AfterViewInit, - ChangeDetectionStrategy, - Component, - computed, - CUSTOM_ELEMENTS_SCHEMA, - Input, - OnInit, - signal, - WritableSignal, -} from "@angular/core"; -import { vscode } from "../vscode"; -import { StateService, ViewState } from "../state.service"; -import { CommonModule } from "@angular/common"; -import { Course } from "@shared/models/course.model"; -import { Exercise } from "@shared/models/exercise.model"; -import { CommandFromExtension, CommandFromWebview } from "@shared/webview-commands"; -import * as bootstrap from "bootstrap"; -import { getLatestResult } from "@shared/models/participation.model"; - -@Component({ - selector: "exercise-selection", - templateUrl: "./exercise-selection.view.html", - styleUrls: ["./exercise-selection.view.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA], -}) -export class ExerciseSelectionView implements OnInit, AfterViewInit { - @Input() - course!: Course; - - private exercises: WritableSignal = signal([]); - - exercisesDue = computed(() => - this.exercises() - .filter((exercise) => exercise.dueDate && exercise.dueDate >= new Date()) - .sort((a, b) => a.dueDate!.getTime() - b.dueDate!.getTime()), - ); - - exercisesPastDueDate = computed(() => - this.exercises().filter((exercise) => exercise.dueDate && exercise.dueDate < new Date()), - ); - - exercisesNoDueDate = computed(() => this.exercises().filter((exercise) => !exercise.dueDate)); - - constructor() {} - - ngOnInit() { - // query courses from API - window.addEventListener("message", (event) => { - const message = event.data; // The JSON data - if (message.command === CommandFromExtension.SEND_EXERCISE_OPTIONS) { - const exercises = JSON.parse(message.text); - // for some reason, the dueDate is not correctly deserialized - exercises.map((exercise: Exercise) => { - exercise.dueDate = exercise.dueDate ? new Date(exercise.dueDate) : undefined; - return exercise; - }); - this.exercises.set(exercises); - } - }); - vscode.postMessage({ command: CommandFromWebview.GET_EXERCISE_OPTIONS, text: undefined }); - } - - ngAfterViewInit(): void { - // Initialize all tooltips - var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); - tooltipTriggerList.map(function (tooltipTriggerEl) { - return new bootstrap.Tooltip(tooltipTriggerEl); - }); - } - - clickExercise(exercise: Exercise) { - vscode.postMessage({ - command: CommandFromWebview.SET_COURSE_AND_EXERCISE, - text: JSON.stringify({ course: this.course, exercise: exercise }), - }); - - // view change is triggered by editor - } - - getScore(exercise: Exercise): number | undefined { - return getLatestResult(exercise.studentParticipations?.at(0))?.score; - } -} diff --git a/webview/src/app/login/login.view.css b/webview/src/app/login/login.view.css deleted file mode 100644 index e69de29..0000000 diff --git a/webview/src/app/login/login.view.html b/webview/src/app/login/login.view.html deleted file mode 100644 index 2065865..0000000 --- a/webview/src/app/login/login.view.html +++ /dev/null @@ -1,7 +0,0 @@ -
    -

    - In order to use the Artemis Scorpio Plugin, you need to be authenticated with your Artemis - credentials -

    - -
    diff --git a/webview/src/app/login/login.view.ts b/webview/src/app/login/login.view.ts deleted file mode 100644 index 73041a8..0000000 --- a/webview/src/app/login/login.view.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; -import { vscode } from "../vscode"; -import { CommonModule } from "@angular/common"; -import { CommandFromWebview } from "@shared/webview-commands"; - -@Component({ - selector: "login", - templateUrl: "./login.view.html", - styleUrls: ["./login.view.css"], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [CommonModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA], -}) -export class LoginView { - requestLogin() { - vscode.postMessage({ command: CommandFromWebview.LOGIN, text: undefined }); - } -} diff --git a/webview/src/app/state.service.ts b/webview/src/app/state.service.ts deleted file mode 100644 index 29c2dc6..0000000 --- a/webview/src/app/state.service.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Injectable } from "@angular/core"; -import { Course } from "@shared/models/course.model"; -import { ProgrammingExercise } from "@shared/models/exercise.model"; -import { CommandFromExtension } from "@shared/webview-commands"; -import { BehaviorSubject } from "rxjs"; - -export enum ViewState { - LOGIN = "login", - COURSE_SELECTION = "course-selection", - EXERCISE_SELECTION = "exercise-selection", - PROBLEM_STATEMENT = "exercise-detail", -} - -export interface State { - viewState: ViewState; - course: Course | undefined; - exercise: ProgrammingExercise | undefined; - repoKey: string | undefined; -} - -@Injectable({ - providedIn: "root", -}) -export class StateService { - // Holds the current view state - private viewStateSubject = new BehaviorSubject({ - viewState: ViewState.LOGIN, - course: undefined, - exercise: undefined, - repoKey: undefined, - }); - public viewState$ = this.viewStateSubject.asObservable(); - // Holds the pet visibility state - public petVisibleSubject = new BehaviorSubject(false); - public petVisibleObservable = this.petVisibleSubject.asObservable(); - - constructor() { - window.addEventListener("message", (event) => { - const message = event.data; // The JSON data - switch (message.command) { - case CommandFromExtension.SEND_LOGIN_STATE: - const loggedIn = message.text; - this.changeState({ - viewState: loggedIn ? ViewState.COURSE_SELECTION : ViewState.LOGIN, - course: undefined, - exercise: undefined, - repoKey: undefined, - }); - break; - case CommandFromExtension.SEND_COURSE_EXERCISE_REPOKEY: - const { course: course, exercise: exercise, repoKey: repoKey } = JSON.parse(message.text); - if (!course) { - this.changeState({ - viewState: ViewState.COURSE_SELECTION, - course: undefined, - exercise: undefined, - repoKey: undefined, - }); - break; - } - - if (!exercise) { - this.changeState({ - viewState: ViewState.EXERCISE_SELECTION, - course: course, - exercise: undefined, - repoKey: undefined, - }); - break; - } - exercise.dueDate = exercise.dueDate ? new Date(exercise.dueDate) : exercise.dueDate; - this.changeState({ - viewState: ViewState.PROBLEM_STATEMENT, - course: course, - exercise: exercise, - repoKey: repoKey, - }); - break; - case CommandFromExtension.EASTER_EGG: - this.petVisibleSubject.next(message.text === "true"); - break; - } - }); - } - - // Method to change the view state based on the message - changeState(state: State) { - this.viewStateSubject.next(state); - } -} diff --git a/webview/src/app/vscode.ts b/webview/src/app/vscode.ts deleted file mode 100644 index e851942..0000000 --- a/webview/src/app/vscode.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { WebviewApi } from "vscode-webview"; - -export enum OutgoingCommands { - INFO = "info", - ERROR = "error", -} - -/** - * A utility wrapper around the acquireVsCodeApi() function, which enables - * message passing and state management between the webview and extension - * contexts. - * - * This utility also enables webview code to be run in a web browser-based - * dev server by using native web browser features that mock the functionality - * enabled by acquireVsCodeApi. - */ -class VSCodeAPIWrapper { - private readonly vsCodeApi: WebviewApi | undefined; - - constructor() { - // Check if the acquireVsCodeApi function exists in the current development - // context (i.e. VS Code development window or web browser) - if (typeof acquireVsCodeApi === "function") { - this.vsCodeApi = acquireVsCodeApi(); - } - } - - /** - * Post a message (i.e. send arbitrary data) to the owner of the webview. - * - * @remarks When running webview code inside a web browser, postMessage will instead - * log the given message to the console. - * - * @param message Abitrary data (must be JSON serializable) to send to the extension context. - */ - public postMessage(message: unknown) { - if (this.vsCodeApi) { - this.vsCodeApi.postMessage(message); - } else { - console.log(message); - } - } - - /** - * Get the persistent state stored for this webview. - * - * @remarks When running webview source code inside a web browser, getState will retrieve state - * from local storage (https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage). - * - * @return The current state or `undefined` if no state has been set. - */ - public getState(): unknown | undefined { - if (this.vsCodeApi) { - return this.vsCodeApi.getState(); - } else { - const state = localStorage.getItem("vscodeState"); - return state ? JSON.parse(state) : undefined; - } - } - - /** - * Set the persistent state stored for this webview. - * - * @remarks When running webview source code inside a web browser, setState will set the given - * state using local storage (https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage). - * - * @param newState New persisted state. This must be a JSON serializable object. Can be retrieved - * using {@link getState}. - * - * @return The new state. - */ - public setState(newState: T): T { - if (this.vsCodeApi) { - return this.vsCodeApi.setState(newState); - } else { - localStorage.setItem("vscodeState", JSON.stringify(newState)); - return newState; - } - } -} - -// Exports class singleton to prevent multiple invocations of acquireVsCodeApi. -export const vscode = new VSCodeAPIWrapper(); diff --git a/webview/src/assets/penguin-hat.gif b/webview/src/assets/penguin-hat.gif deleted file mode 100644 index a9aa6f04b55564c4c5aa5f0a2b5ae1653391d364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27294 zcmeI51yogO+xJyaKok&Ay1S*MK|k{WowY zVcDg4C8=?(c?dc_2U}W&twCXb^;-YdwXw0Wy}iA+w+H|JYj1sb9h- zanrBY`q;f+mkD&#U}->OwpS6{4Vvndoa&VLZFNXYb%-CVmK#%VMW;&yXOegz5uCGu z?6bbCvp%e|-oUy#>veV3lLg|zH2sWj%9(Q9j%f4|?uhl}VJocT>ystcpe0t9IaY?| zWm92XenxyY+HWjY8UkQ3(U8zmQ&3Y=eg8#CNl8LNf`^BP^BvcfKe({5vCp4Bf9ek| zvVBy!8!F18!U{Lon6Dz720li%g@}TDitH2_oJ7LF!oX6;+CZOF*Ov6Yg_((kfrON} z_5J&1R?K?$%}+5N{;I&gq*KW7Q=-U(k_9hbJwwK#*K96GeB+5h0g9C@Olt7OWxw~S zxiGmYkW|!%P^u`UC6rb*P;kNSp(fX$dsKhcA1!Hf#uo&*NR}@Y(aR*Dq%TyLkwMEj2ibq!#Pj|)yIuXm_ zs~IP!DjNxEsg%yO=6Kh|oAZ__4Cb4UHs-27Rv4*u+((R8-+VBh;=dynugN11PL31u zTvXeZo9)Y;ev77VKiL-c8tzLXUstoWGE%Q0*i|R61?6I`PUs@8lih-@C6~)%)jRF& z!jMLsPo1L;bw=zo`s{*0o$=ZA>R!|EJq#zxF}LS8jT4=44Ks8ka2{n0coMqPCh1c~ zG>>_Qrd9-d(^O?#@*{7J>~@=(%$Nw^U(ZPP#~quQ2ogPG8yqA?y_Fn%nJiO3MCMw{ zaHzbvRB))uw(*phs$t7S1f~sSD&(#chhZ?%MemMivoZ)c=0TYnI7&SYq8IxF3<1Yl zJDC^-+MV;ENpK8N3yOB7rl*N?U-ZIA@}UPACkKw;Wv2LDi`GkhdMA1&#oe+sIX%HJ z3ldqAk~N!^v#LZb22YP4n9a$m+g8ZQ=;6)IMH`z<&8uE*4a!$LGn7^E26HE+Fo(Q4 zsHlxiBfA(yI6I}JSIHiO@zbNZh4O;8pzJaX7gLM!@pIA^qSNs)i-mJVL(COR*9cfd z*Lv({D>j(JmdasygZcIQN!9sP2=_IvmY+6?DG(N2rC523$WxsByW6%I;a&76LL9syL zkn9_+pifpfOxNHaAECRIzqP(S{21BUD0gE-55bX>!;fombD~=_w|O#5{!V!xyJ(*6 zM96KqttknXx=L`IeID|RkC7nnWU74tZ)Z~e;*+`XdNix~B6hi*Y1i~T%f;d@v#P1u zH+j6v!Kgwt3v=TE{By17^$sgFy!#Hz^wKN>Yx(NVwTtgewfSIWcKdsa<5t>fTOX72 zYq#$f?bqxKg^up6jOw8mZKl1cPu*=!9))U_3GPl=NcLde-Jdt2I3SJ05u>%s^is~z#+xsjPaYv3ChtVB-AxE8dzlCFP(5yc=U%1PpjC{kh|%%CuR%2M6SO&8+}wPWWe&kJR~RraJNnwDfNNcq=t4oP!(hH-slcDtL>oTSV21HdT(T7U3 zTSwC;R3;l=3yJR22XhuiQJ7MP#>^~(KYLimvtE=Vo8$=O>4LBlh4)I&n;8X+M5R7S zGLwMTri2LSeMok=Ws-m>Wn}vSMZpC*j31GSR)i2r>`v{LxbtvEn3SH_n>j2gtYAir zHB0f?U5;cTs%8mMdZmC66|yABOwjGto`@`H%9)3mGDhcnG1{SNjJb4jkLl0HtwPfT z_cCRk(Z7$tEX`oZ%~X2c`aX>pmZ{*MrIHTn%TkABsdi-DDsSz}vx8;dy_l`q1o}`E z4a+f>%~t=|`k|}}mixdzTXP!pv1$;O_oO5H&PMCUx@}ngRaD?R{SSP<_xu_e{_n}r z-+)T=vT^E)cg1Sm2k6KQY+?Ba(CHiC1aQ;N&dy)qrak!X^6q-i_EO#!BxqyGZe#rZ z#<}lkRuu#7cVrO+$VBR>JqL{3glKtS*v%yjUPcb zP>j{0<;R3)#M@Kx&jV~`oL&SJ&uSMh^0pV`JK0TdTp{jQtl3z!=eS+W%(qxG3*T9( zMq=3o7Z2UzU#(}TubFzwx6cJ_k`}6+;Zok=U#~H(cU;SNLKj?Szc0TxGotP6vtzvzSK<=+c$dYkdV^`Zzxpf`E1MTT+ z~5=K|L;D+yqiPUBE+B;FfZHGeVv<7Vj?z;caW`vZ$h8BR1Eq2AB=H=M&M9 zE1Vy0G-)Y{suAinw&K2eOUCNgq)b8FkNcXU(Nu=t?K57By9D{{iZ{X>1=hZCQz%M^ zkJ~PJH(E=BSkL|7JFR+WP7kn%hrA2M=F5sdhN@ zu;pUQ8VH8o?vv@^NDh-FH(v`?j1$!nj|`Kqv( zf3b%VoqtIx-l5JYZq>|)cNC@j!TGRwM50*QE3Mt`7~fd4 zQhcWWJ`u^qSOR5LQPC_+kb(*#A;0}1%;QB0qfMan*)zRC>Kv(59T1Qay<*%pb_zdi zM&1$s{j&?<88;ec6s@9FQkiYiWm6%_iTHh)N}NB+J5Mj>+(nY^e~rIh;3b=*i__NM z$a{qm_B(pbaS*{A2&UYIk3;hYr}c~-~jT_bhq@k<)L=*sa8N9I%J$&{+Sntj1$0i zQXx7dos&|LJux5^4O?R$=|rEbeu14Y)N{1ye}L6`4=eA^$MNUH9t#T#prJqEp#KO63j8JnZL9vY=;Qs* zi9V2@f}nxFRrD!66n#GYu;|lGcPRR#{|p2z{t7|n$3!28^S={)J~jS;=(F?F5afIS zL0)SD%j3>M@F$bhG%`FR5qtr*;~N&tkEes2;RQ2hq41_@Ir)I?k6Fb|+jFW-7FFO9 zZF4?waW;SF(n|n+xT~_|?1n3L1b0{KaqiblHCN~Huf5^hubFn;u;+xeX*loA4tNT( zZ}fHT?oEv~RSRsrvUhfb4hD7!E-wn9*KhWAY1gl8tX08xCyWQ-j~=t%+q>^{hGTRK zG|gsC6y%7aGH?b@^}3Njki#X!0mN4yuOqagKgCPwKeuC)jcUo_hDD&W4cZh&+%|jK zq%oE)BPoCll5r<0xr_RYD<#c5=qWrz^vXs1nPQU0tDYjC$d{Nu zV3T+>aWX#$M48jWqCsxvv!e?fWzerjRJ$Rf%NpbfO(rHWX=Wr_bqv$gr$pLnk~!a| zZml#)Bitg%)#w|RT9QnyC`F~X>JuITon+A2qP#um6HyvA#q=T7ziggg`Fm`{w|@9LsD9)O!-Cf~a8 zK%U82=B)`&$V~GM_jcazEEa&}Ax>vj*>+fqOUB*;(NM!}<*uTHy_o075Ym3##Y7aA zc*?&=RI8`^DIoe>GUyT0P*T)Eu}*$g+$_O@uM`{rjiG92mQsvX3eCfgVX}cp>!}An zHw;a~E~Jxr*xDPv4Nbp(F-yS{^gan6mLVyd_2Z(?Z7)Q`{{x(Vk3Myz4Sj|j*lOR6 zO23(Je*{h6ZL0yqw6wFOd9x`T}GiGBUESWuOy`gM@_ip9MHNN(8^SS~zG9 zHvv~G08hhRrjm`b@F$Uo=3iY+_Lh=LkgKhN&Am?$mGG;r-k2Tqhl}sa5!-Jj zO|)evIK>-p!)Axj9nlkN91@{(_Vpwj^-gQMdx+Xrv1ey`o+6SPes-Co0$eRdvYF4i z7EgpXZB0^cShSj?KNUPrADk32o0%EqQI(km$JFx46!xh*&mdM5 z&#RwRE=b7`(}>70U+@;cH#@&RL~Xw4HSwH6Q7c<@PVq(Ip;W-tstzjE)YZr-8?xj} zEr08p9aJ$9GL%zUmBg1)HCJTX%?$lux>Q@;+?rE^J~ns1cH6LxMRXrduw0ISrFpdu z>3Phu2r9b+qz;_{d!_awx<+9G4g!DSOM^zK0!v|u#pKmi`al_$VxPB+R_!$9 zAj&qz>KfE`_BKuST=DUmqE7yeoaQcCBqpe!7>g-Kha`H~YL6_=4)mQODo1JeO)Ptx z59$mZrENDhE<8fknD_)M(0*169oh+VgtZ${Aa3+nc3rfA51$=ovL3NpGY=Z&Mi4Cj z?1)uYG-gi095n9Bms>s%AcSW7DMWtJYKlxVpt3LeethY4{B7NBNSY_}_L~�N&ZG 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 diff --git a/webview/src/assets/penguin-walking.gif b/webview/src/assets/penguin-walking.gif deleted file mode 100644 index 0b07108c74240524fdcf4aeec80e5d6e975d7e06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13282 zcmeI&c{J1u|G;rYC=!y$P8S)5C}d}37hOdmvXpI5+z?VxQ6t)wC55sKW2`fbu`k15 zY(>VtGlOAd2;(>EdAj>^@;r5a_ne#a`NNs>HU2W^<^B2S8|o<^aah>0u!TZLhk3L5 z&z$n6*@EhRD5@o;pgIwbj>|&EWg))S#AX(5YMy4~-%o}{JbQ5&67709(8Ae4-^v2? z<1uYBV@*@TuQD1Y2A@Y&UsqmTMPBX5x0r*f%Ku>`=kyKre)9GP`vRT3J?W%3e$U2V5*;&@PMw+G0REyPjCr?|Ee8IwDx6)+DBd6^ zsRqKM;NFADNv?|)2HoK|%uT6(C~1*lTc7(18zbk`5O0|Gx+zZCcdDm8FBO-l6}Cgb zC_k+=+2EnnnTGuI_Ehs^qXeUZj5p9zdG5Up1<=myvsHHlj0-d0<+-+JoWT}m;Sm>x z8xo8WuwGOEd8!wS$nGz@M$aN>f`kuNMeGLHH6n9{>+XpeKQ}4L9mPIX@aStS${WYM z06_#zi}NSj(=4ENO~nO-PPh~Hxhbk}8jtiP^fjRnv;E~^EJDXhkaNSBhXDKLk|OeW zOR{m|F?8{JLRX$ge={0InH{L2LWImpOP0wK?NEDMDSCxM8pbA?m6fioERhNQxU#bK zbvj1Lfolxht^?PZ#nT2tSrsP+!r1jB2XAm$x(?ptIiEIoi{EczFkJYSm3+7!3<{U%3a&fYpO_SE@_+t@SL*Xd)i;KIqVxC^xh#^Zl_>o%Sc zFqS_4Ja}<(Jn1|Rge>G(1_4&GI7P@VX9N)8)!ZJ$9E>=W znA@mGAm+8`0jBdiEIp zwfwVqJwC<+!fYLvCcivdEQScI!iJX27s~`)nAcJQ0LYDqj`+MLIYRs{+@Xi83r!Sx zs7&kBhY}fWLkW~`-7e7Dq2?hfE3t#y3VgWjG?M_aO)b$zK_`q=r=}a6n)N>083!(G zb%i!9c6&jl0n|WFa$bt#mVl&$PGTA z8nQakOIfcJzazMETs~1P8#l|cGTlCFjjpWQh4eXz=*VV`x zLqJ^Fi_mjsX16h@-X}VD`=AKZ=hFf8nS=u6u-f zO6Q)ur!_Ku2P1NKSfOATz4E~(FE`Yw4(2+LSANc2@8D$q?7|}W@?7+g4zDoNvVH*X z{JjX16w$r)7(JEw`}ZPK_DdMn8(Ggkc-ojEu2f%tEO7qe3)WYX`i2cZ#?C)VGkGOt zRo`G)JpULT`AXWw5Nq8%{{-3i3g};twfit1Q_lKYF5IxuaUc09#^kkpOnu{d74ox| z$k&Hb4V&Dp$+2CHuN4vXOipR^>c;xYy4rt@ ze`J*pOUO!#NQ!TkJ-7HxOljkw{PFFb?X;1XTv87-+l7kC!6(&BY*=jFgEN7 z>Ire0Q7TViX)Nk@RR!vdK8MZ}j~B1NwC0*=J|T8PKKdk^<`a(%pV(~pB=WOQ_~E=f zF47nC*=&L@*7A50!F7TJ$iY%pm$R_4rU$mU#S$*%^9=_8gn4Xvb&sdEG~Q&cN_ia2 z*r1NJ_08>ORL^e4bLK1L83Gc3?b4ce7jW8EMDy0#K4Q+>5y9R|8b8MI<>?Gs%YZvh zU-k9VaZ^&y?Bov1x+ffJ@{&UB3-Ij)^m1r6viAj%Wg_}ZwgO2--eNZ>!_i_?rMExi z;g_`Ufq<8XoQJ{wpje22H2yIQ)qKLqYBl#ANIzw9;!*aDAAudsCOv5%cdT^`HDrgF z**yn?&R(~-Lrs)&Cdv`Gw>3%yMx@`hZzzz40g(w(&z zZVGYyqhQlqW-s z;4-pKCTYfwWl&6XcTwHZzoAe3|2m)Sd!J@tn(<>y!wED4!#_$YHEoni9GPa0e^-^7 z#GKN2Skc!?D!+N3P34u34;RFw=RQcuydC@UG9=0)_==;iudOH8%JtlFM?2$R`{Pr2 z`6m7_HlWF4V~q6FjP#D^=_veFAx2yVAoPRSW(o4?`9FgQJJ)V{dipO{$d^3%T`J#8 z$|g%n(?&`8D3#_7sT^~fIh3Dbj4f*arBs00-La~(r7O8X*;>m<*x7PwARnomnGysn zWRf6WsOV56%9R;QijUPh$(F%$oV=>2gLRXE@z>Ej2*6C9*h8>ggC001zj3xJUf`ieW_d`EI}1dm^08(| zAUsTnVp7qOx;znwgDsBu*sm6jrpm5=s07WHF5uh18bYg-L|_*YgkP(T(Y!vL zeRXxkp0stTaLbgG?ZafDS=e6Lfs?opE{44*#Q-4V4!N+op%)AQ(Nd;L(=dU|eqE!d z(A`O-&??`vEYBn=_W|LK%8i3ekUesIcjUsUTGfMWXY@fF^8}wTG5*0W{X>rLTOw9; zk~kk@s(*mrvov$w%ZUgms@yr_h4FBlaL3fhhs;GfC&08`FVZJx2a6^R%6o0b&czgQ|#_O$;YKlSeKJ>|=P2)!@G9}E9;l9j=n49yHYl(l#lzK zpLz-1}+e_D}W{%Jr7t3$Zb-DIat2!V~p@vssVIkMT zTN?gG55Sk-Ja((`67o3HNMDD)aknb%R)Bv+Ou>wPA!WMPQ2>XI3dG;g{=9q1Q@6RLU&E%Bp z30{S5B^K)?@5@8h>L~-^>*{q}+E<~Jp;R-CxgMp`z~X)Yt*1;bK1b#3tkW!8eIKV0 zygUu26>MeHuULZ$yQ>YO=eufEKg>m6V@(leGQ{ZY`&;jO9KNYiEKvWja`IJHQ{2@jDz2Moq*#!?Rt$a7hcav<=B!i#J$#TreJgHn`)(fWe?%i%rVLU=ybCJBwiaq zFVaM8(ItcP+w{E&nax}-k=Y%FPEFEp_*jAuH=B!L^Bc$78qJZ~Osakj=lHHDcGvo> z!8=*Di$?4T829w2c9%CKz~5ZzPf+R$DwCFOI1`s}uQyVmnUWoW%Tm_4t3*X+dsvww zKu`GWz+-1t8jFUX3vF-&L0isL=~4Za9zMhtPnuF3TSw8M)Vb+b(7U_d!BOfQGbK~h zKq5Ow8T6A$isj8NDDh|~LKjw5aHyOvfbEspa`}Y%rI8p-jXJK=(a@zaL^PE&0162# z9+q%iUz^OJ2CqKF^&78I^6aUh6!jTTtT$1|PPfA!8gO{lc87`Jx(^f3?=*X8rExz4 z#HxbDS}t^#!;7qzTZIhg*+UrjJCrOS(71%=FhPcwAl*~YYZatW`9}gd-~bTME$MJ7 z80cBwCxyC2iVZVMAS-WY-Qa$d%s**RrwBB=d5v|182bZ8Cxc}FH@-pf z{-!4R)eXwNH+r-S!|&DP%X-Ntm}H=ENqH4tYaO&Hm3)FpOxh=y-1`WVU&oSPFMq!6 z@rkkik)z+_?BtVoelHZ+BZ@yrOKsLBpP&CjqmF#bX;^PEVDoMd& zi+cW7q1XldN+>^96Q-MBpS*+EMwTYVcdPOrs|kkw6=b$hVtAvPusAPh^$tms>Uf2& z_#%(<(fY|r(B1sbQ|oHr7L_=xFXQp`xjHT|B5Sd!@_|g=JJaN~f^JXL8WXjr!V8^K z&YCWR90+D1P^zxU9$Ff>xqfH9-vv;O?5fs?3K-dL8kO0z&wov3)CrJ~JI--<20FUE zopvRQPWpHy+YA_&x7oh}%TEQXPLz*@T<%TeBLq$LoMmgBE@oR-QQ{GyU7;{2T-~@r z!DZL9lV^|e2`VH#gOtC>XL#OcVPqv!MxTq6X8L;enFXiko^Dv zRQy7GG=P4+CpD5(k_7A?SMO^5hTE3hIR^1tQke>z6z zvzEOQ(X>#}aMF;K;WM(eW->6gH8f#zwYK}G13#Q%N#^-hr7+{wv~ zkD1xU#f8a*oype0jG2{}mzSA^jhT&&@wEq|qnnMBfh(hpBgGq$|IiULaWrzUuyeAo zwITh7u7RQLS0_Po@_z>U@AWoMCkxa68_CA;U$$NuWd5gxnU#r!`M|?K^9s2tbo1R_4LZlD#Nv&py8Y*G1ay+^!Wstqz{*`;@qHS9X|2fY_l0CvG582t>ztf9Hh1M#W zDQu^i4FA(ga(IJ26FDB9xoi%H;qihqN$+@vjFyC$utD*6GWzy3<&BLCym0LTHDDa2 zcu4#|?=eZYp%D20mEE>9Fq+dCArg1;Gqf>&EZdXx@2qT=4bAu8SV4wHXI8EKsrNPZ z`?>CcM*j+U$s8+O<@>gQnyFSX0}CYlHzTUggI9%J#ThEt=(U@Qg}afTOF-oQ7@{AU zLn*}#JN}PPAQ1PX+RO=ZWd=C7phAmrZ_c*PL$gL{mY6!0yr+uD2*CAiwrN^E20_2H2w#c{J6Y>C zz@sJMdeTM5+vGjMh$db7_F+B z+&w5HI@sNdWBApG7el5)!NXAtXC;4Cq8xyw&x1~dqP!5!5gUL7s|gw)kO@~k_*t9{ zsdCcF#GGDmiO>-+#rWJlpuE|93brnM%gp(=8FNUiGVYpo7L5|p?=WGkDV z{LGQ_P6)l@Q#?AO_rELhj|?p-hyf?X*di!=O@y5RN>o-cAcgln@f^d(q-HyEyX%W) z)_7kveEHo4epgu`(!Or@gOIWKn?k}D8j|w8~M)^6uA_emyfQxC6b3QXOb9z@7^VilW=d?GiT$MJpo;ZPavA%!M7vV4jdnT(PyX2x8(OurA4~ZaoZ#aG?>48RzB+}``my(Tg0@&Vz%ooqk)fT0J zL7T*9TOk4BoM^fFxEVvHI{%sL+lsb*6+uEfy4PPC@!Zf*Dxv{s^K=NEk2s?M^cyZ? zjl_6aeBZ=(tOuzPALDvX@!b}~v%te6w!n`Q-D`|Xh%7sN2Jc9zD+A&GGQy1k4ZsjF zOaJLnG2cA0aJgt4UbhbXXccP4^XAls}E< z@>sz+m?wOueqceVVrgu6X$T5y^r-19<6pbWLxo_TfNSQBjE{Wub?#XDUMkCfqHNY~ zowR8u)y%Z0sAvJ!o}PX-JhgCvBI5ff1cR?8;@E`W&Ib?eG0yVtQIkdPiX?0E!Gflm zPA|RA$U$joO-n~nZN(B}QKD&wr+p(TYw4@(hvTLbkPYW)VW<**uX31D&drBkP$ca~1NLvRhxT)FMxHhsC`_NuDJ z=7%V2JyO!svoZa7?{M8`G|Qo+FK6 zX+G_Vx8Vu)GdnBLke$p(4C8HvArO*=rhMt)VbTTy74tgdD}h9dI1x35sCu7A3l~r; z@=CC{i5I6VMh+sIpfpm{oYy*Xiu2Ya11J@d3d~VtnTquNnha5u~7ca{#+kt*DWvx|p3u#_vBjhV>^zzm!SWmX;3{M=g+jsGN*_btHz zHp&toFFG4KUbRZR$`pa3YhGDEJH>lOLzf+7RW6-_%m1PAn{l~w5?4ey~5C*K+8iLT+ThpQY{wc0>2nA13OhVm5e>JAV|g1kU- zeo0nQ86Sv#SI#d?C>VD#1sl{VG*a}34Ew?+zG%&yQj~X{B_1RlXjbVC+O#?RSXZ3m zk|Hx9$eo&6lEg3a{RXdO79snCq8igod?1MCuVG+-frjC8(WH&YC0!H)seParuZBY} zqErPvl&_3sn)zz@w4Y`KJUf}rDNJbQXyMpRTlJyGc&c11E{6>lamJ}vZ4XqQf+)+6e^O2>=Y(qSa0t>7$PzP zN=o!Jw4x24?$Yp1(1ISpwHAtp##;r7!z6`Bjabq^!EiX8zfTL_*|@@~Y&K>y=2}`z zT9GvRio+9*g)BmqjvmHtD3H}U#?Q%fvML39|mlE|zeiA z6lIvJP(dm2-_Sq2SuSR1p^Jo3o#&L*yA*Zj+S;`G+FI(AP;sv#$OcL^qz=g;U64}YNtlv4f&LIZ_ z78ayLV?)u@;*~|$>2YTg&qfsXMBS?_>ik|9Y#_T#KXeCCym`3@2$K7;K;oB{)rS`0 zx#F4B@knx*2M3nN-exSN(Lvqk^Jm+az|~US)o`iD?OJfLfk;)g&Twrud0T6%&B5<% zCuUz+G^lIb@VzYvG}bs1-K=Jy;T=@m@zUt;!P@7m8xu<teJ07_(gX6)?i%Gf_+w__f;YCb46HD(VEb9d*MP(t5R7^+wCc5$(Fn10Detz zL$y^1!ISTHJ;yhma3@uq@~eqNb1EXcM2^U0Kz8s?Z+mHiY0F=qmK}k9jnZp^_)C=T z7BD0Fzw+feUj+}NN-^@+EZc=(?K(G69knVJ!lhSdMEM5F+0ERS`A#j?s3De!S)k3} zOZ&aE7MvzRXpXIPH|gIl=3BP*O#}>Ie@KR6iL3th3q~J;e(*;}L)`ow`%UD!0zVK_F1z9fu1~*e8H$Y}Yim zy<|E${4f*9PK&aZzl7qHE{P!qg471S4=e7Q03?f0SY-gM)nV0yIKJksm?hiDQlHAv3zHo_(J2+vN(D@}wC%AyaG6VjokaK1aqc z0ZEq>d}hNpj|t_6e11YwvN-ff{-M0>1CIW-A{1Ii9{~;-g+uMtMg9JDMHo3((f5w| zjg_h_aJw%k$3T8jxWWWW|93fYlNnsmVJdq9kO7RCPH#yRhx`QZAroMPJlB_9^Er!` z88atdRyyEzIGqBOhkOsdU7-Y)0W&`5)0m`@XAsc|d|(9!u(A`l5WLM*lxE0eif#6< zEA)fNlLP{NMXXpP9c2Nb0av%|u!8+CVt_P*;CWVpFS}J_Yz504HK$8G<6GUK|Danw-sRd?MEwME0LJk}xBgl8}mqPZ0t16T>cRd8~b>X!WH@%s-qZAc~wqSK&+js?RHj#R;(J0Wxm0v8kvdF9Sc_5H)GRA*5C^zWfgnW`UaKc4F! z9$<8-=jVy^MyZ%7Sz5l6OyKla+%-jLsD+---E8O(^M|;y{ww0`Pe7ogsCoI!zEhk- z^jLM&CVKhrXa-6zix!Qhq%dK!&)^YC(uPIvYj3x8LGaKBxw6P)IF^QumGzfZda8&9 zmTOb7P4*?F`|3f-x>ddLCgjiXSJw}HWRIp8{ba3}AO5q9!m(UWf5WP`Zt%BmSnJ(( zi0YLo$6CY3I`6T>Tv-bWKON_xu3mcCx;Yr#tt+W(OWX-4EA!78RnMzj*Y^sOS=M}A zXM3QQgA+EVAL$@nyK+w{?jb)gc(1KFLEXiNzwMazpi^6o6b|26%@4P??_67jIDCJK z^D?|h(sJ^0*Pi9Y*goU1zcw&1U}tGbulx*yaI+|UhADiu!R&K4`2AZTJ8QBl58tQ! zzh;w#8)3=&;pnRE@kd+zgYT%%8s5EmK`ydSgsVaVGvbhYq)qBwv60*Jvkzsrq|fM^e+8SP^Tjj-zrZf{mnY4_9t3g4(Mgh=C$L*2V(H(&M`cGgAmX z$l1o!J2h>QtEu-Zx{*+B2Z6$m5rZ{S4P9rfV0LYNP$9t=xJyjFP0UMvj-YP4^|e8| zk8cR;PC;LgzO1xV)l;`wpWJTRW+(q2etO#$r=Xf69LE#kLO z3?)($(Rv@^+d2~UM43?`Q^g)l?K;qUDL-hNB$b3skdMV=*DmjwFy_>Zn@h4`X;A%P zxPsE(9KEqKc2$bhXj!%)fsYHry4}vox zSK_9ukx|t}`81VOG%wOVj;S?`Kj>UTRU_zp<^GIU;kLTN;*t;poem+ET~U&yzW`Be zQXB%9O7qN~fTGRr>|+7N&sOm)u0+(ypIvmrP8M(| z`jd|lwDReMtPFADqqkWaYt%tiAi4FF5vup|*fobwBlpp$}9G#s6_IBl8}VStPoayTM_crsrl zaYFE5+KB@RkDinkEYm2vE?}5x8vcXAo7E5YEkD`*0c(!-=bT*Ab4WF!btJt7UM{B| zXy6>}qI%r>vTMPQ%WEl$|E?Lb!8E$>HL5~q%Y4HQAAIkWN&h$f;7_A~YsF8qJA6b! z>g*Wjvnlk-i-rP%dDw0)RAo+14#gI~h}8#rJ4*W3hWb5PJ4#dUDkXZ6LsQ1PzJK6) zc^?*_{ZVVvX@t*O0_GS{p^5XM3+JyfmXia<-^~{grV2bc{vZ>vvdIoZee>m_%75mR z;>&6bm#5u0v@Sg{vTo^w@DHsj^Mda zY0^x@e*>;N#aAhKSBL!@T4X8w=~L=gB-fiNmzb6djY`3(p``fyk5@#N1r~H75+{MSNTt`&tq@f zeyec9$w6G4y5*Cz{Eo$Rl{Jw=Lv15laqJ)tvG;Ao&Vb^gGZs{3B+Dpqk){O;(Tk^7 zd>IabkNvgFCjf;rBr|D#xUu67seH1Db|Zp;T;d3Tm4@)m@ef5n7%pwiwj6);Il1w< zxp^r-*_dD*j#0{LjjpL%%r?}R1r4Vh*J?bCvG$|kR8Ecm;j4DmCQu-p!RUR)XdVE~WF(r$MpV;Q{ZI&^OP z^)(lSWWl0%;RKpNLGqP{_2&ht0;SR4TlZB4_xvkCPI99FwT-j0wU4<+nlFgZ8kDb=Ou%fN{QNm zq{zDvB1A>2h@e;3_Qy0!q^e>*k|#@&qTat|r#$f8 zAN^3DomeO85V{LVgS+Or2iuCyo?kE_3HDybGvRo1E; zsWa)a#dwTKLxwfXeHZM5*-B*E^A9!TNsHF^k!+_Yk=pdebu`?mVxXA*M-OGifvh%* zxvg3yNt@rRp}|+On{;L;x8L8dm9D{@uew7W~r!-Q^AC+F+s01sO;uPADt@tdSFR zoiO4kklv}Lj?tSaBiA>a37-bNKW_wbwJZ)Y!n9Ht9nwC zLw-hr+_I)BF@Wrb4HhKP?D9@&(b!!+F(AB)nihZbZGtFR;aD9DrjQH|zzn)Z$`m_m z3*F)hKc>K?fY&VkpN|{53pbh#3w`*UB~e_o)@Fu3{(Mye&*5GCmhZMDA=Ik!8t}>d zZC+eKX(v1pZU~+;pdosLF72VTq}xBW{I}a3j*!qo(8aGMq60DmrnBpR2N35wt5j;$ zWJZWvFiKTqQ4+j>997T~JblzgG21zc%=3C2jlcF3RDAo-js{^2#Ka-4`K(w8BKsO7 zT9laIN()nVeqwv5L^N;w$0Ery3S`mThH8HyNy3NEuq{3d&)L@DJDe{w5!oy&@SwwL zY1;KST&PS_URiA@okSnmEK^7a8i42;OFH?=sgj>^bVVH6Itv+kpYOZdQEpjY&Lo>j z6-T?^eGxu%NRa&yZ~E~Izk?Xiu$R)a`Q2Z0c>Ri=^6X!pZhXGa_%BoKS@d^GozwU{ zZjdm0UHgtcr+mrLk|Uk2i0Jy#P`LK-%>HOjv20crqDYO(i?tdqJ7x|-!v&$!!)6<( z_FS?tm+h1o1nr9RLFQ&dhUi=rXc$PT0`+EIB{JIOUoPcW&pL%4JB8^1O%h;b$1(IQ zrmY)nplWbNM!uKIaGTYPRMo#SGhSA6gMHUP%J8N3{>Tj&N&mEJz7d;to=$tS!-e)yL=9Q zkX_ewDRyr%e4h>m7=vW)q`Ug!h>!r-+tq|R?)f8@w{{*)M*A14jONFPIWP;lg=%H^ zlW~QHO2=sUbM9$~%ER1&gkufYiIyS2Aqgp3BP@_Q@;5;qbivVRjo z51tA}|NM0$q(=q=(+WLIv#hdRI>`e!i{ywsr`)3G&(qh7$HhR&;|f2g#;0PxYAVt% zOeLEb>a-=6QT(Lc@3f>mYhSZM!Bu1+HfyIPqdN44D0y(GGyw_frz{F&T9_cBqTThJ zx4Z@mbXT^uD-xhn#t&gsk`g>EqJ$Tz4C)LhhBV5zb!4uE@0CHp}%(U9gc$VhbtGTEci#PP^{F_0=Maw{*T#7CmLq&9*tc3O!C%g96U z&3vygv~mKe@irnr>BW~=AO->G&->30^)f5Pv=_q>FB9$v@kTLWC z809fIFs$7n9>qeJo=E8_EBtA&p8uMOKk-;-MqH$#6YT(f7SHWpEUMN7-Oad>8lOU! z!}QQq>{rd15~`scNf0VDPLnCwfmx}X_%7Q4kD;LxARz_0y*)PJt&*9sakeAt1{Y|D zt>Ve$SPW_UBDmfA1^ccMxydF;r_4c->j;N;q+E2q_5bE%^8o4Jf1B=(Z3kU8S2rit zXf1B{8pL~zAYiJH1y|HfO&=W0FEFaJ{UrZ#h-S8TY0((u3g!SDk=mTB&Mfw_0d~E6 zHcl)k48dPPQiRhO6UMRg3LEM4+5;s1rZZ?P6pBpK2Oph=?{XNcWcb-%0))7iP(TcM z;u>#kGth?9(;#{64&ez|7?$qh>D}kdD<8K?)aTr>O`3>E%b&;2gaGy9$^@7W5SI?~ zV|4s3c%^r~_}ImAHeKAYv%+ zWMVhl;)#fjHxHw@6!}NLGJH2Cyfw~jY^89^N!Gm2!>VUq>rQaj3^XUq(**PD?_rKl^%+XLK`*tjE+vYKb{HAG_iJPebT`Of?RQuY*bC?Bi3E?xdOS^(K z$Za3r5N3l?y9U3b0Ut918MbJkAAqRIufTlPov4)@Al+|hBV(B?o34okkfz;;TY`&& z(tvl4stmc?!QFOrU4UeBVO_<1`QHRE4G`KEcUhlQKW&e>~dDM-5rVS^oThV z$#@g-lz0k*-zr(r02nZ)_h>gvIYie@RYEW|^thK8VmhC`##72hIu0caWg4GyykZzLt$MHsf~_-Z`G z$T4S`?ax>SkxebxX_>#8hKJv20F8sbyM2)*H(J(~!n<=Eg7B`&KW+;s^{Ak+u=M3nr=s6iI*>!xAo(4V4I|INU z@wqM)`QmJP+ACIPc zU9m9$YnIsK8+djU1%i}%8YA-SVT5%lVpV@~t2F?S-7e%KjOh8xI=Be*msMWI}^nRMN1j5QQvwI3yBX{_m@VLwMa1 ze}z8p-8@+Z66 zo9o*-l|v9vq;T?p+Q<5EaT=!0v|6TcMF$^^CbI_=zTP3r0=i|=%9rzGfFGng>(+8ago1 zwEC24rqk+~Q{7xkhbG+_@-rvK%FA&Oi??>+sF=P#luW|eU7cv*15J0?PKpgbM3?`o zP#EYsR1li)r^}ve<$dlaZB;w9q<&fuGWZBt9VEW9St+TyZCQWfQQqKxd@sw2+IxA+in;gVC&*X$c|*AM{Hxy0*S3b17OziI_$C}^1*pl8 zYNb<^KBxP$(Z?^l67;`xTT=fyf3kRl7?rK1S7Iy(GCHzhKB!ha1$0$=NR+nhPVup$ z8EF@H9N*(352J2hMmMC4iqjt2RbL3@@sG~F8lJe7oo&l6;d0o5(CewUGd97>a5nODDn^0o^J6LTqmzbDO6<&n{r*R zGz5C=76{gyDHKG&({l?8^(E6^W(N!}b6d&6@#j`*kBZ-KGw}*8n*S(qxp$AP?#9wA z>b+;3{{4k(_o_-u)zKJ%4Xwv*@w|~|$t=&KL#C)#BBLZ_pcsco4cf?qe*vBT+FYW< zDJQ?h6Fc~NPfwP&Aw){F_Hjre|4gU z2_DR*$u2a^Q|U}jY%414)I`s(;V1H)`Jy&)`X0ilWoBrmOfN=dehR}+YsRJys)J}* zPeouL*~QK*dg$pKpR|_btBs*BCkAGWlIWr=+!E@>jzNg?*=Lv4r|*;Y36HvG^C!#H z(A}>AhFHBDDDEML;&EHT*SQJ#$4Ku~KD~P)i){e>4WLw&TzwqL{K}H2!#?|3;+)!)%Sic$31yr@GT3>%M|wRHfv*Ub=10vT3tB76K+FEA`TGG0f?SP#%opQbz&UDzy(qU(3)dBnx9useq`k=b#T2r5KUViBp-q%@h8+Od*S0p8o zTZ$vZ#I3WP`*dj>7UqsDi3e8wedwEAro|QRq-Ls9oo666kHpWlxstD1WuT6sBb2Qn z=Ju^}J$;MeoUk*vDt#RpH!%B0SWlyLo}gIm?$5{c%Z5mVmTBoYrY+@pZvF2;46-?Z zD@aYNp?t;KIlO2VOgVnY!wcgRIWbp-l%@BLUdrt3!BuLp)%!H zocDg7_x?;wOboy3UK|y=>U)o{eFNkzt|`~L8dlcL)((U^cYl}W4I&p78FBd`0t_YW zQJtmt{YFb=4nC;Agm30pJbVJy_<7jwyx7>EpQ~LZF>&@tmvQC!Z9LP=LU&@E8VL+g z*oFvL8lL(nehKWEd2gHPDwWL!MjFSM!01jS2d`HLVd?dsTnPqPM!43ztGziL)O$Yv zCHOEus)oZg(iH^ho;;NJ z#Hr>4^G0V%d`^e%`?{Dk9|AsRepwf`DEKg(UENxZ%Nlhrm)ScMgicy3qG}cka$8(n znejZ(UcHYBxhVQtfe}?15aGUsH_yRBmmkohQNP&fy)c=2UH@MAuHOWfIG!&~b<+rp z+ul7!u-X_Q5(;m-jTl{ao+orw;By&U*Stj#Ex*g46q7-6SyCi5*DTRC?Yg~W&bPNKJFg#3C=JjV%JehVS*SBXXIYWhXvtPwI>c_u^9}3+f$sX zlb4l~nDUsDkA4d|u_%-?Y-5qYncp=fMmtWxstK=kGUX^cnO;DJ5r)mUUei{rHgO)u zO3}fw|HMA>H!1O)oQ{s<2&U7EkiHi6FY7X+@bQm$++dVNW?1GGDyGy1IBtFWq2Qs* z9`(>jCs$&-8>fb*yuq~PHr!tCn}+RoI){U$CC{hd?HG(8LaU5O zPScsqx$I+pIhE~~0LW9IZZvLs^`tb=&kVjsithZKr`qRZ;l4z*lp>E$0rt@Fp<`*4C882J0zsUfM-haB<` z=6m(Cl?`EEIG8Kic{8G>GLH?@IiOIF4 zzefwZGfsOwOh%s9p@mCo;FR3CyN!^sT|8$^0;^?Lz@6L^Br=Hyx^U(ru~Lg=gehxesjTZ#RB`hajF-U ziYJ18Vc4r**EfH&n zH^;}L$2+5wj~C`Hn$IIlzl``?8=t<)BaS|oWF`eJ4mtxmuRTx)FT6P}?eL|(tsv1h zD$nhJAqwB)PAAzLy2%lxPYLx1O`cF6P-NISMy*SKt=c`lvGKUgT71}mU*(>rA2dr< z-)?6}l7YAT@)cRX@;YiaOqa&N zR|TpY@sB2Axc`|Il96;q3?A3PEC@>(gVQVIi8K4|f+lPe}qeCr|T7 z7JJ>c%#bZXsO9T)xp6!G6B4et;ErofSl-E=7WKqVuWKyHD^lQ?B0>Zon?*h*>@b$3pxZLx;7hqv9CDk1m}|{YFCitoph#>Yvtj(H;c&QuG7R)+n+SPxDgh zvX`b0EGDfcA$V2JQ7~yl4p~(AvRDd-ocwlEe>ItA?N`w&cGt4s-le^`4gXdPP|1A? zU6@?}^(6(fT)M*m06ZeW&PN1p+2V6{L%J-IY0Sc^2-;r6ttG0|+i0=o!WP z?W%)HA!l~nn2O=xaYAuu!>`2fo;o)-SgesePiuN6y(*MO{0EJs!4<9w7ViCv-7^)8sMW?!EjM z=%AEnzr4%Vc+IFg z#`tJHDau)dJ?k-2bKJv-!Uh-Tp7-2Nkre`ryV%0r+Tf|HDyn~3OhNcPbSi>R29rlkONv)oUfa4TK_0FQ3$k3gXhjH zTo!EAR_;bzS}$#1u5H_7N%&NFgZGdfMewCQd)!9n379a5A0;esAi-efuGv-mjJ!=H zN(+0)w&!kDQ&(7 z7i9727M!H26Fv`VgaGE~hrNpv(3e+`=ySo{mhyelZ6SQ%`u*!W+#Vk%)Elk2sd-5;4Nh_DRsE1c)bx)|ai-QLm$AN}ny&=51 ze5}w@Rc0^maQY?A6g881J7^~7#i$iEC&3j=jI6Jr<(JEKA?~gX7*ixnQ=U+SgVl2n zALqr@P8hiQ;>;c5=fh6RIi@x2PV9}d2a8p^wvD+i3HOjYD&nOl?YUGYm&FHdE&eQ` zmJCjQJo9F~sQHa?4E!hW0FZqvm3v&Zd7|t$iQg$Ux1#J55X&sx92g^M@caqRf^oa7 zfeDPzDuGs%-`M0zU~NXY%>$}|^VHM%HorH|evh2M7c5qBX8-!O)fu#8n44osQ!Vu< zekF+fob4XhHa-JP!(F^vIo`h5IOR_(>sCjR^%Z`(5YFp3R2rgTQ*ASYr~!X)My+xT zaM}GO-rk@L$o5gOmDx{bo~E68FBh)=Z; zVJTzzAq&jbWu7FT>>OV1|8UlN`>Ni?xZe@c{At)ZthjTZ-dly*#Y6Yrdx1oEM0y zOequJoddY|6^)4#Srvyvgq9|q9P5s%ewnl_E>LeN#~@NHS&X-2IcFs{No0*Y`?1Oq z)MItmFkHU=(_CeBJ7frGh^YI+oX|#J{Q2;jqvwsa^g$Ia8j!ofB5uq#)w)VD;Np}YL zqTTS>h;2oNJfb2sN=>xxYxEv!)R*0MQbt$j=5WoKB+BCEBSSAXwY21KpVJ=u(>x!F z^q%&g)O#*`lZKWYM+Noh6TONSraldPJR0!8>5OaMq(V-~%JD-}6sO7cfUJC43;FX9 z$kX=iT}sFl&sFGaGL1Dcb`*K236?x&!5t!<3hWW zP$U9yNB!`#@yOVziz(~{0$?%e`p3HH{M{0c$#7MiBZ|ni4ukrmAYlm96tqvzuOjmx z^#kNIM$<=zZX*c;G;t)&AMzfM)179!&)kt?D|C8z%lufoooQ{&9kLPTY@F zdyBtQ?os%CPaDS-Zm4{5hTK4FhBpRTL#1hmbU2VK;{&_maO1cOn$mV*veU%N>eF|d z-yk6dO+TxOPB^z^l`LU}SmsZLcP1x8kOikC2lR%0km=q<%}U@HNj|@3-xHiPdl4G4 zJ@+_vSwiL8pt2c_V*m5BetFX2MARPCiToPT*>Gpdy73$d_@F2V@XMypR{tm;3;t2A z)3v8BP8c~gptBS>4+4%Ct$!UqU?a0LGIt>bXKFbB9hSrRqR(f&^(YcOTvyJ{I~b=| zm#sLOTgS2yxkna-X*FZ;q&qGE$S9OUJ?=A6ELx z8jn+B^S99v zlAx|F7;;pEnfjsfYwp80J1-)&-F8lIiNLdvc{;i55CE&9^+b?!lN@<2VLGikRon#k?(72RDyJ- z*k8BR(@i~kp}%LTIpYw4#RwLkya(8EQqhv(9-o=CYJ?-py8PVgPqx~=%Di$>f7V%V zje39PCfIRC+_TZ0iewA4NhcX)*Ca0+oA?dKErPtk(cLCV5@siNc z9OJvXzz;_6WQb4qqTDhSE38WK$rp_vi7Y0x#p6PP43r=y#Il=eYe0o+6=q7qP zv6ky4*1CW8!W+%gHwU&vSe+kK-@Lj@5l45K1@nA&JmtE^qO)hziTg?$CgbwMLCP62{h%&@jOt-Ng>S_tXQd}c6W%vH|;tf zN3h$|wImJmbX=ZKQC}4Bhb(cX;r0{tNkV8*dF(ZjGwxr}b53tF-%tM)Hl!dAt9a}d z^V-^kyfcpWrFz_vEFixl1sz{hc_+mLg%K70DTR~){`#aOdG8~;C`&z=oDOWJ?OIHmZ$288^TVC4~g^2G8La}r^{m#2NM#qiJOZ z8#n%OGpoZ@9dXm+hAz%BXd{bF7mh}Ac$({pM&2Hp2`5>QRjGQiA{sG`Y#L|*;0woZ zQ*tv{&p+4DN&81vTn^WQdg>`k(0v*EphNiuAfrC zk=dH%auRr!v$T9)I2*XDhHEL!tfP5UlIYZ@S!Iz$o*V1jWjFXNKj!j9C`Ihg7>7{T z_273liW^VO$j6Dw=9=C(vcfibb#94ag>Qc9oc$mNX)PN?2WRHP$`Bnt<|-QpiA$25 zC$r(}%LD#%{Id_=7ysjUS>M!;<8Gc?7;g?K)J``w01jy^E(zUSvi+7SW`V-m2lgjz zCftqLPY=?al-Y8s!RlBz(~0o5saG|Z#G{h-T_v|t#Z2X=4&0)u+49}pH~k(`>N&9- zSPAZ9^*=KeCnIW8-c8_%l9p_)p64Y5R_adTRo-(|q2aG&U?afUI|hj9Dz{?q;Nedg z?+r{I-lW_19tU}5PEa?ha;~mlX5Fe(hOaC+ER%YiKF)kW_8=LfSfz1BBasR& znaS3(4dbP@dQP6ZRO2@CA^%(wsVR!c&Yg|8qu%g#gVh;Tm?n7Gl zvZnGG!?{46EkZFa?-=|aNnSfERqQe89^XD<1Yr~==se8jj&FqZ0P#}tKfiD7vtYx3 z`u6_z>q3lzpX#DX?B&_$z8a>|C!$KOo^@w52>ZWB=mmP364+lV#xs{_tApUWBKEx9 z5|Pj@bm=X&_`!ldM<Je3!twF^g)kP1EY+jCkJ zjEkD5(5pJB@jj|ZHmL-b$bV|1D;q_W|Hv=5eOjRM8Bcw;v(5Q1yugI;;mXxs7@^$? zZ{&=Ow4>1(7m0#(%^qpQv*LZiBG1(Li2zf3Fk(+v9cGktGic%rAXjkR0PbxjdAt+ph- zC?1&jR}73(x`=UY(;|#OG2Z6puCM#c;NY;8rL7A{|!N|rSNSPY=l zp}o-(WON?cX%ChA)V@I_oD(+^w-3qRr=fG^NTEpDue#X>xB`?zct$KrU7FRa@r-K6q5~!5d{T1z!cAf5Qv_)Q#i-Tm6>1+*j{d+QIMD7ez(*lEQ8YX zD+TZYTa|Mu087=r;z%=v@xXS=bMi~6>V9$so$#qLl!Db`6ywVhk=^=AsM`dOs}xdl zoToX`Jy~@4^;V9mI5y*O_v2X%R0xabx`w9-ANZRkhFCg;+ePJTbW}p2Fa115`gx$C z;po=)n!Hm)IGXmvAd3YmoYe{BW*D-1(NL`Ir{rB z%pLv;KWUJ{#Cy#oC6B(Oho&*)y3LmXtjvie(DFQLFicFI)Ojk3F}r)w?JVvY_S3wH zBw)%4dXyPbmGTRD8g(uPU1`Bd(FS74)N817d*zY?bTywb?J1ZfrO89R>}IoJYW94G z0;3~P6LHgbp%I{Emi>?xViSN4q)zV9j|0Trxu*a?fd?iomcO@_ukW83u38^pP5pC;X|rYK8%=ZRT|Oc*!jr&zxI07Q{-g#*;gFl#k#eew% z<;K&Hdjc)EDXnIT_sOO3jyvpQ6OU0%Vaz6O!u$7ZiKsp)nwIL>pMUT_XRrMG->9Q% zI5p(qQ8@Amy;w&EtsNLVnZ&q=hO(f%u^)Z(QIse~9iC$O-+K8%_KW}K7qaFOpf$+0 z)d^{8?oyLv<7`=G^R9+yVG^&DZB!uHzx<#7Ri?FID)*gdV?t^c+~2B2yIcvlQk1DK zR!Gy6-u&h_zej1LF53t4x=Q7^_BCJgHE&heUzD2{T8bck&jkfi3s?KG_9uQJ8#ll! z?=R_@Vox0-Q&v$U)p4Lx^QU@{SHh{@Gj|LSI{``6pfBmVMNzP=2FIw37!rVW+ikav zfQv>Cm|$`SV3LqI6n@;V;B=x}2QiO?_?_XC98|WMwDXP@eDM19YuebfB>OS($d0|r z@wG?*#@IBTNIYER$+p!|sL8bRJZYRUyPrSr4ClNsNd!!+4F_6sP+!WL(yp`hOp+$L zxjH!S5|5=#-$Wf9Wroyg$Q$0y4=l_RL%5WOcW^u}MOrGWqO+vut@W(i-qf&SI$Gu0 zBb)iq4)jXQ$LNY;h=G`-?jDPBZ_8SnTLxe?c8C!JLh?o$(=dTaxqR2tL793Tp$OG6 zsOe0tn%v=9R?kT#OP~DqrT?i2K0y%~)b!AN2<>-c*fn0 zGh%0Uz@nu zfSoF{F9jmJ%~h%QpMXVN)BufsnM@8g+yi80tXHP|AH}v8#bhVI3#N-?0j2ZP0dgv%Qn@n9xx+`LS=pJqIc zX@0nQneF9|yMK3D7!}*du<+Cl5*EG6)HRepOaoJal!er1PQR2Ce@NIUiqus0Hiuz! z&^(*KTU9_8G^-nMd7a>c&<=VfsWvHpI4#^J97E!IFYkrma$}jiYFHUfmgRosb{?p} zupynityVi*(L8dev#t7?>SK4iWs-K%rtW1c&84iPQGkn@L%%9%zN5KOjMKzz+*Ef8 zwHBAtH34ELpf8P{3*)v&M?)_*cHF(7v1tJQ?C-ek{{D=;S6FAv9)@rp)*BgNxaT5G z{!U6CtS%Xp25RcLmjoJBNj*c&x7dpP9KZ~0;EDy~!kRg`-(hXNlxjQQEJo`0i4_B8 ztOr9ns8mrn5TjP#pEYVoDP$m>y#~Wh_k<t4#{ZLXHV5RJsl8miU z6!;m)DKwh^16t67{E}~%480@ZG%}j0&O4px!K>5bRYn=Mge_#5; zXhz+Z0MQmy)`L#glRx4%(+gdNFX^}$^)6{_{9An>-_#$qv7JoflnHXf_MlFgZWg^7 zxOP4&n~vx8Z39ml{R4r}~7Fd3M$U%Zc>GbKP4%{Q11@iT;AOk1pxc@hnZYOAQe zDl@xv0M0%2&e__?8D*hfjwGkUrgEQf9=`|4-Z2gT33`x#F=Kn^`pjVhGIl$TSS z3<0ZbMKfxXF(bV{P`RdRNoOWAO-`a9f6xukqMjhpdi}-rba-9~?`c=q{WCEojpxV7 zdkBk{VlR`Eq>ND)%AK}QuU9pdppKnDs;&w*(A;ZD?Wv^B>_BS_hXOOfnn~@$ZhOdF zxbqj%qWUmYJblHPCelxmup_)X(fvEZn-P>f<=}$58gO2q#w?2!&E2uNU=A>YqVe#> zFn;e0#GkSK{h}N35!U_q4)YvbFmUFToPpE3N1}nz!64C0Ut6u15&^w;&)&ExD}d#g z&_(0VN3rv~7eLYG=ps`?Z#T@*Yzv53fiYI*yRsBw9Q{@VvK`+UC>L@eU*w=eoTWR|#>IHECUepcpkIir* zbaO_RVog16?&UYskRoGCMlijnC5Phz)w3SQwa4E-Z#J~y8r6zJ){oQ5Cuy05As)Ip zU6pZ9>kw=DyP~BQH7Q0lFKJT&<+G+ynYFd0?Aq0JbtX&MqhI_Sl~3Y*x7HIPBNXSvVTt_k7Ryyh>|gzEVtNO%1&&H%w2By00TFp7X&E ze()>xj6^m9Eh+{LAJAaFfqM+@7=^ccn5lyaez;?}_X~exZuxsff9_#E&fq*=Y$8hgX0!!l4y-6gnG1u* z`EXgz?-F?FJGjdLVoHpi$;6#)N~~0@Z)|1ne$T&?M4`qf2FoB@Ps$49iF|+Zlb_Ch z?bm)?A=CVy)0BJzh^XK*k3$|YtfTTUP9vTt-7N5w9}hRh>rhT8m{5jnKlQoKeJ;Dc zp5_|tWq?+6U|8^Rm)Ekt{^`y-^4NqxqvelI&Sr%D~bXwTHoW1K^@5(;(p${2tyzXHW&Ol#ZBd^eqy5hr)3e(du zFMsyp7r*$!s%J|IQ_)oyEjc@{ueP)CidVei_rLAizU|i!MUVvx^u#CL@jDMZ@VQrz zZ|aa$%bXT>Kl9nyzyIC;GrO*1S2FQ%=)+1I>JfVyKtC%Z^5nRl*Ke=qNjs1LJ572w z(R`;*dOFB|+B=hObQ0BatUNC)tAi`at12DR_<1e)c-W4Zfd?U_QSQu1FE2Ik zyYtRFexTMUU9D&JuF4(FHoFw2qa_(%c-!0FmYCk;M^E87B(eR8TKlcv`mJw%;DHCe zNreP}jY88%sjPS1b(ePKNK6!FM1!Y-QQ-7mebK7FSd1f8`V?o;-NRxZ6vp4fc0l8v zIU&{^kwzF1D(5K-jHsNw=tVEe{>gWJ*Jzl4ck7L`$krqSAEw3m}*dEExI#^3*Y_S->sfvBim*uM3MvDLTFws*R$XKz2DFN z^}l{QSe#5D`RpGEBjRi=Bp{PC#L$a0AQ> z_efTjwoFy$oW1CmfBBbRL>-d5k~vcM!GEar zXCUsm1Tivzf%bN#$B|p%@l zFI?azpxwMKpsNUkmCjCAQk%A%T3cJSMYn7OoQ4$j;)q!i%j_Eyu@()QQyBK`N=h1< z4^t!BSidH_k!^Lat5MY@ajs{}YZtP0G2qLWuh>o!6qT)q5&@i_LI;45XYXh*KQs`4 zI*p*O)7%5Sb}7nN-_UegM24P=y{CHjI2Mt^P!wrx~Ph z(oog5R_x5Od41hF1$BY<#`?A-wT5;=Su?u9BT>I6F78pFfo62byxx0$Jzu1q4T7V%oROh)xa63u}vVn_R#R#JPrjlR2gkYoFF zbZ93)*6qsHT!LzujUKVd@6gs^rus;Q7<43YN(Er4sXggNBIdC_J+l}0??%q-Gv_y= zUT=Jk5)GTi>TNMeS!r0uCeGDHVftM3`jgvuXb`aR3nsAN0Gc+8eW z!H^W2xz@Fg!z(;MmBOZQtcObPq-VBqVy6ZJuuPh346kXfsUham5wmM*`zBP``I>!^ zhU=HHSQ<2v0v8n>&bPPC>VAe!CT)wq(7;m|!ler^D=VFhjxiTTn$@}lQj*Y=?%|NV zA9X4HXjIm1Wia$XdQ-}jq=XAn^k_)xQb@$GuEu+6jixbPXaojz2_MFIc^+gF zCtMYJ0y9k zAN3#LazoqjItqZ17TG0%TwnJ&0(j{2VQZ9(8YBv+eTcraYv=@RS^i-i3zbt(w6#8l z^2}T#c~5PT_U6|(&tAXBE_>e*7gx~`cZ$F0der+=ckB#1wI_z=X~8{}yPe@z{G@5n zLJGlp7qvtq!BIbWD&e7Sn0+W9Fc{Iu>yhfuF5?x=?a2U>l@Nb-^LHknJr1v|Fbo(W z1~&i>W`WJS*j&sX(Ype;ux&mm56`SSQ7AxA?BdRV8Ft-WgY2kjCQCI^kY^(ON z?0z5H!|k$n#lFMA7(>ye@NLq2adpL1eqqE?jZ$*Zwb2Z-PNhat=4>-|roePHjE2Dt z$r7m|NoR>6Ksy+*U(mQ%HpjX5GV$`l_6xu57K@gv+4}mr9f3o6v8cPkc&7{-GE>IO z+BcG|!g!bAo?XW2zsn=l6`Z|%-KNYgUQoQ(uG_F9VKl*EdG2emI|j*cNo$CFeid*h z4bTX{_q=$$bRgqhudkx>lomsX#W!SC^NvHWL)1qDG9{h7?`$U{R$&?2>4(!!e+#q_ zKeXdy$RC9@cG)w{MTqm)&%}=5#C^!FMoK+ogLhTfbP=3;H&kSd+wNYpy`g)h_OLLq zqMy5C6V}7S7zpc(!o%Uuq`WtHGW-VPqbjn15mQlbQ5`H}WatE-h1k?wQ>&Az ztH)`9^B@0y(QVQ0TiepK)Utp|u8jzj6>qg6Q-;qH;}|zd)bx=`*mjA{f}tzSmJ2!; zZRm~vNeuD1aT+^ad9GBD7{w>`$G5D!U=Ql~*64^>8PYjnXfDOY=DYNpQ~Evj>9&7! zx-aL3iAG52*0F(ZR3m^^l%w7=RHk|bEdYJr;e@oNd?+PKzvl_tzll5ds*8mdvsX$M z(_I}v^%m2319i!&gN+=}m=c30&(H`j~q-sx?y>YU5{G5m(iatY)tat_8 z8JB|!uBjp?;Nku-W-^>VyGeb#*?X^aq3gb?F{kvjuMt4P5FV2K%X zFAk`E2e;*x_qO3!=hQ%-wY4>Yv@)e)Vh9vrjFO`iSpP=PnS66G#A~1d9b|mS7rNq( z&6T7yhKf&SC>!GCB2F&ihuJy9qtn68``az4!Yi%I%K|T{!FRPbr=#Ts4XuS^a-EI` zTY({o5uP|tVi@4-EB;HjtO?j#MmGtxlD?oDv{CFz>z1@!p|RIX<`o&P#U?GdyB{`n z58LynFz2>{0o9DxGURI&3@KjiEZsAti+gJSc5?&%czG7`xlrYK(@SD%Xw*orncR^wj_E>Yfb>B zIZV+22_t0%Mm$81Tt+8~@E``w92iO=TheY!fR8^kwc$L_E`L5LP*A>J#tvwFhq5Hy z#J{4Y7<4F*tT<7*rE}ac012koQTmsAO7CX&xGR^Wka0C@Nt$Fa`pM)(){d33?G0`C zEU@Qu)DdosZnAM}Xm7i4cx_w~ z{WG z)A?Ow82Vnha%EJmlQcgLQTQ%pOPyif3*hv!rfkc7hVmqFODX4VZ~L+AdCz~Y(w;UY z?nxUA;225?g{hg9rCN6V+GASlwjyb%o`xRtxwGS>jd$qykk23ak^esXXaDRiHY|(w zCtFcTlS64`@%VQ3{onrs*{47I8A-aSj*|z{#_%lm6Q1w{%NKFw;N{OHEmL`!&er<{ z<$Wj#QqxNn>Z(R`dwq2p9(e!z-~T_}d+)s)$IZh@-h0!Ve&Ft}{Hm|~$Lb6{Ud+0w zLsqLg9YINCsaw7Fi@)@%U*1?+(JF*m){=4!^ULIy4FW1s3}W9-Z=)wk$D+SWxq7`- zS{I6A+|(eZ!dTW}fv>&qzWe@x3Q2paj(bz`v)1}0U-Hxvy>mB!7>&>k4VD6)W+-&R zd*K%=g1@uZ`}lLg1pS_P2+#NF)x#7kI^lS0OY<5^ZJO86JXcF<@~g|)SHAeg>cvZq zn)M$5nQ5_UzRfg^hITv$N3NWAV>DLTZEkPaFxyvu&AkX*T1STZaKj|lj+8nsUcQ|D z!5{pAY5IwbqEmY$4nPBxU2eJM7GqLQlZiUv&WE-sD=x~7GDATEV0F{1G_tOkW44)P zFL>T_v#)yTORRH2rv!Oh>n^Q=|BX09fqM((PB$s{}*}89mLe0%CCLh>;B<=_x->BRHCqnm<+bS2GC+{ zu3X5Ta_7^sTd&-18hagS`~qUAA(Fq2RM6XWFqARMC7F~-=wR-WR?o8`5B8@Ko0K2p z7YoHSZgvo>sAssW!ePNO$EsLC!8Ftm4ZJ8g7zz#2d(~7*4@+g;%k1a3*E`ePJs#5F z6^ZZj+=Y?k<4zo-lJCi>^tbKYsg3}xuRYJ`F>@vu(h4UwGk2s;r^PYto9D$1a7bm* z&n}3Owzj+3V-J1N%B-Scu=VR(rXZ2#|N7bWtJ=0o0EPtD$%k4gLXpO3QKWUwgik~Y z?{p9eWygh4@tNtWgHe`(K)qfzfNM!g?r1Jd<5$_10F1iV*K&w$X(o~$G%gJ!Y)Djo z`CMm;?eM>z&$Mho+L4mV%hHl$@pxM_%(QSE(B&Y~j=qnoKJQR(`jQ^iBhtsjx+Mvc zM)MP4vB@K4!acV9sd|>@Jo`rPoEB%k_t=l4`VR_|O}r1Bh4J{jx)$7cav4GxvPc<1K#2-923%#@}})QAJ~o z#;5NnB4ZScFqwp<#k@#h^e$PrIM93%^I&Y`sZOw@l{AMzoafb0c&Lv;ABIz@(6zb% zo3(QQwH9*2c#&$@ecKdW6vhFpm~Y}JmJKvMsUZ#r+EkV)MyeV`hE^iq#1Ernj>^V_ zWR;PnU*%SnwhB8dupZ9qV2bVNzn)JPwW8c%Yrpi3o}?)14hke74#^2(5Dlz#BI;~96lmsx6q0H358NHsD8;o;iCUv0rjxlTM2GvLw=^$MI z==SDDwxoGs(^!-@Nup!aV|ZE*NF{(3^_S5KniTc42;Kk}VZa7#47S3S1bBS)ER2ev zr13$^wbg-ix0A-Em`G>C>Pc>kkF)$B885T5$in=;sXBdDL6_3}J4W zz;98DxJbPi!XR}~9|5qU0nDhcjBHF3w(!^bDir}oi=T<%jL{tgwE9G*a>Fwc7u_H? zsYUVYhP%9++-b6${5da24;J>xDKIXFlgD))W7x&Y9Xuv8mrOx zUk-@Q^k53Shf;~#-n%6%7mR^pI@lh_MikY~Tv-jq-PN25&CghkHzH3M_6^aXsKS%g zm^|l9Wg_3u(%FqKP=yp{VU!dDv1#9?Vp?6Gj83hbBuyBCP0-J1hHRD=Uo&!uMk~%* z1)y!JNVhJzGptA))J^K7FHr!{aQ9OK(s;+toU-*90H-x*UL-pMoc+)KaavLg z>6!0J;ura@UB52X|1Zxz`KiyS?y7d#+9xTaXqS|(BrUe_;=}~%CUumHILPnSt5;1z z<5(ixsi)9{dQKQw{f~X@WB1&D|NW1XM8{cVnu=2wOh)B^_|tv<^Pm4QIqwwnj+5DG z@02uYDnnYx+sNn{H#4eNPH%rUM916eo=a(z*G_1&@Wmgmqh4o=ehYZ->%^D_qs($M zSt;H9OzfK;#GpEjs%YE8jDCpQ<1a?(?oW{ z1{|G770buVrRX+Gig~=)&Llk@^zz+pzi%4GSpb+ysyq9IKgh3`mYrdlldWZ|D@)n0 z{NgWUZB4jx1WpA}O!RB3PBxb=WPkX9`?A-(<~3F~k*w%sk&n&ImiB{OvfVydM~1P^ zRz7b=eb;D0^+$f>N8a&;FMI*et4jN_q&R4hTwO_NkG$`F@B4?k{~KMiH&g_xH;0It zx@E+lq&d$c27ic%&QB1lud0_`Zwo137$CdpL5vO`1>@jBc?D>h-qtoHV{*dW5@h;et+E)wyNr-NHCH{|n8v zMt#i=w$u4^c>;ch~}?nQIx?)0A( z4ZN(0TmK`&SeEth<;FMd5|SY$suoJh8cUJsrNYajSWbB3J4z(-Sto#Wq+w_&Z%C^Z zV7l#bSF%m5tFw78(x;1^?w7QXoO;-i8ajTgfuqAkzl@Tq3K zrhM^>Uwk_Ej66{1F@POzItu9#0U62{r(&c&ZdGPPe<}hM#%w;xvmsqx!*C=0T!(2( zUS@|0OWX@)M2Dognd)a=myKqNlG1ZZ+1Zg#g|cUXP_g&%K6E0yflPaW-YDOoVbf@h zfoP`$wng$rvZ2$AX;Y|&)4rSen^fC2TJphuCGp)u1YDSs!3Rew%M8r z0HZSnV1ZMv%;ELhK@5N*jCT&H_k`iX&80O@zlIq{lySG2*~F}TL;sOsrMwJoMdrYA z1Sw<|40Q9W;Jo8@k88PUh=ZvvmPbdIDOncn-ov~>P;_+Sw&Uj!S><2qCH8r z;}qf~Gx7#Y+%QghuACV~+%#h5DF#}#%n=I_7Xzc@`+V2t=2Y$-NhR!BPq}-3b^_M8a4pY7WD&~U;vM_r zq&L-xb(U7;9Z&Zqf zX0)fSI$12P=LCVYP*_r_;vyUixRJo9CtT3g4bK8ROP;&U)K=TUSQ~|YuE}a{>9e#z z82*69C)=2RZW~Q3hKZjYorDR$89p*Rj$uhn(TIZ-AE(}rc|po2^^5oH-9lZk5d#kb z2`K0VGB-VlsVvU8NG2;AmC|d>?wT_8)q6BLRkmFf_Kb71JJoY=u|~I(mH-?~umUHB z|7xMCAGMyqCMg;qA)s`ip)F&eHo~O%w0&mYxsaqF&P80~lc1f*`8=lLCk*SMQYT1^ z1uiZoL)>hf`$+GR9fW8!)q!azhCLMHhIyxR!>(mZ%@ysGv6ZmK-Wuo4@|AzyK-`nE zBlaUc6qweoH}~)>3)JW=)s*M1=F3=|jnaonQlec?Ys|n(@}(g`qXX%+Md`B3xhgGm z<-!0a-idU#UFkUkhcxJz0OJfkzlfilMXj4jz5>MdLyVb__%M;cpr{ix?1^FT(fWtfNDuJ!`!>^^73bFxg~@vI?n2TeCBQ5b);7K=aep0 zFcvj4xM~$fzDPf*{Zam@6Edsh95o)33a7lpC`8eC`|zBZ9}nh{ccd(z$o}Me{Cj<1~NA2TXD%nESB@%VU2AV*>+=#9K z80+Y4@ppyg2QrX457sqlOV6V3Kn#iD!&Xa-*@hokrr&I;N~Xl`lKwRH0V4`rH?JJxU?a&mQkRbb75swJ9%hsQ{e#Hy^K{0 zy|4en8|oUy?eui4U%uZ^o;EhFTN(f~O29f<0&~7J&{{_3zc7vZl70pD8e(l|A3~k3 zCR(K7Mguk7LsuKxvo}utClS{Gy+~)}LPRC~-bu2QC>-EL9&ZFgUdSIHMPAcyF=z4= zun}U1Nssbe3=<%>5amFv&;?hpt=v+TB5A3<lsUa9hF`Gm?FG&*XYPga`!GuQ@JqZwr<+WSe*_VIWv$M;WFY0KM z^{g)O4}jtvI7ZbtdHeCVU$Nm%fRkfC=o2%Gme{G?jDAd_%Ae9a7j*(6kRsKN9o%>H z+LW8)vt+);F8dcRt!A%$<;%2Dt_~zcx~gf5DoIytDBKhMIg9M0|KG>7`~whUc(pHy ztz+|GB|Ixlqg&Wl%Zgy7GqeXW9L+{xz3t5Bz zF`U=wZe~|*y*>M`H@rT3!yDd^Rh!FMN0JW<#bE>eK2q0G_Og3lmVNlcA2B#^sf*|U zDs9HDEtqtQw1&XA07w{`OEpMR4?p~{hR#wk!5iFgiook$_gee@V5kj=Q6ZOBX+;Z$ zfuGj;h7DP=PvPd)HKheDKP`TjWVon?8radP2rv1&FU(&2!gpmQRz`~+I(*B9Vu#w6 zu%`U|uWx^Q_QwD2&7#et=1+c5<}k$=b=-`OU`dWua|JOHvya&eBKCRZoOuCS8W}KN zviH#Fi0v$3?gGRXqEM(JTm`PTBVF<{DQz6Wm?ss_hC=qPd^@7Ki5{GiNCYb@&8#V{ z!s|K_8A*XNq3YV*gw1#R>`X53K_Tw8+n+33yZ(z8qxtSC;gAjf3Ul>gLl`ei7^x>I zbR?Nc(`aUrW~0JWbh|jR*T96X zoM4?K%tSD!>m-0F5Q3N}csfRNS|-3U7rDdOv&kjO5ozQ~WeiPCX3;AXZ|#U;9uHo= zi68LAR6lIa?#Kzq>z36K?sYNlUZ73xO3Y`S^-=Bu#Ll`ftiq_ZW7BoF=1NrwGYbm9 z6x)&(OhVB8iWZJT>+S8W#CW%)Ij9A@eVxeDQ#d3n0L`WXiV1*W>2hX^7rYe>JLbXC z{kYr`-xYtfcT#+t8ft_Y0(z*Xvp{&csXYhf%64H$Uo0*LAk%Iud3E4pvoKcIJfd-0 z-Q_rTbBRUF91baE4$)(%r60Ynq$?y_t#w58n=(Lo1}#m>!6jU1>GUKF`7RpAF4?CA zVk(^@7!A3p*m4znnEPyKc!U(3LQv%iDjY~*^17pZc08Oy!VVqfjZg}Q&g_(cLp35R z3>uaEC$jRTwfqQSb^x`q}O4)mk_M6rTQKK{@BUR<3#f5@^ zYM7j>XaXo4^D)x1({DPu#nWaH-sC?NEX%aepjCpF_hT}!hKm>ePILgTxg=OP@XFqCZoK(UYM;o#$~KHc~9ZhzgID;{>Y-JRrIFVfhbs$dtVIQBtAq# zT~!UmQJ;u2olKAlaxy>3weV}5pM9FK>Jh_xoO?x@nCqx$&WbI#OiV;nJi$fs0jFin zccDDP{GOVIDXp+J48X<>`Zd`-SQQx6d+c=I%O$jQ><~GljU=g!B@1?vwGw$cW+<&6 zBBy*P55U&are|&`TMQ)Xp>-)oPSrL^tRSISpauLf-jY~N%8N!C8men7hoFNY?!w|e zbwD(atITl{d|hp$!)fCbq>Q&8Klwoip+Xc2a3RdiE{P4L{>xDiqsm$Yvssi76~HS2 z-*Mn`_on7%e4!^=YycO}eu6LIVQQQ->%&{jm7tK&*L5=+V?IYA003puNMcNO=%d%w`L+$}G)bmesv2#^)A^#0+L({959vgZe#Q(?+CcdT{z6^{Dud-EZCR%i;3fZOm$f?!N=O$kuBrD$T_vC7 zSH8+V!``xh#o1QW6Hx4C2QhXJKpL~g2OVvmBkz6j>;S|)X7V|??*HrWU{k5EX}mBm zw(4oeMbYyhWEtcO{i#V>6{vIAB(?rp{ypBl;c0`7eJpi5$YF!bQt#596WRw@`O1AM?WOERwcejwqwUnI+=3T@yA^$>;@ z!kDJ-OV^i!Sh+{H1MqcF_XQK9u4nbFplgCowr<~gf^7jC)gI?4Izf|}RRgpK%<4Dp z-A8Lc$M8Q|OXUL1@Kw{f3A*W&8k4DU(ns&!y?bS&Su@e)JkNFegLa3LTDmY%D$ceG zo-zNoraSnmU-y}4y4Ns|4Qs*l#ovP4ms61km5XB$5*TB>!|fJYyFU5YV^Q2S)`wl2 z-PpJf94y5oWM_+gifbzaZu0I8T-+=>Tl4dCzY7gB?4fX1o{9a$PyEFD zz4fhc{diP$*8sXXJ0Aq$anOJBo8R1d`st@%;Y`qzxSNd2XJ>{@CN@4|88;r@e9ts8 zF##&yO(TPHmMk-qc^TjH`IlBN;R*|xnwxNS0->|l+qZ8slLo4!28Cip z{OnKN1BWECS}K~@LF0@j6G3uC)gitfW;n5yM*r*QYy`u zq1p{^cL|>Q{dA-}>8w?VZiYH_pba*9?(U zs3W+CZ@*eMRcbOg*BIU0U1a%5B|pDmBX~PlZi_`rt#FmV7TCMEyM+-F@c08i@B`H! z{QhsV>AZt+5voPfxK`Om@?wwVd*1XppZzU2zWhsfRs2Gq5YmDGIn&>Q_PpawZ+g?g zf?mM4E6>EZZ0|#U@CSeJ+hGtl83+uhTwmhIR1U^N_uYEg%U;&ux`&pBlImnA0C+GJ z8Bbb?SzKLSeB!ft`!jFv{kn7KF7Ht%kXR;Fi0xyKU9Ud(^WIebsSkP`IK!q` zX0&lGpDIMY-@eCPV;j%Kn#Nh`bJfx&f4L~}&wk1L@;&@uh{rL(lKMEvC??M`w5A(> zZ^m8hIm)9`T!&Jn_&dM%d)43nzPAQ<4LCcRub!!3H*J6H$9z=vbzk$M^&j%5tN-M~KB8)|xxCNBP#&PVuFLj@`OdZK|M=m5Uj4>z{Kf(1C8Kgu z$6DL!KmN!6_^ZWBTy$7YHktShKHvjB;D-qR93v;WpZmF=dxG!(3g3J<@h$Pr^`Owa zP{(ikd*55V>GQq-=2YZiMGl}Kn_8#En*1FN?`)GGr(jr#)&LV#^du@o%!W=`j%r@NL?~4 z^(hgiI+3X&wG=t_Fack`^K7-vBJ6$_>p7-?!BCwwgE=y^MSwDnQ#xyN6Le#f&ae;1I4#!gvB(zH-F zdJM>s?$)ha&Q4cp>##@7yEvFAR+SrUhDRe46WCav?m+Zu7@Ec~Q0YNBTo1Bdt`VvG zSG5>hD~>Gr;fQdf{~{A#Eo2yBZghJ{*lW zp%#gyCnTHR=o)xq1}2ik%*5FsE>(CUkW5SF;w;T@pAEaHD}(}Yp=^KVs}mstDI_Ej zSC>@J@I3t>%#(RXH;qM?{0@sP>M8@<^A0ggnjfS~x;gGgnKA`_GJs$L2P$$lLOaaQ zhhR1bGJ7yDbvZ?Xb6rfO5imd>+uqXVLih4cvU1dub0Nl#1few(;a=Hq@4KRe>)q%~fkKuSK^s>~kAAoNsj*HC6*J#5eK9pLvKMI@2_9)OTH- zw!B2h;XkPC7s2`9;O3!Aylx?-csunrR+{sRs~A4O4^g?vr(|Grtd%)NP9SxTcj9lU zcgZgzADTY}_YyvBvvqZ{Zo55XT4OQRyl7-Jlt$qLS7j3Kp2vr#F{i3XNGGRCIi-mh zKq0Lyz&n^Cu+Dd#rzWTiuJI+FjSB`d2DI_P8UL7%z>!F(FCru&1?A#Bh$%Shnu0Vf zW{V(_b&;u}m}WLb0@4a_$!L8pZbZ0zpG@40$@D%;Aj-X1mLG(J`dLT&X<>PZS(*pA zg38pzliJNU`!0!0L2Sz>ZTbIzi>InbJM0S$v}1#maS#dyF}^pQwQ}TK2l5+DivmPRN;Ul+ZQJK&a$(*v7a_eZnBHd$nLG$Dv=#88 zo^}~(Eu|m)=rhu3#hb45QF&`VXMEGAybk4JgqMBG5Y)&nPR%J*Ifh#CAwkN(2HdC} z$AVENRU!Z;R~HWt4j1c3Jj*OzNM|qVT<1#HtdjWcH8~-DqdN4qcl)BtJ%oX;!NAIw z1>Rz!UAHoGe7OD60}po{FH}1a+5wr8L1|P|0@`pRrZfW9M)bKKgHS*@BrYkLO8i=g zepARp?uCp(R6Ptr^t8Pwl6Z`byMSB5Ft^v?E+yC*KMagIw4~BdtHwOU9ryEJK!Y z1QQ8~hu+eMU0H{DC|`^p>9fDRyUZjWin|XnZNc=6^YnZ9pXnDdFc`UPk2T;q;Dh?m z_B|x6AV7?R$3VG9tHrs6`;4Re4y|vmW>~6>!pSYp+3%w|A-Ise{h-@s-IgW*OByM$ zFAV`mbym^n+Yc}>+UB~B@T&4NFE0(dMsAaxTE81M3rF6e8@kVU~45;;U=|as?Uf64KU?7%Ih$` z9zzv3RKq|$G+Czvprq!-r2D{|lP0A!Eg}bwpUL>iTXmt<9ZHHN?1;Y;DRHKyze@!& zVCJ8u2aZOk(|r9rr@8V>j9LB+h>rm(b>&K65+F}q*k^s<`nA>S*}Lm7of{An)C&!r z$*?k*WI1HuC(Erx*KA>p5*?<-5}bY^5DU-3s^>lOU9M{F?DW6<=&

    )C5;j0k=pLu-Kf@9*(w5qC}!14$paXdCuO+*P<6WNRdP!EK>B|y4^hIA- z{iV}1?@-;f~696Z&@-tZ_Z+q@GhJvQ|2^sDdw-tVh^ z>Zku@96l@oR|h7bQR@`bgKm;Ks;IoUqdo-&-$&$h)1xOT>m zar?i1_1CL!`0L*YV?f2nghVx>(xPLl#PbJ#_>N#;$|VY&g%Mguvbuni(f;Bu{ZjQ= zZ~RN4I+UkarbZjqaThDwPy4h_t-khazKV`vQ**6SH4Tjkmt!4OiHaF)8;^0OvmNd{ zKE_eb#1=X>Gk0VUOjYMxc}eWZVVXq@dmtDYZ(XkoVe|DSdu4vo^*4n9T&O4&rHs|HUW1JJefS-HkX57uFI4KMFhdpYd8Amyv0$CBDp<_5_m%0$OS> zvj|Kk%yk^8KK!Wa!r*PZ_W*7{k-v}0;dWy^s8O~|7RHj_`eBQ;LW%e9|GRfq?|8>M zA@Zee&JWDSEYup_dG3C!lNqa;*CT=UhYX%PNmDX5MahJHsMYf7LbbiMTfP04|4odG zpAZ}_m>eq1eeK|JNz#k)jTv6dDQS9%=+FF%e-#E9n4k|^A zSkka!fK+yFSGNylq)2+CqbyU_sgF!HipoarKc{`)R+`9HG4XGJEWy7 z4|afBPPLdcO9JP?s;aZX^0{C3Q#wpBJFX|zIbcdPO_$*rHj=_h$fz3*epl#Neyv}a z*B*@t$*JOKCJuew#~=bFBK33a3~5Ok$^T#=7U7;6>ZD8yc<8M^q6yd5~o%p#StqK|9` z(H2!E7_3LJw&@Mkj#EJc-T25<}>ZeUTg+8pY7}ua%m=?Jx^N?04Xy!)jcqz zu4iwB#E&EVgY#%XrlEyb%x`%99V#lZ-xSao69|0`C8Ql<&97Yz8_u&NY;6nSMx_Xw%PgxV;+`8T@9CcMOaap8m1W5NJbqA zg}@fu%*ZHepMPYcnuw?Cu|TxI?Z$=qmpxR*d6Zc2KQ6$uF8!XHf>j%`y#c9d7Y5K~ zPmhz6e$AP~yxuz1KN*<@92$~n_`ww!F$QI0vu4zquY2%s8H;3KIeymZGMxE)D|YE9 z`w`;~+8{g#JFb=Wkix=%h&p*&gI1YZE*|TIheIywTztwNb@rjO5inz7ll$e$geF8> znFftF1jL<$3FFBg%J(4Z=dPK!3vpw%9fTJ#2zmlhp*tXWZbsD#PHD(4%KbK4jWx?v z)#tSxMItMeF@BiF-fjMTmH6xXTRB_ZLZ}-sAW@^vOf&z$vV(pf2LoyEm#S5Sc96UJ`4Q(vJLam z#J!=-iz?V6B}?R__@_)JkFkaJv%0}T#>=y6LT?-hJ_JSg;z;)<^KL`~^WC&EFr8`hIRY;5 z$Na-sgglygmRgkhSVt!>I+>Y!#$qxYM%HZNW>atNViUIgh^G8_V(zxwzw<} zikuJsp)BL0DwboJ);Ig)@E0XyJdNLGJxwwGepEiw6rSx%e_HB(<(b%V1CfB70Q(^P zX8FzXn&C%1XZoY!BV6hj6q2_IlTw+J1Vmp#tgn5DD68@My`;6qVz@f1_ zp*Djk75uM}zA(kp)vM4J$?ATsPLqi0vQAnk&UH}X#R5)?^%C}zLAX5cub77yHC%jj z#2@n-{>VqEWMyR)A_I|^2x2a;dB0LZPsYbjX(t#POu%oKU{+C{H$VpyLVAKlb@w(S zAGoevB@LzTB($!ex&67`IR{acad}msxi^1WI5vN(Rm0*CzeU^vzd3$uoS@KVfoz}p zbW|ylm&&*nX88*o&`O14!+Q_rw~S=B$883VgQ_`4$xXwt-^?cS%wOtU7_Qc*rm?M# zfrMN_B`jRjIWdWi_w?5shsnywoxV`>U`TeGXM|e549>Kc>$7*6c^Rk-%_>qQYE8Xy zhUu)Q?UZ55z>N2K9!-JmVY~~VMe4(Ukou^iFfY>=KFV=&r)m4BY|EVdJ6z)QhBVta zO|2+XqiL$~IqNDwCQzntRvDhz=DYr7xJhMY-dUFAh@4H=jBAD;^&GV&3-B8^!s`Xh zuU%VF^3q~WNoQ9}M2Uh@3&c?Mjk=ZLJI z(Q#P^Wh|XUP6GuUY+60eV%tq^Mvkj%<{`~O=zhGhdHnowSpBLR(xx#)KwPeS4w0s zVAOiK^k+>(m{KE{NS$uf+r!EcQ`}K(!f=1{Fq}m)?6XlAEBrWVd}D8`TDf+k5Pz)~ zsleLOD#jaIT+idygbn%z6&@$5cqf!h!>dHx4nVg;+^vxl4j3){->olCEtaSIOPF=YHv9Vz3@6FU|))kkv9i4iwY*o{Xz%Yk9`ZLj4zk&}UjgAtD4`Ct}?TbC>E z9N$Jmqup||DRPel6BB@&!0NMroMFc2xEZD^NM6!hbUe+=pU(V!&a$&S0wT=gh^#`U zJ6+jLYSer#svBqC8UQGPIn&o@s{}9H$;!wJ5=|%yZ7U+qa`E` zRdp|UzZbDyg4wweh*T^jO#AO(+XztD2*&5>ov0L?~Ihr)p>S88#<#CB^&RSKV6Nt6uwrCq~l6%z{0Oxo4G!M*D7n~w+acN}D3 zv36OHlNV3E;sf3v2DgiG&I*0q!OC9L73dD;^-8ukZmd?|UE%2;3elJ~1#{GuC7I+mke zT3Wid&9yZ5%ssb$FY2+$TCGeer7+p#GtWG=%1sq(PdxEN9O4T+M}?8n28Mn6w}1Oh zCN~Q*OmRMr#==)3^AgB(w$p#Kxb{m-X+L4ZZYU3tp2uNuW;Es}T^S2L_3KIff6@E{ zCjipK@48|G_KX&!Idx56xP(`pi2(#tGZ^OsgC=2bK9}4=)dP_3h7pB~L;^Bbee3`9 zx2u2f5B>?WWatdc$aE46iSF|1O7-kB>&%+T1MHRT7i2a6niIl6q66C&_sTDro-YWAbb4XIJ}<06}Y zJ4l4L>5ISq6>qG*=2QPnwXnO6N>N5#P^3d!=8(#ioP;QMnDwa6J}-xRox*CcJCexI zKN^zk(vO3c$EuC?wd%Y6=WnY%`}4lEYTsC??sLF1bBAhy{_nwq|(G``mP}QT^GE{IKem-u{cR*;(TpPhjDM_i78K;RNPe-|}tMw|vXD z&|Z3j3fuQe$tMxv=(r>QI7t~)pYZXYSpB2#|Nbym@!Bb+ojC?>Wd*5m;~rlFK}c&J z)g|L{92_@)yD;qU`R>14EumVDwMr%}O6nd}whcTy_0-eVCw~v2A zjbEwP>5H65N@M0K!Y;4@)@Hd^M>B3E9ZkIDMf<4IFnk_@?$-8ttZ!JS9z-6h1K}%u zk#(0w*WJW-)Z5|(eF#;AlfJ}5H0wT=xGDL0b^X?s2a%GTS-i7zE%PXbd(&j17&t&2 zW8oggK`MTS+h-ljPnD@BSIBj>1f+?~)~jm${%-UoABR)bri+~T*7|xX(H@h|Yox!A z;IP))tggGRw)adm-*t@)^{VAS`8zPMIS#m$VRz%O;8L%nY2k5_JZe7b+haS!z4iOm zt;b(oZQprMbm7h>CieCp(%C-y_LSJ3d-h(nj7qT(VETqJUEf%*){r=5SZ*?2;iP!4 z?rGC_C9d^*cjzCFep-d_?=j}|5l(fTPG)8|OzPVR=Ff4GfNa>l*}T8bgrTT8WxVqX zFe!{#wzgT@WP%_ZczdwSRO#C`IBttfJT_s#i!i$#n3+aKj`@by55@Ye8U!XHFvd9f z#ED1LNqF=y+gLU9nw3@aQ?d*x5P1#9#KGQvPM9C3c_vnOKjU%`U~^au&);!j z8Fvvs%h9iarA88R9Rrz6dvbX}k{ijI@2ZWsT7uc9L_s3aL|!JRTty)=jx5I{FzB$5 z$_l|SW9!17Qii?^t(M3lFykU^O#mA0k+8V-R+t*=URd6>wAh2Icshvnl2FOGBpzOY zu|vhY!ec%~u~Pc*FT65Tc}h~47t%%okecFT5gwJmWKey?B^7_s?&M;qENwL;4Wde) zkfP728P}n2S}QK@Bc*KKsje?$AxJ%g)5Ew-*J@Kw>d3k1(FcpPT|%C&s8>e;K_oJA z%qI)ZRlHZ-Sh!tnY`+hm}<;;Vr~U zDr&o#gn7d-bSBNRo7weVp~IpKW-Ix$njJrPMp6K=FZV1me5=wxlS3 zBP?=hhF-zv2JYIrNqzCKxBAL6F$P77GNLMt5edS^d-_KCoWDlWOL@$4(myHF)1@oY zz)^V>Ypfzoh|sZTi{6lNh{v>+Pmu_m&8r^tEtm?#`v_;f#$cb6)WcprpjIpy1i_#j zXTc6fS)^BuNa;{=>*&YMwpCAck<7SG9@V1++PGxQ5GxpwOrxBxU)I~aqNW9*gA?)d zazFQ=@hN$kuOv0poAJh2olE%0mnp(_A?RE9sJW2*90ASnyYVrxa2@Nv199KlWnUH2 zi>k3bZtL}Kux%vjRiv>F%%Dd*Je$zEA?J~wMhsPT{pPJu+q%Xl6VS=P9D94HxP+s# z`7%Y}#xe8|V;PbCLK7HYjAiIYnTV4q;lRro3k(2@azN^^$L4M&OXSC>uagcLBD0xb zfJF^VO7gTkooi`MV6y(gw&~IrMx*cWEidB=tl1AGZOLu&-}uf#?J2!*<-z@Xr^ z!spKi=MEpoRtDP1UQ{vgvcPHf8O?I=hOVYJhV-XtO{@m#VLPte0|UdlyZ|?Z!T?|! zD!@0xA4KEF^KZWUoWJ4PQdUC1l%xrK@eA0>Sb(oNbmPyymoO~@Eh7+;EFu)&S-L$U z8IuV_S#|Etgu^xZtWL}ae8GpFlo53&p@cenx2%Pkpw5h}iYf+zk7Q+^E19|P%sR!! z;6lsDn~$PWC`nH7seGels?f{GDN!CLm$~At>+|4qq|Zab%-)%PR4IxO|nOScR1CfjjC=B z>pacuInp=wmZ?dVdC1)MktprE9t>lFaZIKa69&gbaEcM*IeN*lKJU*w9ExJ75!Qy( z!9H|s?Hf<6S5ng#PT-#LD;9{1Kfn}w18pvo5bMrDR#;j(Az_w4*Os}q3@p`wA%U0T zhkq?srym*xo&(0nFXMdAH1ROuPrx;G*U$8sPbSase19Q)>(@aYA8VkDrR&07_8boS z-~|xv`nPGkugyzHU3c!Vp1QepAHyMLdcdvHtWKuhXm9Dr7ot(;DD#n!!~nPgxpfCM zUlZY)VLs>Y9DRD=lguamEYC#E=b+w=YG(QanT@{$BRd)1T!#qN3jiI+48Z1$RGy&< zO5zcxpF=5z>X)of`lPj9kw-ksY-E515zMR9yD%tTi;IYYD1Iw}aj#T38FZrw&KzYj zJmP>wh-$$^2@QXEwvvrW8RPTt!b#%+zYlG zV`5Kga=(wnr%{WvUKS}a^n2@@>u&@c?HX|G*f&e|BYJTZ z7_jDKf{wtM_EB`v$H14yP>Wcq&T%S^+h|19Hk~dW3M_*@7yg1YGO$>uWF7StFMt2) z&NI)_c{s0_z&TcB+#>jdqf{QQ9)Bd57+rn<)^o<8pR>pqbQ0!3Iy1?ziws$_Ec3Cv z1Q?&QJke4{6OsvFW%>S2?=o#c?)=XDJ$^`OtCR<2gi_>f)=qXQG?FWANZg~{0oo+3 z>yUk+WOtxm;D9vCc!{|ZmhrN;Xp6{H=VewFrSwFs1rG;?2|Vj?5^M7+n_@Kt(5!li zJx0#fCDd9ADurlp;YE+GxAb9n3taPpSVG@o0cSbR+M`tx!Q!lj&;CNtA)tel)gi5{ zQe=oa;4w~&%8azhXcw?^7I*7xQ)-|_b2FJ?grg9wZ!R@&5@8TbywsW4GKq!ErsjJsSA zV&}4zwc5o{#D1{<_mM&aG2%}t=PZBA2vT(zm;3tM59U=bu0=)}0>*HJGiPgYHkUY( zU-_=YAFlQ??ks*`-lzM*G7|?*_r>#*Djkrn*YV@i;ict@~v-RR}gqm7yv*_w4*fum2DT zj+Tn-#X-$x`#Y>@2-6xz{M^6#h3b7zKQ*j(_Kzx|VV&(ukVfVuEg@#ut|VTOFKajX zoioD^|A-H*Ui;eDhFZ+JDMeW?Z~Bc}e?dT*mj))GdV~wSOt`_-p>^oLaK?Yo$#gV@Shq_KukZ|Z7UshXEhE=YD>TsaR%mr=pdVi<;p4KqHmX`1|LJaLi|@n3fapM2)Aa$KOSYHy?Z zu-Ck#x^{D;+HG?VAx@$+4@2l{{i-n1a4UsB*Sh*h(FK>XKcY$J{uA)aAIDIbl1-X_^0M<}+!J_@aprHiIi^wG z*9JXQVHzx{u>TFG_FEi90?u;S%HR%VOf)}253 z+Sh!`iypiA>x-QZii~}34&sOdoIby2-uT8h4!PUeYV`c4zVb}$q%M`g_)8)!p!%-M zu#@sQF20$c`R2QRsMWG8GI0i_^de$ry^hPsFDh_U=AYU6b)~Q*sBw;CMJZl1$syBYhmkYk_rt_xP@Ee&lnOKQc&d zBi9s@_MfUg=i@#ICUt{#FOK7)AH4N>0S0;(3(9wHE>~am=C7#Uu}K{?-GljasxH4G zRetg(eQfoyAN^6GE>sP>vx~6^O%sMCa-Z-CAJ2ZPPr_j48gPIqIt1JspoPPjgwUok zey8_stK+rLi6BbL8|(>l1Mxt{OUJnZ+hejOI|ifCkCW4kLIdXb!1nl~_2I`PWR&b| zPfkW?zrS?N=YwHZ_Th8;7(t28OW}1pqT6${jD-O_q ztN;5ydFyY%sDA$8Yth+j^vE!=1b(~7=VVm+&A5yo4?BC;mM=1&^s~HXId#gYM?6bV zYGf^O=l?4Mkde$WJ9FXRvk~vE-w6rF&)w2_kih{reg^mi9 zszLnA8j!>!>%~J*6;WnHXylN49!CMO5YbEnU8W2einGP1-xqs|v^3k<+;XQ{Y|y=P z_t|P02~mr-ZR#Hj)XXrKSFTq#Z$B2gfAfMjDvZ>QJe5n>cl1)XxV-20s_y!`t0iu! zR(+|Obe`XW>whq@7OJ_PmWL2r$S!;uWAtmp9%)`yW7*$PuX76ogh`ZbOtHtZrg7B)|)Ix0;=H*@@Rf?W?ugb*J6*k!f z>_WB#dai?X$3nIOiG9`UFS5r9BMqdBojXWWTkF*m*B7cS)NUyGV`DLV2}ulMuULr% zSDUpinbZD1%%ghJecaj zSSO?(Je7mSW2s)w2(&+-$-rbj z#YuL{^MU$jw6PL3scMi`&<80<1E|bH0}j{zoHbg;(wv9yvbmU#tdHj7*=G`CCC7bd zk&s>ACDLw^))Fg@tden1Cg@th8e7j=4T)r*qz&9-yJakh}gq_Vmu8dzv!_s-|=yRWLZiCao8{FY5UPrGMs>1#0jf8R#A<5+%A&m zdA?1UJkPfm{pPr`-A1y=B*lqC53AD!IFx-(x8WFFeLT+;)fax~Q|DklUI}+G2%CZ~ zV8Fn`gG?%=kR<35cL&~dsk-p_`EZG#7B>XepcbX{2;;HT=QNUGlGs9?Y^%;T>Qskm z*q{n83>+Y$&eT0wLFQ73My>vfFZ@&bBC8d38SkF@J!lO1E1vkzZ+pznvsS3(W6#h$ zQo|0?*c?(t>;pqJQuYazLem7_W3T40vI+@|D90xWqiM|7C87aD-xl{dQA4Xc&ll{$ zbe#F`(dIo8hANOmt`EeP1MoQZ(0FVKIjKV2g=-C{o6Vs{tb>&{@Cu_c6UxBv_>3FW zdzezfIFs-CAq3xb9gCS~Hob@BRK{9{?MWsOrKRf})kUB3A0;4beAI<1&(RjoyHsQ6 zIQyNyknHFi2^)=^x-R24;#Q7R z`TpoKN_)ovs(e-A4%eW-7U9QLaO|@oe%0ZYn0*$$qi!D(E^Ily@I|;ucqBUF&BEt1 z6z?a;I_of^2jzKE`$u8oF!i7kPP#Ox>2kV@94zTrB%su&D?<=U2*(U#p{wGqJQHJf zC>IMP7pa^rI&0NQupMmU^OplV0+b9npP%`rpXHfb^I0$)mMLJ?bvj?Er~gV7;U32u zd9uAnH;JsyrngvIas#oz->sz=bCuX42ocT$;l>vv!jEF@PaaI9gQ58-D^;p7Di|eF zKp_ASVahD*hy-HCunLYl$EyUQsYPu=fUFS_v} zHZ5bYff{v>8LJW;cIt6&7iTnuHCLN8vVm({GItuM1!5Wt#Cz7qs!_I#Oh(OL0*VW( zMWs!?)mTH{6}m~`8DD(T!o*ma!nB@A6!qArj(*)^vCR@3kNrMO90^pqv%iBnkiOW1 zQM1HF8#>h%M~%1+6$iNUT@U8vQBA^ownYY3T+^?|sE#?SN0-qj68rPJlfD&4{H04A zDXa!~Iw^zv5I?^i291Vr7}R_ShB8(_GQ#kii7(+f%B%BfJ|CBL4VK^(7^cxxOuB?o zCoOzwxDyxpDVkFE7Z87C+?8iy+?6$ts$)(A2c;2#L*y>%7iT2pv;o5E5)e8 zeMaTmQJ&O{Ab&c;{iTY{U`RQCbp=g4`cN8F;*d6|mP~1v^_sd%O7bKAnnrb`#slV} z>TwxvwY!DH6%v%aWi4F);^?T>TGd~9Nwxa^{c2T(@ts$|wuMXHrYuvO>t zNT3k>kcME|JqUq}qc1Vw=eWqSio{ay36qiWlieVL&}i4$c=L3R+SlTv`JUlT-&63r z9x&{w9C5I)Yh47w$l?M|Ss`L(x8)_7x2k6ltWXBSz?f*T&bY3Mh<>(t_S5z@X4GJ` z>xr?DZ?6ZZA=%K8Fh*k-aN&nTMI6Y{@(#O%lEX0vL&ovIcX2XKhN0o(@PF{@qu{80l18vOw56<(;Ue#0vIk~tec2vp1!B=b2tDiA0%OYGdzWi8n98y7WLBo9uWCwX9D8|Ec#GClec4&gFs%f6Z|9#5)$dCMp zXsdBD#5f0WR74gPewhG3>{-)UfFZr;iQCmT{PnMA-A*D@zMtppz+E@la(zkl+a<2t<-%#-pfS8?@C38Fp*oL zgMk@NnZd+tg!QS31U@;JjUebr2;OE>hV`-~YuhchpJrf!3Dxw|B=yA5+djSGVb4;6wQ) zJe42SbG#CNfES-*NX}UEfLp$8?h}hL0-6hBn3QFdSHo#MPfB!-F!R!7y)uhZ-VunA ziE2Mo>rJw4K@o)mw-@EW;sc?`H6x#O0?=82C_XykPv&WPxWuDCBLzsdM7xJXvw$S|vp@Nx)!+EGzZa)nXlcJo-bHy_^0R8$V_D5CF8j`S z<8=0(&;Ih6$8e^1eyg8(oz?eyWlUNV`CGR2&3v;?Yd71~yMOp66tieMlL0oYFR~RP z)@^7}T*1Oy2O{My&)$v=%^$e~V>lYqNqs*0=;WsnJT(iWPwa@}T*Ah2X^2ZaDB}-K z@K0P7TXZLu6R8-V2BWBh2uw&AhD_N5^$&cbv&GXP)MhiFF`mx`-Uugkj}ghr@nHYp zfaNDs=ubTpyLt2G3Kn=T0Z3N_RDs@w?OgZrSt)E|!@V*kPGT)0NE}sD`5c6`F@VNh z1{2FX5*eHCg*YdfD#SXfK#=K;f6xvlAARF~6E__fT<>9`yAdYZo;p6sB?jc-tl3`@ z2GulCcPO0gEzGf)T8DuF8Fn=!A@42lc$RcB|TCJ!lW!%MCA;7m(P6G6d(>v7i@Z&=PSrR^l!t^x0oHzEDR>{)R}X z<5$O~r_|;M1tImJ=^`%!&EW_?IRMe#7@c!tZ527rm-@oqI9jUO+vHUJHSR~d%Q_h0 zvBuG^o?d@8NRyXeYCN;YZ!InYb!`)?L{!&WKbA>IJz`lEYh~4@z%}t8pTU->`Dsxk zzdP96l80f&N1ov`YIWZj?(^vT%kQ*N-lZJzBI^_n$Nq5z)iD;r^?_MnH$W?zH)>;M zL;kIfy7epKCR3;>YMh1}ND=KM`T~Gv<>?G}JEZeHaqKA4zb-u7TYobl0jJQrX2 zL7ee)`FP^{2w+Kv00W&J@|}cq4klBOwJJ`k$yz=Yvp8PpOhh;RzHsg--g*)*z-TCpt?x-hMnHj$0T;Q@1SchlV1uT@t4im*U z!pjBSQDtX4C&f35Y)60EyVPY^oyim6tZu-4%PH8^a3koL()KXOZKN&N!Gb7CkafB4 z<$8|{D-l6eqRcDb1(N&;IQcV=lK{vxXK|Td`hFW_CmBgXF3}o;v9NTLSdF=hLZW@6 zH0EBPLJTE{5N-O!V}k^cFulj`)Rd_pSgDI^FYZH9XozRl)q?pEZXY`imLcMVH6ap$ zrr*te9&6HpR~g+B=OQXumoas`*dm~z2YGt>!~*MfvHuH8#5mKCs?B@GV6ZResf8(6 z{V>R&pTjV~chbs7;!tA!U_gF>D_n*L*Qm?~=Ek!>jW6OCd6}PioXro$=a{qcIyRa| zsm`Y@-x8@D(s4AE*|k#aJQAre>`!S{*F^&Jl=^wpjIMF!4arS7i-hBUD4S|u$X&KH zm-%JA0#57)2ZTV!ev%vE0sR?J>-dzEdhvOTXZ=#5;;&!m9K)s)rYtXDA|sU0>wJWp z%XH20YCa!V20eqb1?4H!%SZH))%FKUjk+topYA_XFNr}Y+aNUSmt~ffYQ&MxA-8i9 zw4zIoBaX0eiwhW$B2o$wXe5}KPZHVF0@G>0z&v&7mzVfUpg;&=mZ$|ll6LqEQ7crE zFw-Gni0v>BfwHleyZ#pM2rwPTJKHalaTBr54a9v+?KR^bpid78MTsD&i_9QVK9WjP^%Rm0jbbQNC8#N{W}_nxChF* zVDzwWKf%a64StCunJ^Np`keA!WH1;@T~ZQA*@G359wmW_F-ap1sMC?-E`uk(Xm;Hf zBN?hu^;0}Lq`_c?3+k@{N+FDl0YR?!Io@s|7@$UN&0WI+k$Q7-{Tf>$);Boh7>PD= zVY1)`aQn*xont#e)FInn`g>Td(kXS{3`5WLko{Ud9xLaB99{F&mHsS=3use8$ALZ& z_Jun8L>zT81P?bPKCmfn*znjb*La7GauP*m1J;C0Yiie0U5nKTQ<}#F%zIT0+Z{YQ zYr~UbVq#XTJe?S6AmNoo9z?wz#!$dC1GeM+qq8mCDCtg*LDT=2iml0CTH=|18tv!dBQQ)@34Qdq>XxvP}m= zNAVBmlQcC=j?Fyqx5)*Q`mQR**C`+E0yQPm}_e*)z$`9nMmSs)}>4e z1QI)xrj(uS5r176ktIYgIT1qr>K2PtPOjPDB$Uk!PdTek}4EcPEbf_y-qxhe1glTuB`{L;N*e>03gW8ypX}&95Hz=c#96S7Js{ zW7yT18$C~84>57Zj1~>GBAeJ*$J@um{MIe@jBP>mnUyc05-pR?G6R)3CV|mEiU^&y z1rogDTx>!;F2SL=BsAs=t$|>(3|PJYOP-8v`{`gOs=zm6uVK5ozp)jY#g(-@N^8eMrx_Ow zWz;XML9ZPqPdZW9R^1KX3P!oM#Az;^O?hqYCJc+S2V<{f(MrfHRh1WONa04!KnFE@ zIj7P+mFpWGS0)3t{uwLt) zlycg_rk;sSTZf;gzDi}sfbw~=yfWWt$e_B(Tb^B)^G>ZF{NH|n1BKUuSp|<7la`XO z#Ck`>@vXC2nd0;47eY27Jl4yxPTzP>PYJ70!f#yDg0!4iF0tO-<)#7kNK@_#BRkv( z<%^fT^!=;9`yJn2ZEwM}k-p|QC4U!*YXJtnh(+xmyz@U)|LvE4nRYF4hNMPZaikgp z@2v$N_~ec1rH|i&*L#Wy43L?k>!~fzo8)Ad@BiNKtiJCb{X_bd^Cewd#8*w|J$0(u zxjZtC(o$~G1V{-m_TRzm)^0vledqUlpAi9T;~KhBsz8 zdWN+RyJx~oS0YuMeOUTcm8o`%p*mF+#k6md){4{Z?EjI=HA-PyA!LvB>yQ4kZ$NU;VwMAu z7gt%6+KF}BmFqXE>$lkay~Aeu8jl>>;Oh)6-OJ6_>@B>;dLm4Xo<^Ox8-_A%CI@}` z^q2qrA6I|))OxIs78Zcyj;N*-IOkR!%CaI(lu~lnhZ9yWdg-5tt7i6%8#clA&K2V25-8Ah4h;_H`5*Y9PlpeS`UB4`u1S@QEd-~Pv_gzGqLIH_DQuqh|C95 z2)S>SFo368|%uscXp>{Ua~ z>Z_+Z?mJHfIV#>d6~agbWukZ~iDjHKf43IwVby8dG%(OuKx@)+6qhNlh6~9>27yZ{ znf*+R<$d~qGd{UDt-FMg4~9M7Q?}2(!Jd8MUPE++3mg=^=RQHCtVM$SY2dTS{RUN! zOF|imU9P*C?{m}~MoS*#-eHYQ2Iyvtu6+yfci$n)V5q0Jfd`l=-?@q0nuWoHP=eLy z(gIfkHPF#|hXEGf#5mdx#WY=MR(TGHs2|6eScaw_43n2+Y8jsIb$3O18F#>^4-S?c zv4&n5H)CQC$xsSa@}$vB)QW*2At8t~~ zuhp4mh(kAeZW2vpgJ*FGYn1mu->W?-N>Ir%&ex;h2%iZ1^$LBeNh-d4+iB{nI-oKvZW$! zrgpnQXAMS%RK{4D-n-0H70Lk3O-3Yto1<@g9*~ULs+Xe5%-EAtwHDZJgQX|tBEf1r zCo|5?{!b^I&$(S4{hkwGcokmV_@*m_Vo!B6Q(9v z3<=ap9>?R2yCTg$p?4-nmy=gKHAI!7&OLz6+B*=T9TxsI#}B3xvEz6v;o(6y8)AzS z9A#mT;%YBoS!jR8AR$5H%kauSWiHafn7kQ5>C1@>b{#zXPsYfLYC7SBxMAJpB$~A2 z0-pFA|NOQwK#pf5#m`X>#uHx}A|tZaP2b4Td-<}wd;5cR(g-H=F@Ih9TyP zI-Ma?&&29(e`p6pAdbag2$1_*B(Nf8J_kb9`&L|#)@(TS;C}0bNxM+SkB7Uax10CTHzJJFVYbiSa zN-wR5AW}{Wf+X{a@?Y#p%7oME!zH5okD#fJn+#lDAGiP~@Xj*TegjW&alGlHT@Hv2 znHUBa8{_GZU@I8z?157qFOCEzyhL&Ug%4AFzGz`>X!%8oK_krxDBkeh<#uf+51!JJ zdm8;NZq*JGe#&p7;>FO$jq-C0lz1BqMb5{wxZd0+7Ud8X?H!I6-|%huf|y`TFibhD z(m9f9IRS@3SIUY^@O>qZIqL{Oc$@PoG{Kv~-D+Un!_jeN)AsN+;D^Jw$>D0asb^vU z`9YX?$i^jRl2p-Z`b#O^Z~@#6iXx=X`v9L#W@fzV3V*JNcxr_}yvvMo<=XXNX4~7| z+WU|-_@S?kxGVZU{Lb05v-d~aIbNdpIG`sDc9Pe0C7oZGqQt^*LTV)rGe%FZR|%-9 zez4E&)Ai?462ES{&K7>`E)3bIPQpfVo+wbY<0AOD2!rio2Fb+&fy1e!6MqfMEga>< zoy?`-qpCEmzfl_t1ByKA3`=~?nCcqYMj55_!XwC>ob6!pZ|e{ztt8irL35bw>dFBR zepU51Hn^DXintuVscjBS;h`Q3fp478%E$~;_2pTB!OWOZ&avTXWp$~#cW zdGBL^w#|vZTM+taf$p-(x;dWLw7yS06RSIZ1mzFm zNHhUe;MOVbudS_B%gd|rtXf3C73N?1(wBzx^_idf7sL8)b$JQ(#$F(YmUyZcKKO$_ zxcaG|{PBmdwX-Unwg<);*lE9;r5p8t*d!x7NB|5iR->boqbK`4)O4izkXOH~dIcND zJ7_$_Q#VAfGSUbv0Vlqkw=Hs*e z;FL@(Yv(t*WMb)Oc%~crlO{ezb)eq9s^0Uyr>mva>(vIQo6lUM2M$SIjkpPq z2N((c+XSX~ChS4GW|=7@4keVBXG7HLN*pP9KIlq5&-o9>MU`Lt)7O@k@hqNdp*V+H-}JuEQN|o*`E3qqjygFBC4LW) z?71zpBzNytTh^myV&z6{>LRjQ5aGp*Nn*nRCET>Ss91T7u*{M*6XKq7P-E>wF+sVG<*;e~aY=EXDD=z%jbu*R1!$m1BDeL?ClU4id)&+*p9w2P6Ke>;ni!1Dk7WVqL1OK> zi*(lNxpuuaGhMg%l3*x z&T0}DS$Nh1|2^JJdf~0*^4X<@dC%v1B;3?9F{GC!I6Sn2CeX>m^z&Ju+eJONw6Z)@ z7kVa~3{DAcad8^^M*N|Dk$3s9&2-t*f!?2&rZ-S~nzJ%u|+6iOcnCM9;{gY+3> zq96<-a8d#=>{xf4G;r*PbtH^8Yb()B0(|7BCsgOi?;h5Ov5Cj9_lNyzuNYcw*CSE1l4I0x*ZbWKUj3JTmQX=Q~~9hy$5O#QZZ zLU~*7CRakJUi6n&%Pes;yNl2F?<=vnZL@|{kUmsRB7gIjg*5$>;+tuw?%5uhK6h0R z@$!5A;CPmPg0TeT1L{)r+9`1bHZ&Ncc$H2@k`k6-zWa@P$I3}B1Y+*1q~=$c_Q4p+ zq|=F|R(_rqVj9m@jD34DoVo~$4aUe{P3>i8YEP8%if=68#>J0svmOLlADa*i6-GIb zSrT;MXBwO|!Nk&q1?prwefF$JtQFz6ZuNdN+|)~A4BkUMSTZfE=&$*l3%}q98!^kC zlo6xikW)@%SmYXxogGYq10KufPVd&zq*nET;WDy)0a@gu3~x{txxCQQGMSi#3z#3m z^a$~T;SIyj{xB{HjptBKFOXO?oPE)Fy~yL?dOc%`Q@Zk)t{+D(mG zVI)dEu5GFDAR+1d-~+pyEg&Y39^NZ!Szxoc_VNoDXzZX3Sw@||1wM&89pgY8uVRUN z*{GXqWv#iTY70|E?|^;QhdbxtPQN06+jqL_t&|ksl2= z^-QcDCgEl(odBm32tx%SAo6qO=X-NPC6iOl;D+dVE`#iNk~gQduXa|=A*`spPGWuu z%n~^{Jhdgp2U=N5I?FV?b}@w{4>U&N+<9E>4-3%`_yi|Pe--8@3rL1< z$dL5`;yw?s90V0OBN5gGr;}k6=?!)_@HCgXYJ1SBHt+YU9Vdn`r#6?j&V!dLyx+h) zz0Vq$%tZ&!Bx7;2T`h3Pv};Tj{pH{ z3is(mk933wmYvnl?@#uR8l=O>eR5v26tf;UYY&JoI`PY&__T$Q#*1G5r>g6>->*MCBQA7v!0 z8z!^MD}D-F74O8uf`75ki@NCC1J^~wYHX543cjRc&duBSMK} ziD>$+lU=`ly?XM=Cu5z=qpK1DjeF*qXR6Qr{Le?_z_B{09CgCDY8E@=OTOey)yI77 zpR0C~i3Q>`VLG3andSRg{rofrqLG#IMAgG+l#t9L(E|(WGIUY;4=w*p1P~ zX*RZPZj#2fZQE{~G`6#iZS>3gJLmfkX6Bg(_nw)1O@}g3Z7*6Xrl0d`s`XzmN!03| zb%&DZWqvY6XSauF?e4xy-5pN*QG6QvOv$Y7zHI^$JS* zPkC@i05*NO z$Fe`wPO(x#VJ($Zd^I?D7J0u?P2oX8NF)n=>(v=M>TP@$tVB_9a0TUh>AttQ{UdJG zAGgl+OO(s%TG>7-$+m1`vOZLX=*KChYU8IJiw5xdjkXdJr0Ede>&RK1)7%hL0UlQD zM;*D!KB$`;cH)2hb=#ms6u- zOku`HEMmXKy(tu7kE)Jc^DU5YOHt0i$U40k>srK7zK+ds^R!4ZsE)%OA&~l#pcLy> zrngVPj0bX7GRGn$)|QAFGDM9_^NW7+H-1Xkf!pdF@l{w45 z)%r@e!~9&oW&Cw3=mE>ntG}elPa(4HoQ$sbZz86RU_HWj6F7N8aJDKd5EC%v0IuWF`FW8MS}NA^b`*R|0pWNK(`IwqL~&8Y(a;&L|#IQRkJ{7Q|mA zDkh|5k&qZB&r~B@v3(N7iM7HBwyz-I#%A?zj%X@2LgKe3hBkG1p*&+ZJj z1Wbr-QSSFqNG=?lSaLqouBMq!{b%Z1z2dguV{v2^Q_EN2L-tv}JC{gY99K`>sreE{ zRSeU$DtUwV_yX6~&6Db=@Z(&=xu|F59PI&=G3Uosqrwn5o9Z`<$&VA0C}_xqjM<|;vY^P@mI z!9gP^{shGmC~n)pI8z+=7TCx7+er8pT-X7(U`cKqRbMT3P79y4Q{*W)<~(GJWfDhJ z;{5Mw#Y&eJt2HVz3}cJ}%c>4FJ<0vs(2oOIcfEa~~0~uv#luyNW)= zW%PN;k7aM{+HX{eHuaIgzWFH4sHpvce&8qMYx=3DlXzYV5B<UTgs5%>lhUFCmc?ikS5Q-QiPuAe~q``yve-v#!47_j`GVe zF%gXZr8GFlW7FK{xz+7M&|00wbp_Da=_G2`d0Vvm=lY>D>Vd+uRqsMM@7c&_&zR=( zJfd`H{qdr_AsVbzLW%Van=HU`!7%?RGJwm=>E1h! z80t>a&o9s8as?Hd`%2hXFpByZnW2?qCMcB#LUR~0s@Tb>%~i+115ltK6N?evpf zEtYq?c3)=qh-(t&Cb{gHt@^*~oVOZHy84(1n1JhA6pOmP)gbo>Q?ai-y!)TOhLo8S zyDjo8(>L_7>RBG&;5jwA4bOoVBb)FgjnH zH{N>*u=w=Q_(h$lo6`7mOnf96>GJuH2cALLoP^8bqMVCSsQAZ2#1XbS)9$qHBQw6q z+QWtevvgB^FqIm6*Ttm!9_o!(PE>*e)f@(!#!@n@6E2_9?8@G|KKgJS;Ox~Vb(!V0 zpT*xjAuW+{A~oV!JQovR6GfCmp)T$BvoDc&FNu>-)Tkn{l&WP0mHw?((dQ@)`;!Sp-pVz#OJs*I_JVixg)xF;W6xk1)H zaBLi1Bi}uM-&;+wvD&N-Lb-o10|j8S_A>~Rq!Q3W5N74zvuwr?1n)XDI9O%3 zJ5CbM+e{Ef?L0Tchl@xHHoSW;iMVRHde5zt;6-29L#$J2m9=f@AR0{?H6+Cjn&^t zLM=q-AlVzvAP6JZO$$hPu?xu=1?iXUAro@AiJ{92V#CtHY58Gi4eEoFCS-*Dd<{C8 z2X5t(F}-(l68>xq;CB92|o`@IFJ)pXvO0CyOF+zoppaUOo#M>0uhQZA9z}1_K{Pub;2M3Vr8+0h30>F<`c-@MEWm z`D#_tt%_CW@g|&bB^z6AZPQ6JTh;&e9#kr47PR<@5qWS$Gu)5epYk19v-pZ&fWuam zIBkh?>vp7#ag9@}g^^->>Vjj_ZSVD|OUCdmG9~A2z~&$R`v+kIABRqd%sdk1ID3_h*O6z*p1e=%xXh8ud z1SMAPOuvx7Q-CR{w>dP_;;&O45-bFP=#Le7GnM)XZK2`sLQfXM!b)%V#@>LOQ4FR= zcw#3U!No3h<3q($=n<=OBGhttXgiOGAN(HTSU%w%Sk68JRJ~Kbox9Ce_cl2;T1nC} zFKK#4jVG@wrEhq$f4Jn|DVk<(9Y+B5s-tEs;8(EQSPT8l5U)*FWk_AK_h|ZY?_{1f zA4L9&9J?bUmC4;``?uDh1Zg_V5^++GxXv8)!7SNo)|cyj6YZnXy1FMTD|>(DZ>~ z3k+|G>zJQB#C&3~xwTn|tk&FMjy73_7-3d5{mn7z4e+{%QnBkvEajKhzw~lmZrgDg zByfdE_#i#J#7>2!w_$r3SW>cKxR6VFtgXF2?M`MaLC!b3a0hh^Yea**N{!L79WgoB z{KdE2v-~rK2jVdR+(%EP*_>|Z*LVGtEj1+UlIW`O! z_(9f!{mkOc6mJsp>I-Dty1VfJ+JH}DI1a4~mRf1ER?t%pBy?}4-y2D~zAuLNhXveM zw0sDFFVwsqvy7NR;Bjk3k3BG4t-N6GMs@F+e!d(YH*7sh0jhbHrktr$xP)Rnh1j9e zq;^B!$aJ3x-1;w9Uvr;Jwys*rGn8JTl0(fc_Q9-VQCz?Ux&?*F4>8P|Yy?{;jxuzwp>1aWLSvlo0)jTs9!u z@d8!RA78y4Yo$#Q^%)649-Xy(7uz|BDOJ;6dFA4aE<>av zG4u4r8fbD=c@`iXrU<@_vYAef0yox@k`kvIml2-6U8yjoH#7KE%|J>H~=|( z=_fbq&-_XjPlx zt(VcoY9i=^UrJ*gWsMK_(3UQ_wm-9NaLmRTRXzJ4u2O>j@c zajz|9#-ytnddeeO9MR2IJEKLnaWJU0Uf@e#l`M9$F8!g%@K_)LQ3&G;C0NMl-PN99 z#xOZlJPs%`Ff2t&Yc)84{rbf{U0znKYZxy8%n%UA9aeBeRj%NYZh^X_1ar~Q^Pz}< ztcxdn&NCM?!nLK4;_(E0=QvZjn)LRbV!t!_lcq7uwf6T$GV5-v{lMvQg8e~jhnQVa znfHWrwY~MM_@s5+$uFi6oc!F;+wE)D^@rGO{sp({==4Rp3K0gE8Y-5SNey!vTlkL> z_fC7=i5?S6)X=j2z^A59HWKV}ja$=gRUqzl{Z)RYc z0o9Pd4JlG%y>O^{Fb&htBKvHL+t~i{PHD_H3)9cW?|2Ze8@|1mYmO=#n`S0Vvhguz z=>sQK_d~OG?GO7rz&ROx$Ba_LyP~# zw%#+h*EB%xMqYFBb+0QHZn0$fAp{|BNJ2g}F}boGOn?eTPCYSZr!*fDaUt75DJM8E z*4%F9qlmi!8lFW+uvUrLJv$`ux9T_KLKE6V<6h98T%8yi@7^(++{iDU8t9b`SSwi1 zbBzcoz+=OPfjO{9OoTqv{-7XAVjqSX7y6G_zjcK zzDGJ-Ib)8DG}Zr?wjrLmrr!=R?ddzY**WFcW79ZymML{oCr~O@(c1sXE#%p^ZIgj} z%|B|dLjyaje)o5m-fWpat{`hYrO5z`CXgaLPk>z|MG%C{s?7HmDD^dEv25f=LNyj4 z($28yK)TDf^=Z}fpg@)D&eSJAW5+S!Md7TsM4u$k^B!o@F8zqO8B%a8 z$aL2uPsp+no?H0Y&?H7Va?|QVSh>P{#LM~Tz0@)r zzzp-6_&pzeIW8*dtN-j7>`(S$L0_NyfTon>xIev6f9L|v@_*P(*Zi<)DYXAM2CX*5 zOyxA*gVd`?p5=gOK|iGUEbfqZbs0k_{YV#>T;F%Ne$rwt)+G@P360)MGwp#p7oihx zrR~vIRJ-99-^}sGgg=0kC$mnFRQ67Y5={84T zaWY(UYTCJ-A+6+(LTagyblhr~?I)#hw8TZ}_Xl`9FSPnfgWlueAN} z%>+O?f`!BVo)hph9G>)wM?ZkWWkL2$MzL`A*5d=;ixoJ-kGAVy^@@S1~oyWVO13#~yH&-~D$ z5;bHwoM#PH@X56H`!M~nM2?7l^N~MQ(uvb**Fq|vM$mzig_yW za;C5Pf`#`y6lK`iXipNJc*ZAr2P!q@xc0n>W9*8%A|aJQZ^pvf*_Prw@m3xH-QVYh zRzn9}%Pfm!`d0xY{zZSK?)DRSj*R-_hBFIX>8s5}pI6BgGxpA!pDIBFzcK+ z7Et$3I5aCx6W?{^1~-iH2P0q)PaRYrT=^F`bOP|@HyP7-0jUT?8&&!z;VC_bZp(Ym z(ZB8QA?yF!x(-e6aeB7|H=f9I+B>7~A;){v&PZG3xa<)-`ka~8GkHq)PFjiuM-Qr; z@Z7Ok`h-`!Upi+(_jv8A{uV#2#pukhPbnN*W3h1Hdr@64hD8DuA~aT&%^0H^>jGqu zp?44E&9ymcGWK>T2hT}B#GT0JAdz*9P%P$!!J~19RnkFeJ;eTUZeWb zsoNu-J@2W9TaFErm&tnLRxFr-z^8h}VqeKYbUkF^SyKAnV+iKxQZ_*o#A^*<=S2~p zOj9J!Jf^apu#e80r&$~SEBJg~q}x9qE3z)wSvyme@qocQ=_@AM{>jpO=vGbg^@E@q z*(>qyK|<~&n&=1%L3JKsF1kx%iJ{0X&zek@q~PON)wtS69Ku<4m2q*cacMf6g2_X^q!F?V(q3 zO+je(5%cc#OQl`%3aYTpdzy6dbf@=&mZ@W=Rk1MhhKj=^|3^?AtQy_V%XXe~&1JOR z9r%hP4lxkyaFvIahfzJEYisfK5}!ncmKj{V&nDdtO$F`Wi7|XbH2j1{gdGq}zdEX* z$cb*NyA=Atn?Bf=adS@aI+#BOasJ+Zg&Yxj^>*W0&V*oRELHGB(uGkyO9wq!Cr&G*IN)Xb7UTI%U+%ri zZbgPZW%pclTCcf3UvW-8B>c(#vh`nABky^l4LO*uKFu`^ub}MJv>QFki^iu7%?rcUZZE*6jwSv9p7Ce<9R{5F9^k`czG{a43&H^%u>-zfqzuAA_^rtyyi-IjTkBUca`+vot7Gl7>KTT` zD+(Av_z`uyp7v(`WLe6bH$J2P5Ed+wVeK7d@!d&n+1|xK*t4kEsoQ%ztz4wf;*tq* zu|+$o9hm3=NcZNh+08S4y>e-qdNEn+-7=LXbn?fW+Gum*Q+Sfm4pJ{r)r#|dIhrholyE7{|GOyLCSVcGb+|$!#nz&cPppM^X>wg zq1t)pq=66W9!l2-J#}8CZ|x`yd3>o5{f+<#A$uD8RD|wYX{*L}7rTwUK|D&z!*N(j zs+bJ&l3I0C+LR}{4CGoUeu0r~@#+e)>8H;}dRBAvg~1$05n}R+p4&O<-V*{xz{1vP zpKeUn7pFYp)KAn>C}u%Ec_7~zk{HwO=)}J@?bN=c9uA#yTK0LCWScAY(mvz=jelXp zvC#64Y|tj`O~28emEH^g0V%yaGzvpS85{IF;2M^D{92v|+}_xz&zGF()S?Og@>wC%j8eOkL3+Vs0w`xB4YN=^bmpshW z34iXW6T%o z=_{3l<}!+c_0dftwU&_T^a(*AYGBqx5dl?sx*cbkb9DRKW$MOc!6L#>Ejk+JT z*7NY()0%m6@O(os`bEaFQeW~}Z*frFC*vpkFl`M^cRit(m`Q771r8ibk(1`0fc8X3 zA{KF!JYh!YCbT?<>}eiJkrup};N`Yw?x-^3&;zQ@w#d;*%trJ$Jr55LD^$RdfjgzR zwq6Gg&47K9UejcLn$)>d#JKS`S5mdzSGoz{9M{cME#i(^Pg!mcdj45T8blteV`4M& zfa|{_()C2=WC~Nmj}QZj2H6n1@o<;(P4S%CV-1t@L^+YFH;wWsIibicIAw0Ml}P53 zkUrkB#%*lvv5EuMy?=|=5unP6F`>#WeAsEw%eCqucfR&8Q4Zi?cLe)pB`api8m6!= zH!yyLKT0q*Ugev9-gN~*eT;LH~#QtR_;qD z(L_+udj4{G6~-jTO_usp&|jWNWnw_6H^!Zh=1nFJHMcqurGHV5e~Jk2`P$WFTISXh zN7l~MI_kqp>$#^k|&8M%8a^XWD-4 zuz?`6VM!`P1rJfNTJX16fh1V$43BEpUfINopTeT)5X-f0=}|$b+o7Emfo6_b{V7 zr!eD7vV+2w^Lza{9%8h@=eJ3I;mG&-3T*huR}(}?hcApWOeUz^TS@qXTzxrBqDVjc z^fz3Fz10|@#dZT9#@x4Ji;*UWCdolv^DxdM{hag3*!PI1r*2cr&91jukAKaOe|*e! zm3fX^uR&4h#_uENE(7oUQ!9&d4K(GsI4{DK#SDk6GT`!DQYG|F}gyjnlY=-S0N(f}PA=?a1GN&|r zJxU1i(^`sPrRVed0b>dF5Bjd#X-B`Qt`6@EYl$;a^~_K}AXBrpxp`PJg#od<>$H9H z`lDk@dgVrSd1qFW`94qd)UWsk&=j>ejv>Sn;eH;o-b5+hoaS>8b0Yqr=Qoilg2n%0$P|FbxR{1tf{YkVG%O6BxK$rmhaaGZx4E zVi=Br;TVbX)lsz%(+?xFFuwo02s9lovsxW?mgjS z@}c4W>D~7w`+dV~t2^er;X<(IP5Z@RQOm39P1DPcIdM}9$7A*gg9015qx$=O zOVR<&N&7`Mt>Xcb=p9|N8eu>*`~r2s8N6q@I&-nZ+6AI?YMqlZcuIgIgf5-q!=^yP z%HL7ZD>m&wZ6noIZ9AW?bT;>r{5Ci=K+$VNY)MFHj`E~z#wemeTkrYnu)7aQ5Rq^s zjS}Sz6%1XtPfB!e$ zeSrAK^uX@#0&XsZDOgw|J!?FTlCb7EO0r5ZTP?EQ{k0K6%7ac{SK>Q?%1G@nB5>B; zh+cTyGKgd?a1d4SVGq2*&n!I-0(q>fOz?+N{VU%xIoxT@vLm+DJe9nw?&psIZit>+ z`c9!hH~;3f+eXcR?9@trc(~!iLIR){yQx2CnX(jlNUW$AR5>%lzB16|mk@oh%mYcpNqu!PwF<0P=+CSz zw|$u`w86GD?Jl(+;qz(A1V-IZGP()a5Fa{6^b@+N5)kqU$29&P5SyT=H!e}@mQ5ho zgI&9u+8d~1Ny3>w;0OvEy7ACoZz!zGU1UUit$Z-iL7WHhBEce+OXy)4=2y0DkEsSr zaLf}1a#g2cc7YL$g2RRI_R2mxw~5R2*Hjr*O2HT~@?<$8YSHM0hFYrwt?BJ>+q`~A zo$)%M>LQa3%b+4mz`_o1gGW7U67ZOVjR1>2s2OXRr6e3q*ZsUiwxMiX0c*b3BUxjz zFO@i$6$6>kKqqmnsnE-Hn}4DfMA?5RfwYJV!V4&8V!O(DJeBEMttrW#Lx+dO_d!f$ zsR|)in@4ZTe|v8|1w~K%iDyE4>8P@9U}}JM5UI}s@~lucq)`p&NinZ+(FoZy47H6y zqG`WS!3kJ7TQyq&?N`fwzFehp{0yk1_UY|pTIwWw%o{w_m6E!mKdEwZS+^yMKR5G9 zkI3Iv3mS)4ex>8F4jBj*;Du;U7AOb;l`ZN>=>7-4<*zok~0vf%Fdn4 zP`#SXPQ+i`#W6#5;i>{voXM}9JsaGJOu@c?91XQ8w)IRT;@U9iUc&~3dRtyX@#EuJ zq%(NPM$=k2*yx%UWf}-{gB)Pl`spL~v+bWeesTO~r{6q>aoCMNa3$!BAvHj`{M%e*18MKXo}s#4Mo_CSpAN_6 zjuv%|qM`Kro0`!!G#dsHO)%VpXW1Tt4idgxAjLuUUtE64boef@UsQVBR2$|3pNq-A zCi4f98;7`1W`2BxO6NBXzu#M?cUk2`V0cy_;$#$k*v+z;?Xl%T7cKUd3jlAUJ}V`q zzM0y{C@8q~&L0M_*_#AwlK0Vgl@<@p{65D0d;_PDWmD&IVS7OY^0&0uJy zRt3dg58kUsqKj6b5AnsTwZIg2Aacvw{(#qKgrGDG3Y%=<_o%2SLmwZ#7LEssYHgBh zg4;P6G@fCP*3Q}m?SdTyiFfR`XkhMtMUNGg5}(^n#s=f6c(LHkB;UaKO!9EH_#k!o zi=lXmtt%`w^PDkD5v7S*%pv(N!3~2cPNT|63+01*QR2q%OySs;H5E(Yv0QGmzyJoa z!PnxWJsNO(4k?xc{#5f0S@AkA69^-F5A?3MXFsqiM4JQL97L@gxT#$yg3CefCERrR zJ?^Z%)@?a?1Q7ISXHg2x;OwLbj4{(BUfSaaAn+1EBDQR;g+CSfjQQ{FueMBKINT{k z1w@R9q<_ntW8)J0;h;tR#%XJ1D??kBM=PTC%W)1zdlu8QvE;r0li(BO`tf=?tEV_B zdsFsx5fhb=s$xkBQSYBml&M>~Kq=xVd|f=UWR4m7Va5kw-_Fk^=gIV?M-olJw_*NfoPUvgHkElOoCKdF3UKOpOcNIg^UJ@0 zIejxVW`qw6+4V&_#@9eFrG82g|HWF~T=WZ#w;J}3>_uDb$~UkJCfZ0&N5xgdu0Io7t=gHi)m0@z>}nT1&DwE2R}(yMb0#>^L$;1Ha$(`bYW zE*OAl;|~0U5kAW0uNe4yAFBCmd{}fuShC-TgJBW(do+JFeE+5_u%%-%vh7hCC_x^U7teK z92@iUonO1~w-=w`%f3|SK^gI|K+6g7@8?rWg>MiV7OE{(6LZ4R5U@hkWkd*!7FRB6 z7PVP-86di{M5K~gY*y8*3`a(zFJT%|Yqvlv%NleR)W@f&68Y3ItEmc*bC??y*=h0+ zLH)Rmro$0uv+xoi^0BLJ7xGgHWv3ljU0HcdX`qLJJp>&zMUuf=GC5AYK74f#aX=fO zUO!m9XdHY3wNKkePro&y^w3-}$FRP3<3@5mW+C>+AXYJyC|P7UlmJTBY5W?67swW} z1yX*Wv_bSq@MHTwRW+nWf+g+B)J~6$Uz-k+43|m1Y&3HR9h3L3&i^+U%>XklVZN}= zgN$@!6VhNTTts?^?j1+B&M*Loc|D~Mo3Ii zDBmYx8uGzPg^4OJ2O9}Q+Qo-zr14yt?z?Kd1si4ZH0OLt*ewSs8l@IkL#8{nT|HlY zuh|^|1IeSN76W-CB?AZ~slYCW{Y#H^%KKD@7<|iTBwjB504m)UmzXU#?-7DuIscw= zSgL>Oq+n@a)$h%c!X0WZEi%?H%3?G}C?IoIS0Sq@l29wX=@@OlvWgJMo{4f+Hj9KZ zzLtx@-VKH)7ElhhVtQ_(*+;l0{ZLV@Qp)0+zmleP#i+hz>AH1vxTt8^&6MJgTxV7w zCZxU`5Plu__m_g?>37cRS6wSsbBku9O1js&YI}SO63C@M&y4`j)=l<9CJ8z5Yn)lMKWMsk}Q0Zy)fh37_P5HR|;=fVL_!!NC10?oLIwJ4IGW_+`;PaWx-xypY z>mU`@$`0dBM^fSXyUg#yScb=9Bb)WIE4HEW=ASp<8yXsLWB1oD&?8E+Jl3X#%>Jl-7|;%qObj zU1IkB{2Utd7Ti^|lmkOfDs;atb|5#s54>OXpv)<2r&yscs#$;2nf+R5NXE=(qcw|| z`T!dAl7=(qHWIgU#9<5EAMVsJKKpy{IZwy2UD*foNzHp1a_OmMCtr?v`IJ9o9dG7lgT8jcO1|G*YIBiZVOv^tmx(N=| z%J{>=Cb$?S#c;5xKHq6y$_qd4v*E2Ig%nu`7mSj$RR43yaId6c?mk%qeXzTzdHA;> zeGIwQ4Fn`v*?GDlB8=tC%>Y5BWIpK*`MoJp-_^-{CdR>qLu)pBDk($L(g^)7{7_*( znS=q}^U}_1&IkkK4D1)e{-avlp=mM*a|zjgsq-L&)zt`6d_2A9=!Pck;{#O=j~}tN z$zVz>f)BS~-l%qquX_6T&xr(7@$l4&BdfoyM!!OT~ zrIJlbmE_(g-{DdQWG2NEgJdxqVbxmK%-&&DjGeyLJsK`Fc7?8surfbl1cZ+;N8<9Z z{eXx4FeH;En>x~q9_Ode+Hn$4N`Rc$L(X_#Zh+UVz)cUpqC=Za3#j75|D?DtKuyZn zSGj|RNU7hA9Gi|DtQB{^bH3^7;NwFfrE|-h(EiT3IHrkCv6YpTcI=f=YMn^SJ_ZgfBZY~Q zWAOH?Kg-Aq+^4YRD^@0A4t5TB}@JCHjZ}2_)jI_IK;GcqYj;PvsnB zyIP0X)cv&n81w9w4!AQ^3&ktcrS^*kxR7Uj&Z)VOQ`?(2)?3)PP1Z($RNjhqeal$s6%2^Hq-Jv#L_sYdopsyCA`3`u7OH6^JhR#4mV zLvvaSCdgAIL5K%Nn#W;l+?UZ6#Z>FHV1d6xS&JTLEovU%IvcA%l zzIeDdsn6en&w7>xA=#glooRaSZ*7rlI6ERtB;{bJLTGfED?6EBK#_w$okHy&6AWuI3ytT=gFri`M_Cl9`!xx+fzteeW!@0ue5oyRnpwZ}$}0j$@7FntKnMOod5P%G$cYjc+F4#+t9d3L`uzp z+AwoHZ}K@xku834r&a1GECB-;W2_a1SjkVfqjAd7S#G5_Xm^ljQ=x40??_*Fj2Czm+H+}OQ4y>*Vi;?bb z4A9EUQ>}T^S8X6^ai07|IWKd3r&hM^^rws2Dvr7!I@Qt{q1}gSKYcYQ13?mVcmX|! zd86L)rk2(IAQ%8=Mr~b42~GzzY%~W*!;TLA%HXZoEb*ay0fmj!y8YTq5?jcW+%#CX z@B=(K;15;QbmL#`?>XnKl-#x}(Q*SIHo0tvP#BH`~YV7@hmR2WJET9F3Zj5zY5caACJ2V6;ed^1hYY$pRA8hAL_Gu zMh+?*^a>h!MV`;e8c5e)>L)Cq-0(w=z9mWN^q1>--wmw|>1}-F{*yh5T)^>p&6(P8 zc8f?c=Y5gK`?|*Gwm`VgUd|%JQh1e{FRi=^?asRUNWsoiw$aru?_nVy%^d?(myhh8 zl*KE(ajE7fx@k;pZQZ44n9tLA50BBM>1{J676SvrOKSH`tqs_+=WPD*FiU`k+nN{- z%?yC%Oh@8DDVm{5QMkCYRA9Y6j|(UnppFdnj%M$L3_pb^k5gE>MFmJh!Irv2E^LOT z^S-{Nxc<`NF9U;;F4Qb=J7z5iYSud*HiaJ`LN`dA*Gax1A6(zn(?l;O3=W)PJPOo} z$67B`&e{%NU(9&(S?481BS!vulsea-ifc_t83qyZ!ELaXJ*E`l`+)pimXqdnYQze# z_&=&a8xY2=%B@e0utLT?Yc9|63x1@^fmu*2l9_}Dm8p3CLLCX{eaegY(!IqjMuLjXSFkfYgx);OZi=5cH>g zbH*QuqvnaOftwZy`)RC7^reB5M=wF%>-2$l%JSN>Gq? zrTbpA&ES85SYyaE7~M-Ykux%}B?h+^7{G`DbLnMG9E^m1goXtt{Y5ZB5yq&y_yDMf z`%=fYoEQa?Fg4wsNHFiAkkD_M>DrY@hDsOWr`eu?}2ikY}WzstZdsmS?yn_A~(KT4c_P)aEY1?BY~ zhy)i`=CFXQpN%=it$z|Wa}QQV*dKC4l+D~MuQ3`6zQt*zEm&`NsaRfLk9)Ok)nkaz3(5wuh_GEl!|!C=42g>ZEYdx zhBnNEupj9JpFdGKxy{7Nj1^&RF7*=AzFh2!#CGqn(e1+n_c^NfGx&M;@Nh3GstJQN zVl%+IJZ26nd!5c?tjF4#&ivj=6UJUm2@ZEI>J1bxhEylG(WE%AwX8|k{qiKN?maF1 z&zlYJj*F{IVA&;SHQu(I=x>%xPiLq0dY4zn-}%oTV92V2ENgG+C$TBi&3VK6-gP?U z)LqQL(=Tcr+x$4*9=pF^W-`eY-kf{^typ3c{q(pnrst5*@*yfRO+DPT;J&|er6>VO z!4W4hlLA-UQv-A%-h|Onqi<~japve=Pw>-ZJF3sZDJz|-;zpcfYjE0a65 zk{(1r?KL|bh_Y6Ue^^S0pxJ}iyn#0THnr4zQ+IY*eg;H^I5GkQ>|{UpkbyoitE`Kd z=BEo2qjRaQ|2i7TlQLq`+p+DF;+JxilM`%XekV}Q`CwCiv-z`DOzs5)FtA}^V@F$9 zu+0LJYZV7&`X`>qg}(;&70@3Cta00-u=eZzv=&Ai>5=)XJ_i*en#;=^Li&Y{;$wF4 z$OgM*$?`CNzbs0@0^ib>H@f`Ltyx+~_vcoWV_>+REv=ff8Cuo%Yp6L=MeeKk^Z8qi z#y=rLfQY2{mkKVuNlVh!Z~WaCTuk$(p9pWb&R+~p{24+582SP!8}D5nK-(!p?#_mJ zhQcsGh-p8@n$p2KL-3`*Wa!5hE!xmIL!zzi}KC zIU1Q!S_D*|X0JQv=!?PiL%l%DMr-$btmUW~zjJTo4D`ee6v)S*= zg&TrD>zQ45az1r`m+xX4-om;e8nAj2Y+>b9@foH}rG@Nq)MZ#QGC^q6(S zkgw!~?~R1-)p~B_dTvJ!^cP1@6xgQ2iO(TvmT;`|`jy0}D=-rz45=1v(_^S>k@x@r zKbRLK3TX!2x1VjH705Wv;*a|ZC9aP|*pcOirpPyip3$Ywc0Ul##G3I960z*W;Jtd)|`;kp`7B@yg1gYNNtGQXC7 zLh`ZV?)srMtbN{uI2ziI;deyIhN2Ayzv*)Zu@)f>75*^mTJLolt?)MT_kY%=lO!iM|QF3%R|M0n$dI0Q6N4!fmoZ7(nokY}NKtFW~Pa(^i$@XA>yyxX| ztT1)U+0+2+@1w)f@ojb}uGepwCnWy=K_jPO|09;kFJbpoo#53Q8At@$Cgm4iRkMh= z)cfO5|6fyhf%0mQ32+HT@wYPr9!3$lY>czxZ8x2DcXV)#5itw`a}Y*`!go<|CdB|G z8(uvLnjx6iOrhDC4I$LbKNeTc{ulJ;8LfQ_@if%hTrdVMgAi+=$_=xJ$TX7}ZhA~w z8r#R%&3H{*76RaqFbe_W6u+NE@rJ`T9Jce%<4^0JkD~UElw5{w@?YfkJM*rN$0j^Y z=^@aQalHM?puOGY`dJ1A{vW+4N2h!=?_zV-Bi!N}FJu zuhWpuVc^Tg@wW4D!xM(v`RD1SW20DQSPCfDGb_Sb)^?473&(&~wY6EllWuDWVKphb z@?)Uyk>(52%ndXzA;(}%aY6GUYW6r14lGiTP5*8uZX@J%2>l-tMatTo2L>)&h~2z- zQ?#Qqk4od|L`Gy7q#KVJDgRybIL>~DMdUGm@;q{PHTj}44yrfd zG$ah^tVmJKbCJJVj_Z`e&ci4}jX0WWn&NjHHnGvLftWQ};A>N3;Nmcl+D0Qzlxa$E zEibJU=ofl6v*8vaXgu1QY@JH4{@Z*ehVVJfC)miL z3{=`#i?}#U)FodAZq!&=S?;8@FBW1GU8EjTIsyq|#F%D+sg?}hpU@27e%pp!WIJEO zF0vP;TNLKBN7a$E7~4*FQkw?G-2YJ~uPdmZwO^#a^XnAlFPN%_6E%ET0lNLCQ)6$3y@EPwZ4<0={ zi#qlpW8hpyV!!*lzuWutr$7Cy2&=cUveMCM>8Q~+mY0{OQmw!F;)^foF!*$uJ3;^= zg%DxV5F_*6_&qwwiI{lO_{rl4v!HUm;1f3nSco4x&)e~a3E%^MNSo(PdHBhfXJcc% zEN_2*fppZJ5thp%%*OGYoPqIs5Kdj`ZKAz7;a;!O>%dgxnKKHrbF7`IJb#+kUA+)K66g|4y zL%DnRPO+gG#@9T#u8~^W|47>@CfaYRdxUyTjohRl)fkJ$r7VSlNK8RW(zRP!Z;N&V zPg1;|X;Nnt?0Bm7v3UCDJP}ftRh)|u`{+kM`ktTrxu5$9;kzdldNwq}fVCF3CuZDi z+`ReJ6Wpx@Gq*s1Sk2sF+7>d4rqzHWevxsU^99EFQV#@Wo_}8MqWq2ubN$e)TwPs_ zhLxvrJt&8#TJLInYLH2|IgWZ`5MVAZFN1t-NQ1C+IgTUUSdAEQ4(ejdOW636TEEjc zuiCCLaMl>`LA|jYn`fRW4h7wp2T(I2vRTq~K(}6ax%j~!{8L3ogv@<;x*$)Qi6UeT zl6ul=e#6a`;s@UPrlQ;5l{&rnOC*<4R58%BqSnwRgJL?^5z(iq^pQGh>Q<^jNXe|B zHlj3`vErF-L?whar1qkmvWDhL)%Lk#;9P{580HNLuQ%x9w;%wRqxXXihiN22xZ|)P zTr=(CV8v;$ZAg!Cm~F@7&%^A-K1tcmZ;|afIPO9GPMh1Vv-4kM1J9GcR|*rf(4`eO zIe-x(C^Lw7wbMB^8DV-`3>^kTmI-RB#=yB?U`~$ zCNgsK*1s|5Mj;k?n))??|Q#K+?MdSpj_NwVU z=(c1bA;iMt012*i%Q;FKnr2ic2&_i9#cSeBsyY85mcOu_NBM3DxV&`uS{YSa7l?uL z5@O9XedV5fQrJL{F*D}rG4NofZYFvhW(2djlWvJzIgDOzR3cxI;h6Lg<~Mma?&_VqDLb$i5mC{<0xpnsh^gF zRYRvl8J_8L<`P)qVsutDz~v@JXbOuz*%kSggVyeI#=v!!XZ8< zprZtdVM(_LmUuroZXI@zO-LGPurm-gaQOY&0!{-M4V|K*kNb_ z&ajK%9FLvnjo*ULFnM~y&cam7B~Rx~eU20FdQ@TYJFjZKPUCQ=&Fy%_)Gh-YKVIjX z=bh(QyK4+w77Un1tD`As*q*9%9x zkZnGqv<&8IbHNyRs2@Qey}=_@`XTFK7)D?a0mOp<>u3Xq)!c(fN&+%ofIaL1j&u)d z@-oN^|5+H1EXmJq?A-0L^RTKrPm{wRRY$`vw&O*!y3F6%@Q3Ap7I;4_|2nS5zzhS7 z$f}PbIloiQDee6d`39e%?UtmR=s4ZTfE#1lW@GbFCbEj`Qu}qgEc1DA#&c8!>i8ou za3&+MFMQz(PyFI9{^EbA(!N{!nk19jIuEhe`0$5693T0!pZ)B2UAuNI_Ir66kx>|e zjC-oIcP#cjInE6GI7||v1>OR%`o=lYISyD8GU;(s7l#37nB&yJ`JTki%UYDq@va9j zu8ZHvey1l*)c^xL#_`yMu`WGTZxlEEfB=&!vGWJ+pjKKfyIOATuQBkjF@U-}bciw{ zbQ*N7y(m4Ja8wW#Zgvzw{pKGdtfm6)XSoGci6nnhvNr0r*XX&g*mRaYYgNV zfOcrZgE$9~4p%xLfH2mwIG(PhJ!I3NI>g$!KM_Acj`J%v9k- zG(Y8VamZhJkWU;r1u4rtDMx7LLy@k`gVnW?e&KUx!awu(t=%Wbz?pmmZR(wtqo~w} zQICZWT{39SMhwPDm<@3${%|H}_|w=fuOzz2!eMwEo(Ozik1EqWP1$)Gmzn2Fn4cWB z>dw;;SM^unPwbDz?M^^SotKetv_IE)pEl{V4@Q>IR7K0~PoRrBF#(V@*h)rGVG|{MxLpZpyMQa{O$dO05!*OI= zQ{Bk2HW!S6GZA81+v4n_+3?9k)^4MTNG}M*jkFdvf8Y7YXdd=(Tsc#=+xEjLaeuCq z6^uU%cKM6qGO%-Tx-Q2ltok0uNmIkr7&tKo%Kc$1J9OH;VrOqxr`7MovI8gKa3&(c z3!Aybo>MiS|tZuN2LAGoaV7VG^dey=*g znPcFLdJ-sTq^!E#b|`C5Q=deiGd>dxqcbae9QIa0IMF-uXyI@>&&z4^Fx;+#!>Qjv zk6|9vcA2*G{PHlnvF*-orF+c*4{a zCA>26MPM>##6O)~ZJ!1MXYvswkQ&2bQlTFVIAk*o%0xFo01yO3XeA1W$Aom6NRB*E3`bTv(=(bv{) z(d#b9afc&~&=^}Woye$aeQ8O1zyz=L-nc(3PUe^tZH2WoQey%z9kZr^TPSLzdYaaA z8#iTFjbRjiCj7ISf9*dR2KfFDY(!kpP-}H{x!B#^jSt^Z_XvT8VZ98YWg$jbB9QrL zgRn*BC>ypC}c2>q^x=t>eaL2hU`}4RwUG8?8!))i5!{m7r zj=$Q|q?{-#PguKa44g9t7>R9cY)B!aQEYAQls7lPKN>|>JZ5cqMbm~wu`D4qP?O!; z+X-P7Yh)-P(u^g@rg7T?Y8hIem)7D$5mE<1qA9QRQisvIS}F}izp}|PrSVc+%Ao$e z5Dc7Ji0Oli_XUY?vub;3soUD#-o5W7*asF@A1DSvW(EquVDKMijvG&}Du}Sm&*@wq z@eXr&d0d{>?kc>~oz~9tbJ@0?XSM8Vyz_8)-kWqDi)`{WtZ@;j5?=7r)5VWCbKX%_ z*}xa&S%=jacyJ6Pt=RhqHHj}=zy3t5d#$c*sD1B9xnn6h$8?aji>J7E=XMN-P_(_a z)F|%kaT4g<#$VlTY#!V~X)_q%^wA9q8{P^3}x-u13`P2c&>cMc?^wmhgSK)L?P1udjz7D?fZNO_(argPKHeDHpr3oi_~HZpXV!{EQAU zz&JjKx7%sX%BHORalWpDUQ=gRs$597w67rK?ol`sUXa zS}ltipOI+0t9$ka!@Z(8+$lDu+r^3m*;vCgQM%f@Xj;l0BUq1A^P8HwL?wSJV&_DB z&fsXW?#8^M;xPz3t{X#$#dR*`Te_1Y0P3F$#lW$In5GC{^O?_l=0DKT{`C-2xu+{W zpoBm}1T}s3*=ISKLrgUh8_X4E$wp=jX<))FO-_$=kCo%uasQx(eEn4Oq7F=Fnu#+S z#H7(ja(jKwFuAa>yPEHV`Y9`~Lp49wr7ENd$Jjoqe#E<+JkQk8P)pY3fNI-FuUId@ z<{M680bI(;Y#7zOO3~fmsGf4YLLJsLRTH&&G=9KOj!)di^P};Gm+vjuY>#22G&e{L z@dZ7*{Ymku&wjr6(wD!^7Oo&wh>=cKTS;Ck_VV_(yuRp3nS-lV#u{FY#}aNGaTdPc zq+9g2?r5|&l;9Gd7&6x&pCl8buTGjwDn=4uW2M)8O%yVgv>P#;qlsvVUkf5~>VjIL z^S!VX*0K<=Fr%R($WVJ_{+j7SMmI2DZXULd=$*0bahybf%`GQ6kk#iBTgfqR;QTq;EhfO^oDRj z+-TN7q}Lhti|%Nz(AZ2cbdVLUKhnczBy30>Ch`xL)bRP6ruBLRTf3>-#UxA-cEOh< zVB0E+oakydrFq>HJbG)eEpaf!S#2&D1IH3#nid>uv^BK4D|NPTLNGD3_lN<(5<`Mdo1IIs zhtN|ZD7_;%O+thKqn6`RQH_=nCT@4Or?xK&1IH3#ckbMoYUDMN5Snr(B9-Ov-rTU0 zp3zue*MKv9hcH8US&$*vc;dW1dO9AN)j}*sWXs&plob~+8MDdK z%wcO+je)bl02F9JVZL!t&T%AS*+~WlA;_s54GA{VBF-XQVkyRC#3Q1VhL~7g5Iv*q zIMhNJ>tDoAW0oj9MOXQtIO4o$6^z;%9Q#q53&+5*gqT!ZHE2qc*3v{w(}JoxQ;G;F zo^+NO=bUvF-V*^$L){)>hCyiY&^uzoBE2L2G%kzy`sd;>pr%?eG*cF__1*Y9_XAYm zYj2H#2f=_kNT#tFy+MN#DC$_HCwv4%cAlK|7?B00tpRtP_>u%taiim%PZ zVc=LoOg)-`lsoRp7ELf7Pb4Sh08VmdrLcw2L@G z&L?mu0hM~v&}CC|eRR57^sAH&gD&QOSh9k}q;9v|>a4XWMstQb(p94|X(@J=iXBO> z{upgYb-a}Uw>vPMIPEU)4BOq`>TGn{!+}Jd&em&4b9byG@Y}7WvG$dHA}U?~Tqp*P zCB)wLwzu6=EkEL#aw11(2I?)n^ z+Daok&R_`bcSIt>D*?{b_$AC5l5ArwZT!xcUn*YSDvC`hHtIM=K{HKQ6xvf=EU#}A zfB)A%{-3<%EpPn-IdH_)-1Lio@`caOy|wGYFmNVZNPEOk^oX%GqchgX7@=XOqo>kg zzx1F8!&sORmXFdrLUa6aG2`A@6+RCqPac~*&S4j2=k;X7~m{K z=qqVB>k1Vu!p2o8u!)%FhDAZY_+vXyz)v)Ci_sS0?8-+gQE)@0*GY+*5kxIt>GUAl zc-X+KReRBI@;6$`#dK-C_{LsQY)O8;DnZ7BsJgYIFfEF$UVoay9cpulF>tJr*irSD zU`mv>0MHEAHcSz>87c(q(O7O1&I5dHPLBaP4b~L(Hz2p<#!h+n2T9wMoiB{E+Y(ZS zZ?`qcqWk~YAWi3lqkrz*yBDMD@vvUoKK<8uyi?M$IUr%DujL2b=G2kkf#zuQoKoK^ zXLX=o*4Wt?4gF!df*p_gF;z&1i_Q6Mr3Ds08}>P2Lx%045pX0h2< zhg(5o2|;z|q*kx<7ny6sw3k&K9rsb2OO1gu5n>`72{DvYG4m+_d~+d`Mg$_4AXEz} z6D_b1An-g0G+=7;U>L9<@^{EP3iJib zp{&zxi*cku^@CNgPW@P806J?*kpk|~Oi0nT;d7kv8@_k z$!LS~WI7P%87MDxkR`y7SS@K7a*P_M*2mFOaxpT4(6J}lxZIK^Vo&R0TcUAav4O3_g&AGNvc7&sRx0pqk_!p-OaKg<$?+kOO@g_jxbWk=#=uAe&z#=mh*odf;) z1ezTT)7Ft-8f~=hc<60Q|sub zwickI&dvq8O-{{_U}@-SYl@rm3t4A(ADL5tFoU7y{bZO@>`3_O{#_V}h*^0=hb*nR z&)lNm+)Y|~ZqW8XvkB0*hF(QKW)`&kq4hFdFD28iyJ~@~%lmUCLQG#;WTS3O7_!`- zEsWG7FXF@><3U>=LB)e$Ee7)ln9puGxvT3>yCaZ>@mZ)EGE61{j6G2M{K#k7-3L+^nrLlA`0p zNDR7Vjf_JU!mSdZJ_cQl5qlche5|~*-o<{dmi(NP*qms)kIqlTE)?I8-JB+WLwQ5l zDp{x9D~;L$D{5*PQGcEDI-L%-O1>6B_0J{5z?n=Zj>n<6df>-46NUI-p7tZy5L(_S zZGn~;Y$Bvfh_fqIC2)zs2H)V`c#er*Mp?Q&a4H7EWv0N46xLl@DVDY9J=H1UOgA!I zra4Kqy!qFoN{B>arVh{ph9cLdZwr^0}72!k+AwbxG?Tso0J=fQO}MZ*;rOvNn8 z&E=;5@E`ta@z4I*x2b0=QD6XC`n8Y$ zda=7LbwHW1=Cj#X$~5ChqpF>~bo&Lww$xiH_TtiAcn9MrX%Kccimz;GM729AR(hJA zR1|dH6K6wLsin-24HiHmApcI}5hS33cY{*RRJ~g9cq{;A+_VPJ~azJorxk*QGcIzDM`=uxUj&M@k#NNWV}OOJUx}b96pg9#QMue^~iB z9By9ZB=FVrwSR_zP=lZO4tE5dwYgjvI1?eJ4=p<3#OZVe3+l1WCd2u}1Yw}` zj`Ha&yVEIFFch97z`VrP6ak|u>p5`pz>pSWf6kyIqW;;30q|p-5fSSR`c~kN1`a!D zp}wrHYl2PRAzHFNt-7bd9L!u+R@aNR*33fP8OD?`C*L>b3ZU+cCK-YXGD)(F-m%s( zD4R753KIRK^X*c~xr{5dTE#5UCd2UggW^>GIb2HT-)cP)3*&7usXlsHrBAe!!XLli zc?aU~caKkW9|+TL;B=0|DjeUOXQb;=SbuHl<1yRPmL>+O>}{r`HFeE*gTe=4&Jq2aJWA!)yC=7zjqj zCkbH$r(jbvl7jrSUZ!6JS>hrreb1Q|5QmxcO-T#m5SIxjdFn5i(fz6Cf+?+;viUU< z((5k;CbWT2YeZbiJ>_&z-3U+hNO1M$s*E@pq+Z$OxZK zP5KV0bHdEsq}*!=$#HJ46y{_7bueP)1~^%Iq9jSBm>N{jIP}RBE=|V4q#rz?t&VS^ z4b3RzpPThGnHgP&RGT*XBZ#UtR~Z9mBE&!d0tMk^!IgUSi3#E6!B{}qPZ(+PaOXiB z#;|!fVTnN|nELm$7@!T8U0B*P->Jfgj>_4+dDu)WKqx`VLYxBaNBI)tN&F%SLENR^ zG}|)k1yD zkAXSIcz~)(xIhR&47qTDSP?uJ3!;4VWT6Cc@j#TM2_lbF>4$KqCk?Rpt8iJ8+Ib=j zoCO&y%0q%eJ#?OQ1rGuV4OO^NVpE#PlqeC5{2U3CY~19>w@%+X?c))Ng>Xu7rmbVY zY6$6+_Sk7^z(X-0#X*T1J&dTbrwlE6OIi}ph?!B?P@P=b@<_Yn8D%kLIMzrF)&cWS zG~2?$j1=F|s7lLU>IbDjB^3Zl@yeb4QE11az@bS&-IieWUwX-}$#nQ+o32Q_u;IFOrg{iZQiB#LS2Z&8C|qpp=w;HXs&OiRmeUdj9j05P|_z z=0qCxs7a+FVvkX!$Bp0%4R$fht%bfe((hzKB?^B7xEeHuIac zxxyGY6CtLnSN243T+^~6LJ9h}(2-z*T6C z(-@94wK+Woz%jUm_2{~|aF?I(gqiZ0O98SVrOSw-C<|CIL3PGUqk5=(ZseslK}5vF z98v<&eNGCej%ji-7J9fXtFN4g&o2sxpXDdL%ePCz9;dkayc zr_-`3l|glNMQ745)JEn$M@(rweX@JE=&3W}lXhDYVAO=K+-y&a?XixNk|1OsBYVl{ zz%U~iJV9$15@h|+P&=EUmc&=03j?)y%2;%lE(1#+Ua)`{+|E&JAA*T1Y|cc8J@Ld7 zFTVG^@BIlezi-jpcSm#;mt%^^f>J*D$xr?ppa1;le@Fso#^oSDGfNJf^{C8Dm3Rad zBQf@kFsDu&aCzD*jQdMibw1C1Lz_eEIqP}v<9{r^?>Fh2iFN23Hn}L3*nDN8P=pi-EAlk}WDly{;U0547hDIT!noWI5chMHodr5G_Zi`OWp%CiwO{-7;=lah ze-mG^sZ%w^aduf-;%&FsP@CvOYp~0Tfin?eN4=cR zJL^V|NR)>LqYXj{Va60d9uDIpj;TY=>ti|sfdvf0jBp+nb1}dY2Ml>(EF^Ke9Ky&O z11#YW+vH3icUAR_fX8OHBLG(zm6)92yIaq|cqW9@CKcsV#HE;#eRtGsHl28D^uKx!?gF z;S_lyD3lQ9)zB1T`mVqtlmKGtNjM0xLP||FVTB8f z&PA;|z7*dH=vcpm-sS7Fn^~r#_Rj#0K_Kg3U465TI#7+_cF~f$eOvd0wR8zev)e1~ z_U{$TDi=j~UHv6fwq-1ZX*5XIwRwy&a4tej%ww95pe(#{yu)BPo(jVV3r2@Pqr+~Y zL|pFnXe==&HJRw$1CO3-XIut;750n8goV3s8)@cWUs_8_XRW#JK98Gc9o-Xo4 zQ|dCKj z=C$srP8Iizwfe=1!eTEqg~jG}or|au-9Tv&kll_~>2iUDA3+CPo{qe7e=aPm44yo4b5wi|d!BCNhcc^m%;TzcIxH@S1&(Q- z5E5b(_|a0d!Oyoy-$RTg1Xd&Pzokw`Tg;~vFH}&%q3nrA9_dEjA=(?r3_26R;K)Q` zEYz%Vlf%5sRCdV}8;HoN|p1-P;geeZuKwE2UQyovXr^8~GmU>!;(Hg3z6E`=v z#DLTOp&WPNj`yTKwW;DeeUB8{>vEzzN5ARRca6Tg%R2d87f15d={z8^_;ySuvcZ|p z6q zp6ti*4yxwo@RQiFZlMIJE-7}L#QU^31}>>@s4Cz8(|>fHnu#-7bvA8Qlb`$;0)81<@Mt3c(d5np@ahoGj2No zvoQ_Gr6>|w>e`foOly_orKjEQYJJkm^9qoeptzxLy3F@vP_}iaSZdw`xY*IH2?)rJ zu2*Sw))c0D?KIfm<*qT^>`b+w9LTMsPR;tt8b#ISF~-2T2r&tgdlE2PdX~j_8%!-~ zWY&;yf+nN6XzikDVP)aO;(SkM(ZEO%Mm)s9a1nGE7%K6>Y=gO~F=fJtG#JtlZZ|gm zqvETABQiL_kL%*{oS)0~dpJwillVNX;|X(K4zukz`(2j(i)(Nli@-|O-G4VV4Ktjy4l^40)a*k$*3T>9`%d@sULLV zdX`|1t(DqH;DpcYFDab$HM(8DenU4NPm1-8CxmASBzhB!v^d*v$_xvM;sePhFXtzx zKJ~IRGZ=AkcS>B5qGT;~h@{?AyhcxNct>s>Dy`E!_V(x`0ifwc*53Nt#nS@(1L;36 zt1Ku-svX6ys?ZlrYWJ9YwRxN|Fy}iD5er}Z;uqie^{;>Zk4SiRwAkJh(`<@)x8?6i zh_pZW!4JOg;~)R{a|j}sI)Vx{@|-pj9`IX+(*oey6UFeVyHblOUvEjoqz1@#qORi6y*Ml(lDjud{R&n5^+#3 zLQVo?pivz%jU%RbchspdmRTvC#7hJy@5n;mPMNdaBG$pQ48l?fbz)S8!U+cE_ecN5 zw-i71Q-4Vrf;T0WvPZmMPY%3?yBDmn9FF4bAR`f)O+9Ali(yc z0%I(UMoYS};G5t4X7T>_f1r5r8!yH7h^D6hh(p;UrgG&=j09ZjyNI5o8>&&7M(TT; z#q)3Y*5dU~-zeIHouVg!*45fpR}!r)-0yDREB?^yo-Cf}-Yc3zJ=%J~RVyv+2izU0 zee|9xKKMK=BACyOubF8|giKJz=jCYow2Z(N&d4RpM# zxy$9=YJXdqzvn$a_K83HXMg-N!clr9)vz{?76#l^eW-8s{PWNMQx(8-pHYLmcH_p4 zcPrvKB2nhR(3?&|sffGCV0;+yXfY+2y!eyCXu!Z?!_aBKZp;WL%uzz>sQAd_lt0wV z^~tj!9OF7V4p^tbuEqmLxYJKz(h7q;&%y#n^EO*;zKKz#5>=Y&rv-A^+$qL@i+qp) ztXqsUg`-+Z&01VTooA&%t|6lR7 zmu}5YSP69sfs7}xkc3YXG$f!vxkpTlw!Z6nr}%*%_@l-4*MCm}Y^m7Lly7siqfxW= zi*{Zs+8Y#Y9Z$swZ>rH9nx`BurrYg`(atNy+rI1B;$A~HJZqzLd!Rjr`o`PpxQwsA zrs%!g{oeonum9ukQtiD<2r`deJemonZ0=cRLKu%nck{ecL5|ObqG3*I zQwAm%W)7?7MY+c@{fQZFnFHJzw^WGJk}NKBND zHZ~iiNyTp)g#x|%ELY*iBeQrngj?l%>>Ig6wSdvX%bl~GItA2OI6&xNWXJmi{^e4g z=m;?o;hlm)paG3q16S&(V4#Jhn4$Da+eH%Sr6$ad3^i3N<%|F&bK*5BN7!hrq?0v- zW6=XWpcZr@fMHo3Zc;{te)P(hi~|)mdVqU933T6FuB`=Q-yV!%VxuL(g=f^mD~eo$-t%>k?<~lxB??Bk&7Ql18hZiJ+aW<6H^~5ZYb@E zz)NsuG9v%P0O1B{3X(9D6>D6G&ax6pAI?YwEQyIFJ`&4I$0RXN;tn=qM28s|x60Ew zLdqIgl`@fFR{p#zLK4BtGT2yZ;e;`2M?qyI%{a8~I+~(fWPm-iYKszG!Z6xKnyKJD zHN__e&$|r1_cE%Dn}r)MPaCjUUx<5m4|4hr}j16-qDm{`AHc; z#mD7artgVB)JccYSwQt?X}Y71&|M9vyTxi(r?!Ney*jF*D>_}&X`&Csh@E=S`M~C0 z191VR*Ii`Ppp0)zm<_Z>HrT!!YC-}nOICWlPbl@ol(Hh`QQ@h79xV)9xDeC1i&BN& zoTfct>Ul}&19vbW5jMnqn4uw(Ce}y9v~()q2lh$GO1Me{0dH#7gaTwxRH)8rP8a;x64k!OGAYkYjM}sz_PT{(NA{f+lOh5`V%4>*(w8)cC47owxidXl&d>7>}*s|1p??*j| zb1Zd?(o6i2y=w>5NljBHqH~EN7iUhy)W-5pbwua1xm2tywTr#oZH*e(Kc?@@^rB9O zn9$+TX4($4#-608Un+SvqLDXM`|#R@ASY=^>kF{?>bw9SW`S8=T8+*eZHlW$zY}HX>nKiO`oXrJ0b!zZ1p-4+`WdTW zV7p7wVpO4hg)w(Se4J_@R7IY|*5*;hz=aDjAy z(p|rPJw{{X!^0>IVl$*laEIA8tZl+6 z8wCj(cY0KBq*@4`=wAnTVpHnzDlPn+)sS4BGn&7Y~U8N-!j7^Eb7`6V~o+E zcx6mWv2RSdZ)%-oSxj!Esk5Q9>pD!0N%*3M57Vy-u=|Tr%|dFIqsIFI$`HT7dE0!e zgz2CKxO>IWHZY8AmRHu12r(_l-mIaHlNxG-qs=d(3qHKWOZnlLcBOM9^{Zk>ZHo>O zT7hzDy-5N@0x?R{Pslrsj7VB0S2@W~>4Uv3WrQk+4t&;W91TXxIzzD~g)R1)r7o2K zWvcXEj;|wQziYs$jgFZ9mU0OK3^X9FMmRWUoKA%TE0nI7FQf5FD70h)3)2#-2^=;#E6V9eBL?6#xt`X7~`@RIz zc!}LU(nJ)7VPq`KlQRhCVLAt04-^8+E`mZ+T;dceyY%Pbq{Se>n&|1vq~CC!`e!O8 zthbLcwFg%YO%-Z7bR^EYw6a|6X|wr{AfF<`1)BT)`fZtG|#aMm8{ zYf6G8x=`mrADZRLJ<(E6i0wgF(imiciM@K{uUSC}LOEpU@PsgvO&oq6XoPJtt<@XF zVC#0#SH__?hau65I$_J7R%S33_4;BjYs2ZBFRu5 zzL5%2h||^fqlbaZAjJAlJ@wSjzxK7S{e20q6%lMlLanLMSyP0nHEZ<&(*jCRq}-ZG zXhio??yefha}r+f(3)BYp#^bcXpEelhY+h8!#G^|ENm#m18aEOdAe$t;|{VZ%Xwns z$K-DN3G=8Bw+-&(hZ*BWn5CA=bWPHgNP-MDYk?IrK4muC&BSPRxhJIn|ol+d6h`}xq5dI7PDFtlMRD6si&{x*36}NBSEndCz&6pBIxb@Xb z;rOSi@P+B>TQZf(ni%+CDvoM< zB{!pUv7-FA@%d{ySfkT^T49>j6uotpt`)fr;?|o5ur#q0zkVb+5w}ZWdBKiI8(M4%N9kpAb33lUY3fSdxGh;zY?H>Q*wxhAYggOF`~KY@ zD*o`dJfXu_H{(Ga{B#Aj^mq^cO2ja zFr*KfKoFGcQc-!nzi`f;F248w`oH{d#ozkdf4jJMR|*!IhSOL(j*rp`q25{N5vq-_ zzl-Ta-iDF5#yZMlw|L$4rQ&`6&c9wftx@_^^sv&C5bSfNq7E4lG+MI2hj0`bj971* zYSf3K#&W0lnAG$C^S|;x6?Zo^I+MWB!74HG*AYJYhWl}s+SL3-<29&DhN#pIRi4h! z)Dh3cmIPQ^9k90ieN8WpIfGR%LTjkaqmO|L7h<6J`@jGD=?>{uo`Aql1XFTNp?z9_aMlNJ@G}F$m+6*eQ?b9w?X7*wn*DWta3B z^-(Z*9ZI2NO(V~(o$cbcf9ETzY?|Kd>-<54P86$mX^Re-vnXc=BbXX7B{+R)vv}>h zi{i%Ujs%#dV~4uLR)46|GaQHZP!1x;p=eCq9MOq(f9W#!?u}uL2s2}~A0Y=E23Q`_14kS-8jiq_9wCVvp~-aIX^qRu z(^D44w%vv$oQHZ47WBCknAK~&xCG!dhQEyM^*J8}@14K}+f z+=hB#_Ps+YK+G=T*POD2l$ALxhhgL(^#o}S=o@Job)v&**+<0q`<`AUgrhPaYV8MY zJ8ggsZOdJ~XLn5p+iEn{l8U`H#R^mKJTXEE@Lq2@zAIwtrKz@ z4m7PowMC-MIf#3bE*M^mM?y%H5hE>vrFJE?_`5};uOp%~1v!AJ!v++$j7D#xgw@@KhijQ?W3Ob=7k2qH`OE=XwjLa3L z?=dIN45oHIIvBX}LQKpB^?cUOX2J$RgRypE{<(nL$6(dqs$n@i0t@EGV`IiZy5K&J zSYRiZ6yb6mmfOVH4>a!F@2nSwAxy*w5HZ;B)7ZEwyU#Tx($;J1I3E}>n}QK|18oKl z=19iTbx+KQZBtAQ>D+ORa(2bUcC+j^fpjmGY6 zX#^$1t02e{J(Gd_{Xr;f!0qF_9EuhNv?YYbW8Jzgu;{R-u%?hp zybz%uO-X7xx~ccj0<~Uar0L67We3IRM0)KtQ&iC6x8V^Q2rb81 zh*-FtbUM-blaJk1JJoLSFR*#qSW}3eeA#NVWU#=Ndf-eH#Xcbkv7Sa1s~WL%Buz$o zhGN(-qF8|xLxx9@Q&+;Ot9V8>A$Sm!a2=VDF{L{c02B-#gL?*ku;rz9p6tc(@h+sp z#HoN5K8pl@Oo&A;3^evM9mb$#Rp$t9Z)+_`8lCa|g)8nci?@q< zEAdI~7)c+N?%@2vZG5e$1GON8Zv>4niy(ofDc7Z*wD@$d7XuWgjEN82YrV9k^Dai( zAIN)?GO}O{u1?F4=|UNS#rj!WC(DlqTM}rZ3(bB^g*P@Ri;@G5A5tJj8O1f40ihmV z;oV|gM}Rd&gQ;6dtTKxZp={F2&5VNE0C}9;@P%_D`YFwhHf77C7ja;1KT;UD@+VlnEgVBY#1UsH)+_J6$kk`GKLq;pdsVo!esD>4~)fa#+>Qb0F@Z zc!$p#eoW`l6PCeElMR~_7j)pNHvKYcU}JL&p(W-m4zG>B^tY)OOo#O`ofNL**Ti4i zs9<)pX2b4y zR~x&vhSFNoJ~A{lr4WE35Ti9{r;S34Ms;E2ZmXUh<+XKN8js6dLz8GCAzR-{0wW#& zbTXUt>16%*Xew@QC+3d-phqzo{^+dm_Ud*84p6euQjsp3)%!~dccp1KU{jS$S6Z8B zr83=&grS7;ZS`XE>D#KCqrHT3Dq?r1Uu-q{#j5b#kx(4z_^2U!EhMxV0gklUTx6q9 zD!-<#hf2$u*e=J-i~LzS{gLzzwo8WQT;p&W#wkh&AXW6JM1Ht(_6Kqpb6 zgyvLDn1qW?N@{59%Sb0DMYmRbPtzCC+f&0Vrxy86^qzB5^*av6 zpgbDH^Dv4*NLCGDGe%d9Ed7ZI?~f#`EF&To!Q?3%pQkhPihG=*iNew)Kwvsb%nAkm zVA`-FO&M{{9aC^k2{ukrXo`n`k(Lr6kT9T)^@^QcvA}Cjs5dTwr)fi&3_b49MiVGL z=8;Gi(@AM~ruQNs0K$r48yPQ(SAHB#Bxo6aQ_XWbU7ShW{SRz*+|nh9L-n>b_0`g1 z-b82e@lO4bMoipAB>}dsZG_u;XWor{bZrUq?yAm=T)C#bO9Ndoa*eHHs;_Pt-rkH+ z*;FG?a7^a~iG^^xs~e-Adiq)BsEUD@diws#R7{)=!;@3kA>?DIt8$bcziqIS`yHO! zrUSil7&;FKQw&0ES?3mZG;(aUH1R3{Mig5zhJ9(o2x1`G=B8}Eb9@JqO2DwTwW4}y zuvAFFu-K5M=QTEp>tuPR3`I^wQ;IR;Xcy3)&fkm?6(c}(3iQ4E&E;ac_KafwKzT_J zN-1cpXUcr93^cg8rWn=9Q%ixi)8mf^QS%H1&%QIlxgtg#Zj#`X zGWlrKy?y(3OQSulRjWZOFNB&IN16(W#zOid4S8Tl?}z*xc2K;_bA0(uN`_KGB&XTy zNmGBUK~d5e!I8GqX=J2cwFK8x>s-VBR`Ko6ToZF@6nk3VSzBI`c3Dzl8Hvf|f7#5WNd!o9F8 z*o5QwYJqD$wv^;0eNj{q=;qts{`PK3+am2zTbsd~+grQEjVG=(KKsc}wqLz_x7l4; zlMq*Zqzu&89y&HR?&8oe_>X+o#$KbV19`7Au$!uUofOt-hRzRyyEG+TfQT@ref#gXOPT^# zI<7`t3DPpCq~Eot8#KNsx4LV!c~miwsQ-$;od}=zIO}(5-Me>h{mpNF^DlhuYhQaO zC}Nt4bvFx<#F%I8?O0fZw<8b8g9d6LR!vMCFe6Qq0grK7;&>1u6A2#-3@w^a1pvwk#v;kEk3pPG$>Sw%juedqc zEykPQkRpJ(&Du*9`@YCnqq3H!k{VKH=QiayzJu`6P%oQ=A9~dZN7Xpsyr#%t1mRn? zIqqmtIB;V|6w14!E`3vK-&2jo21_?IF}hOp)^0{MI-~8FR@_^@S?sKTOYuMcpPwlH z<}Z9q_yI=@sx*-*rVT690UyQR{onuR;$83hSEa7qpJ}`ztUBH0;`e^<_lxiSm;RL) zg~Tfj&$~o2EK|H~;hx{mK91|N7;B@b+m#!&Ie_fYFFmpI%dl)16`QI^jl3 ziY6!Bz?`apkOOyqkRFI&Y`)u`r0jq37yrWF{NR84Gw)LnhN|V|^EQ5n&rJ?Tc-3#% zgTf^*UqPXBJvy8V@+ zaqmk~;1GAx8W}=tqN$~>GMH$ZsiRRGM^B-F$FWo#xEj5F;e*rR8Y2TO#T>z2p)|{pwpO6U1!)DM(+U&im{1417M*cNkYlNKswOvehUY2~7y0=CTC@Ji2zFb_>LAG6O)`jS&!i#vbloWK(vG_Kliyfh1 zMYmQ{cczd#I#-EN82j0x@o022(hzA zOUh9~%ST=XgRu~^P&-b!iHYooBuwpJ10S}>8O z)`hgmKyYwC@f`6O^{DxY16PB!Xl-Oqqb%5vl1q8)5>D~# z^&t<{i#)}(T0I@!DmQ{~T}-Z_@`r-uAXw=&2K+>d5e;?SnZjg}t0$hxA+c15H%$A3 z1kcEddTDgSt;`rkDX3*j#7aPwLQmy0(n5f=H9bYTkzhElZ=_LDOG*l)Zb?8*b?%=g z&6EiuRyfuBNZiQFekcV?;5DRFFz(;h?CRY($o8((!wa2s-|0wjN@ct+jXUcn~UbW4Og zCIw}zFPHw3Y-FECxd{5KXLG(c0d0g&xTporSdg0M1{;-O&O+^D; zeMdc*5JJMK{SkP?Pql1=D-VBI2i10sfiuHEEyNB%rPf7gektcv=xZ zjr}k~!_Hys&%<)}qIgCl7~!}n?Gcg^#Yl_)5(R+| zrZTw|x}lRC;_7+{IBi6VeMaPi2qEVfWg#e|+$78pKOsQLy&R>b8Y5VF9oZ6A+Ly#9>AfJWOSZoXhkLP7@IpnD*Pz0^43gYUT~4QF<0<;^v?DbgX}A z4`yBfbJ z4tn8{rmkPn$#R?Cng~f)*ZTqw&0*(xQrD^hJ~zPU?<6;do>gsX3_KJJ)I#hKv_ALT zb0e*h{8Kf;KPE6Oj)=D>O~^x&N5t*P|;{_OCu$DicweR@ohX48@V?W-XyI?Wg7p*`V2Xf zSXB;2+>t<9X|G9Z<26Nl^+~b~qk)#(Y?KBo5?);iON5smE|BEA=&qmGOGUS!+gXtU z#6%)Zry*nb@}NE$XIpv?wf4bMPL&4o)Q80ZcUZjWgtCSbV%)2<(A>Ipi&5A&6iKfQ zo**GDC3y+4qf802?|qa;Rr>$iJD1?Nl{YcX&Nz*2vq*VziNErTkdv`tXr#*SnAUf&nr zx6V1&4{Wy$rLke}I) z>k%U6Uc$UQz%M0n0huVn8Up|_)|m_CHS*)&msLD*gBjU5J@a}a0r86;zw{~?ih4~} z^Ow1nIYf>Eq%3yRsAaPvcP@BMRD9+qWwdv0i5I3?nh~=766f z^RR^Fawb+xFmf-*$qiwO6zjpjZVtw?7hiiTyIH-9H7qSD1w~hIcz25DeAzF8YUDZ{ zSp}3_32Vc|UVZCw_R59#GTq&-tn=8vnm5b7`<-uR_uqd65=jj<)**M;2%RH$p1*c| z=EfPA+6?)IC?{LFf$Z+~9% zId{h5m`ug^<7b&a0$V3fp8VTWPd)W+(L_2W34Edw82+$-qOGRJ{_7GrckbNR9)0xD z-vX%N;Z#k-EFu~Ow^7`D>xpC8PoDmI)|k7@^4KDw-0^#dOQ@KdTe_Lm7On$cEdWa9 zrIjR`e*I~P&CxlFk)`yRHq;WaQ2}HEP@37>H!IoqpM5R+J8H_>SU8BUe@R;x40(=CwkVnQ_EHQrA}5Y9V^HN(Vgr=gL~qTm$f%s zL}8_!)u;Domk7-G<7duh@6f5t(z+gw!LyoES;VVwmR6X|w~VIyZ8zh(hG-2uRn!G5 z7$(X)Yv}cZv)=2SDO*iOjvjsRjlaC|>Jz(n@7|Qv&}d3Y0!ad&q6Es{@lUbK)YT^; zfeE}u#F`8WS!0cAFrK_+6>oR`de)nLKWqK-ZNLh{2%O~hUDrWzPcv=STb#qA`)HU> zJ9W3h1M>ALfyb*J(SJ32HwGDhVdH9uHLqPn3Z@VJqPN-jY~2dp_600P6wh+g58*~XggNYB4T+bGQC*EVt*X%lCjRsE zBa^ztWa-f4o0epdad2sp4J7D^XM0!adQR00Xa?x^^0zw=PM=xH`gVT=HaD69)r*+Nb& z%+TR9OeN_gw+j%BU}0$R!!QiNEWV|MADZ3+jU51>rJs|C8iUA)(Arq^G1-TeVSQ{O zTfmJFwu%{Bv)D8(gUbXvYvH@!aDAPV*Qw1p708I~9QZ>BM6Qr5-Fj=5@lJ_5%ylYS=shF>0x17Tq zC8k-)?y>iaI=p(;$C@%~(~Q_817q$n&RQwv>y~&;p{}Fr;1b^HGFne5NgzpJn@GT4 z_mp<31T@)m{!p`VEEP35SKSI5eVnu!;8EV-G^5*r>lk3vF{gLU%=}Q?oFmC%Li1}V zA$!ttP>u#`0oa;2%w1;6Z3M%L0ej7`@qox+v<}1503`hF6-_P7&oT3eVTZ9lNMfWZ zc5!I}A1n;8aJ&GU<0uJ^!x4rfd)kqx6v^ zkR))2C6Jid9sUCTgYH$PQmtsBi}PAd-~|d-dm2o^O%uJia}#9@o2jz~@18J?IGieU zFH{dS(9M(^RRyA8Ou&O)H^NRM^4Q=Da4Zn!q}I5LvclnjJzy{#_iw4_*^9O8bQ@67 z;C75XRSlf&))sNNM^H}Lkv{k|$FJgeSMMBhwipB5Vj4oI01^QET1Rr23}S$l0SyXS42$qH27naB1U=USoo*a3MJm{v#J(CR zUj_ICF^?Rla^N!Rvt`}HizDa(EH+2xsGUBN1d;^qv;-1}-RW=OHv11o;7(o4*<%U~ zZ9IY!Hx5>Zskhn1crkGj4VvpKmtZaN_K4u zB@fH1PGg~na$g>4W(z&6{3r{qWs|HS&1+#8bcVXr*D>ro7K$yR_;&lm=i+e{qmVAK zrDQe%VvJP~V}%Oee9(AY;E;1bUXuHFizW79dmG#lA51d|?AJ$$HitR*|}j zG7x~QOZ2ljrv)RlN&#lU*aU4J<{?wK2qP7N&-zR+!s1*LbE>t7fB+VXfCQDqgFW)@ zw_5G_{rmUZQ%Xq!NdntM0tv*n$ro`O!%)Rz-w!AiY8Bm$vIPvFFpb^!X3NtD(d$4G zQ;5I<3LGU5P&l2|WA7LBg^>UbEI(*QMQ>wR=LrO~*J=~>7q-{f(+r2X^~Rp8J+n+N zZl7vLxUYUser6u1WlZ+-`$wp_fVyU7kQ)ny7$YZXAYD1@6 zGRIIOb8NJcUAs9)Aj&B$3!7PIe$d9ku)9bo5iBdK;B~Z2OVL!LQSC3a`lGD>RoblI z1yP{*;9MO|kVwV`mGX_4u&KfUp0HZ%9Dth4w*tU#5XFv3qEuoBaNAkIi- zkvo+-%m^rIOJPW(uowYv94ieyWmI843oxwiV6?Yu-{DuEJM+sQjo-arLI$S_t3(VL zyYRw=+FxJ(^B0~u^P5xsTQmDcE5H?uCI}mlFq)ep!oZyRb1h5&%lnk|$ffckj47NG z3(8ek(im>7vfkd$9{t1VGtd2^zh}=}yWbo%m_vjk60ETbQ)*Q&UO4~AsZ*!UwA$V9 zvlJ-g3yD|=3uyFinDpo&h-xS^QXlF4^yfeO-mzoH&U5d6FJ7tJVSiqmwwI0^IWj|D znob-_FI^-FBnc!5+@=IBUcC5K^zt$oqt9J*wG;}yU2B2?BWwxI2AW(GbJmzf3!G6SU(P zJnYZ0+*KT2d)W5sKFqT$yTszKu4697*?;W8&;5EZGsEr1>Fn7*evwF6Z6+=U_(_a+ zDKJ}uNDfd_s}b6ioAMIF1AiUemtT76k&RnUxk&;^0^3mniHU8;Z{?$nNljeQN-*FA zKZaq@pjM`S2NU}qYesS$I8Efqbn@g`43dwn7^=H>3)4RGF?NTgEyKiWdWdK8&<(-! zbjGS%r9VF1g^}3JhRFaiy-K69AXkjU2#iZbe@2kD{ccnzA7d0R^Ks^$=%b2NbqL{N z7ylbtGIG6C9j|^61vdT&;|xYQ!qx+$R1cG*^(co_JaGS*#v3NB60M(7l0cHc&XGU@ zv7Pf>tr@9)6iw>o_y{vRuJvu`sqhE50$}EPw>GWK5i|-V9u4aTisrd4iI)caOYOx` znb>APR=0@(UKib*3>Zdu4$iJeMferYdeC)08!R$_B{mj=W?C>t*ACMQI*;`#rZn9S zT^(g>w`j9v>JeH5!UZyF^iigmw)9;b3(0p;OvYw2ju>llFf~Cur6hqQft@0O1Y$eo zn_4$cBM+WY5Zh*7$j2Fu%K5|6M=7&a8zl&o z(`+hw(w4>z8bxRjVZmTx#W+`w#cPieNLD|yUYTT^0(BYHnsSlK=j+daP>y0n`{i>g z#aO)ex;*q0QY{B?pV^H0Z5kT&{@4oX_u3TBy+{*3P*x0p$ z2M@kTm4_)`f=Tqp*gUgjWe_oJIto_A^_o75)&?bTQmzl6cK7bxdtr8VcGJCD0N3@y zhY!C9=pAC*W7Nk%NbEebYr}_B7*jbG`y6o3UhYnhwXs>AZ)G=93@e?I1d;@{iv&tV zwq3@P#_=&EaQ^)H2>@dp<&N$RdxtH*&jLU;>;aGn5Gl_n{xzUtKA!UjH*VbM3?P|sTy|KFue^6GrgAW4zvaE>GS9KtH{jLBf8pYxLx&;?@#?axuU~)t z_2xbI+%s-pxQgP$ZZMK%yf)dk?Uo4u>tDNet$Y0V@f)k#O4msONdid%Ndid%Ndid% tNdid%Ndid%Ndid%Ndid%Ndl`S@GlchI4Q=xGdKVM002ovPDHLkV1i1Jm6QMg diff --git a/webview/src/environments/environment.prod.ts b/webview/src/environments/environment.prod.ts deleted file mode 100644 index c966979..0000000 --- a/webview/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true, -}; diff --git a/webview/src/environments/environment.ts b/webview/src/environments/environment.ts deleted file mode 100644 index 66998ae..0000000 --- a/webview/src/environments/environment.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false, -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/webview/src/index.html b/webview/src/index.html deleted file mode 100644 index 1913a2e..0000000 --- a/webview/src/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Hello World - - - - - diff --git a/webview/src/main.ts b/webview/src/main.ts deleted file mode 100644 index 30cae46..0000000 --- a/webview/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { enableProdMode } from "@angular/core"; -import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; -import { bootstrapApplication } from "@angular/platform-browser"; - -import { environment } from "./environments/environment"; -import { AppComponent } from "./app/app.component"; - -if (environment.production) { - enableProdMode(); -} - -bootstrapApplication(AppComponent).catch((err) => console.error(err)); diff --git a/webview/src/polyfills.ts b/webview/src/polyfills.ts deleted file mode 100644 index 40a0e9f..0000000 --- a/webview/src/polyfills.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes recent versions of Safari, Chrome (including - * Opera), Edge on the desktop, and iOS and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import "zone.js"; // Included with Angular CLI. - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/webview/src/types/markdown-it-class.d.ts b/webview/src/types/markdown-it-class.d.ts deleted file mode 100644 index 7de6966..0000000 --- a/webview/src/types/markdown-it-class.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module "markdown-it-class" { - import { PluginWithOptions } from "markdown-it"; - const markdownItClass: PluginWithOptions; - export default markdownItClass; -} diff --git a/webview/src/vscode.css b/webview/src/vscode.css deleted file mode 100644 index ff83a06..0000000 --- a/webview/src/vscode.css +++ /dev/null @@ -1,133 +0,0 @@ -:root { - --container-padding: 20px; - --input-padding-vertical: 6px; - --input-padding-horizontal: 4px; - --input-margin-vertical: 4px; - --input-margin-horizontal: 0; -} - -body { - padding: 0 var(--container-padding); - color: var(--vscode-foreground); - font-size: var(--vscode-font-size); - font-weight: var(--vscode-font-weight); - font-family: var(--vscode-font-family); - background-color: var(--vscode-sideBar-background); - border: var(--vscode-sideBar-border); -} - -ol, -ul { - padding-left: var(--container-padding); -} - -body > *, -form > * { - margin-block-start: var(--input-margin-vertical); - margin-block-end: var(--input-margin-vertical); -} - -*:focus { - outline-color: var(--vscode-focusBorder) !important; -} - -a { - color: var(--vscode-textLink-foreground); -} - -a:hover, -a:active { - color: var(--vscode-textLink-activeForeground); -} - -code { - font-size: var(--vscode-editor-font-size); - font-family: var(--vscode-editor-font-family); -} - -button { - border: none; - padding: var(--input-padding-vertical) var(--input-padding-horizontal); - /* width: 100%; */ - text-align: center; - outline: 1px solid transparent; - outline-offset: 2px !important; - color: var(--vscode-button-foreground); - background: var(--vscode-button-background); -} - -button:hover { - cursor: pointer; - background: var(--vscode-button-hoverBackground); -} - -button:focus { - outline-color: var(--vscode-focusBorder); -} - -button.secondary { - color: var(--vscode-button-secondaryForeground); - background: var(--vscode-button-secondaryBackground); -} - -button.secondary:hover { - background: var(--vscode-button-secondaryHoverBackground); -} - -input:not([type="checkbox"]), -textarea { - display: block; - width: 100%; - border: none; - font-family: var(--vscode-font-family); - padding: var(--input-padding-vertical) var(--input-padding-horizontal); - color: var(--vscode-input-foreground); - outline-color: var(--vscode-input-border); - background-color: var(--vscode-input-background); -} - -input::placeholder, -textarea::placeholder { - color: var(--vscode-input-placeholderForeground); -} - -dialog { - background-color: var(--vscode-editor-background); - border: var(--vscode-editorWidget-border); - color: var(--vscode-button-foreground); - overscroll-behavior: contain; -} - -dialog::backdrop { - background-color: var(--vscode-sideBar-background); - opacity: 0.5; -} - -.feedbackDialog { - width: 86%; - height: 86%; - position: fixed; - top: 4%; - left: 2%; -} - -.no-result { - color: var(--vscode-editorWarning-foreground); -} - -.text-success { - color: var(--vscode-editorInfo-foreground); -} - -.text-fail { - color: var(--vscode-editorError-foreground); -} - -.cursor-pointer { - cursor: pointer; -} - -[id^="plantUml-"] > * { - height: 100% !important; - max-width: 100%; -} diff --git a/webview/tsconfig.app.json b/webview/tsconfig.app.json deleted file mode 100644 index f46b58a..0000000 --- a/webview/tsconfig.app.json +++ /dev/null @@ -1,12 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": ["@angular/localize"], - "target": "ES2022", - "useDefineForClassFields": false - }, - "files": ["src/main.ts", "src/polyfills.ts"], - "include": ["src/**/*.d.ts", "../shared/**/*.ts"] -} diff --git a/webview/tsconfig.json b/webview/tsconfig.json deleted file mode 100644 index fcc9770..0000000 --- a/webview/tsconfig.json +++ /dev/null @@ -1,33 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "forceConsistentCasingInFileNames": true, - "strict": true, - "esModuleInterop": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, - "declaration": false, - "experimentalDecorators": true, - "moduleResolution": "node", - "importHelpers": true, - "target": "es2022", - "module": "es2022", - "lib": ["es2022", "dom"], - "paths": { - "@shared/*": ["../shared/*"], - "@shared/models/*": ["../shared/models/*"] - } - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } -} diff --git a/webview/vscode-variables.css b/webview/vscode-variables.css deleted file mode 100644 index 008fae2..0000000 --- a/webview/vscode-variables.css +++ /dev/null @@ -1,760 +0,0 @@ ---text-link-decoration: none; ---vscode-font-family: -apple-system, BlinkMacSystemFont, sans-serif; ---vscode-font-weight: normal; ---vscode-font-size: 13px; ---vscode-editor-font-family: Fira Code, "Courier New", monospace; ---vscode-editor-font-weight: normal; ---vscode-editor-font-size: 12px; ---vscode-foreground: #cccccc; ---vscode-disabledForeground: rgba(204, 204, 204, 0.5); ---vscode-errorForeground: #f85149; ---vscode-descriptionForeground: #9d9d9d; ---vscode-icon-foreground: #cccccc; ---vscode-focusBorder: #0078d4; ---vscode-textLink-foreground: #4daafc; ---vscode-textLink-activeForeground: #4daafc; ---vscode-textSeparator-foreground: #21262d; ---vscode-textPreformat-foreground: #d0d0d0; ---vscode-textPreformat-background: #3c3c3c; ---vscode-textBlockQuote-background: #2b2b2b; ---vscode-textBlockQuote-border: #616161; ---vscode-textCodeBlock-background: #2b2b2b; ---vscode-sash-hoverBorder: #0078d4; ---vscode-badge-background: #616161; ---vscode-badge-foreground: #f8f8f8; ---vscode-scrollbar-shadow: #000000; ---vscode-scrollbarSlider-background: rgba(121, 121, 121, 0.4); ---vscode-scrollbarSlider-hoverBackground: rgba(100, 100, 100, 0.7); ---vscode-scrollbarSlider-activeBackground: rgba(191, 191, 191, 0.4); ---vscode-progressBar-background: #0078d4; ---vscode-editor-background: #1f1f1f; ---vscode-editor-foreground: #cccccc; ---vscode-editorStickyScroll-background: #1f1f1f; ---vscode-editorStickyScrollHover-background: #2a2d2e; ---vscode-editorStickyScroll-shadow: #000000; ---vscode-editorWidget-background: #202020; ---vscode-editorWidget-foreground: #cccccc; ---vscode-editorWidget-border: #454545; ---vscode-editorError-foreground: #f14c4c; ---vscode-editorWarning-foreground: #cca700; ---vscode-editorInfo-foreground: #3794ff; ---vscode-editorHint-foreground: rgba(238, 238, 238, 0.7); ---vscode-editorLink-activeForeground: #4e94ce; ---vscode-editor-selectionBackground: #264f78; ---vscode-editor-inactiveSelectionBackground: #3a3d41; ---vscode-editor-selectionHighlightBackground: rgba(173, 214, 255, 0.15); ---vscode-editor-compositionBorder: #ffffff; ---vscode-editor-findMatchBackground: #9e6a03; ---vscode-editor-findMatchHighlightBackground: rgba(234, 92, 0, 0.33); ---vscode-editor-findRangeHighlightBackground: rgba(58, 61, 65, 0.4); ---vscode-editor-hoverHighlightBackground: rgba(38, 79, 120, 0.25); ---vscode-editorHoverWidget-background: #202020; ---vscode-editorHoverWidget-foreground: #cccccc; ---vscode-editorHoverWidget-border: #454545; ---vscode-editorHoverWidget-statusBarBackground: #262626; ---vscode-editorInlayHint-foreground: #969696; ---vscode-editorInlayHint-background: rgba(97, 97, 97, 0.1); ---vscode-editorInlayHint-typeForeground: #969696; ---vscode-editorInlayHint-typeBackground: rgba(97, 97, 97, 0.1); ---vscode-editorInlayHint-parameterForeground: #969696; ---vscode-editorInlayHint-parameterBackground: rgba(97, 97, 97, 0.1); ---vscode-editorLightBulb-foreground: #ffcc00; ---vscode-editorLightBulbAutoFix-foreground: #75beff; ---vscode-editorLightBulbAi-foreground: #ffcc00; ---vscode-editor-snippetTabstopHighlightBackground: rgba(124, 124, 124, 0.3); ---vscode-editor-snippetFinalTabstopHighlightBorder: #525252; ---vscode-diffEditor-insertedTextBackground: rgba(156, 204, 44, 0.2); ---vscode-diffEditor-removedTextBackground: rgba(255, 0, 0, 0.2); ---vscode-diffEditor-insertedLineBackground: rgba(155, 185, 85, 0.2); ---vscode-diffEditor-removedLineBackground: rgba(255, 0, 0, 0.2); ---vscode-diffEditor-diagonalFill: rgba(204, 204, 204, 0.2); ---vscode-diffEditor-unchangedRegionBackground: #181818; ---vscode-diffEditor-unchangedRegionForeground: #cccccc; ---vscode-diffEditor-unchangedCodeBackground: rgba(116, 116, 116, 0.16); ---vscode-widget-shadow: rgba(0, 0, 0, 0.36); ---vscode-widget-border: #313131; ---vscode-toolbar-hoverBackground: rgba(90, 93, 94, 0.31); ---vscode-toolbar-activeBackground: rgba(99, 102, 103, 0.31); ---vscode-breadcrumb-foreground: rgba(204, 204, 204, 0.8); ---vscode-breadcrumb-background: #1f1f1f; ---vscode-breadcrumb-focusForeground: #e0e0e0; ---vscode-breadcrumb-activeSelectionForeground: #e0e0e0; ---vscode-breadcrumbPicker-background: #202020; ---vscode-merge-currentHeaderBackground: rgba(64, 200, 174, 0.5); ---vscode-merge-currentContentBackground: rgba(64, 200, 174, 0.2); ---vscode-merge-incomingHeaderBackground: rgba(64, 166, 255, 0.5); ---vscode-merge-incomingContentBackground: rgba(64, 166, 255, 0.2); ---vscode-merge-commonHeaderBackground: rgba(96, 96, 96, 0.4); ---vscode-merge-commonContentBackground: rgba(96, 96, 96, 0.16); ---vscode-editorOverviewRuler-currentContentForeground: rgba(64, 200, 174, 0.5); ---vscode-editorOverviewRuler-incomingContentForeground: rgba(64, 166, 255, 0.5); ---vscode-editorOverviewRuler-commonContentForeground: rgba(96, 96, 96, 0.4); ---vscode-editorOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49); ---vscode-editorOverviewRuler-selectionHighlightForeground: rgba(160, 160, 160, 0.8); ---vscode-problemsErrorIcon-foreground: #f14c4c; ---vscode-problemsWarningIcon-foreground: #cca700; ---vscode-problemsInfoIcon-foreground: #3794ff; ---vscode-minimap-findMatchHighlight: #d18616; ---vscode-minimap-selectionOccurrenceHighlight: #676767; ---vscode-minimap-selectionHighlight: #264f78; ---vscode-minimap-infoHighlight: #3794ff; ---vscode-minimap-warningHighlight: #cca700; ---vscode-minimap-errorHighlight: rgba(255, 18, 18, 0.7); ---vscode-minimap-foregroundOpacity: #000000; ---vscode-minimapSlider-background: rgba(121, 121, 121, 0.2); ---vscode-minimapSlider-hoverBackground: rgba(100, 100, 100, 0.35); ---vscode-minimapSlider-activeBackground: rgba(191, 191, 191, 0.2); ---vscode-charts-foreground: #cccccc; ---vscode-charts-lines: rgba(204, 204, 204, 0.5); ---vscode-charts-red: #f14c4c; ---vscode-charts-blue: #3794ff; ---vscode-charts-yellow: #cca700; ---vscode-charts-orange: #d18616; ---vscode-charts-green: #89d185; ---vscode-charts-purple: #b180d7; ---vscode-input-background: #313131; ---vscode-input-foreground: #cccccc; ---vscode-input-border: #3c3c3c; ---vscode-inputOption-activeBorder: #2488db; ---vscode-inputOption-hoverBackground: rgba(90, 93, 94, 0.5); ---vscode-inputOption-activeBackground: rgba(36, 137, 219, 0.51); ---vscode-inputOption-activeForeground: #ffffff; ---vscode-input-placeholderForeground: #989898; ---vscode-inputValidation-infoBackground: #063b49; ---vscode-inputValidation-infoBorder: #007acc; ---vscode-inputValidation-warningBackground: #352a05; ---vscode-inputValidation-warningBorder: #b89500; ---vscode-inputValidation-errorBackground: #5a1d1d; ---vscode-inputValidation-errorBorder: #be1100; ---vscode-dropdown-background: #313131; ---vscode-dropdown-listBackground: #1f1f1f; ---vscode-dropdown-foreground: #cccccc; ---vscode-dropdown-border: #3c3c3c; ---vscode-button-foreground: #ffffff; ---vscode-button-separator: rgba(255, 255, 255, 0.4); ---vscode-button-background: #0078d4; ---vscode-button-hoverBackground: #026ec1; ---vscode-button-border: rgba(255, 255, 255, 0.07); ---vscode-button-secondaryForeground: #cccccc; ---vscode-button-secondaryBackground: #313131; ---vscode-button-secondaryHoverBackground: #3c3c3c; ---vscode-radio-activeForeground: #ffffff; ---vscode-radio-activeBackground: rgba(36, 137, 219, 0.51); ---vscode-radio-activeBorder: #2488db; ---vscode-radio-inactiveBorder: rgba(255, 255, 255, 0.2); ---vscode-radio-inactiveHoverBackground: rgba(90, 93, 94, 0.5); ---vscode-checkbox-background: #313131; ---vscode-checkbox-selectBackground: #202020; ---vscode-checkbox-foreground: #cccccc; ---vscode-checkbox-border: #3c3c3c; ---vscode-checkbox-selectBorder: #cccccc; ---vscode-keybindingLabel-background: rgba(128, 128, 128, 0.17); ---vscode-keybindingLabel-foreground: #cccccc; ---vscode-keybindingLabel-border: rgba(51, 51, 51, 0.6); ---vscode-keybindingLabel-bottomBorder: rgba(68, 68, 68, 0.6); ---vscode-list-focusOutline: #0078d4; ---vscode-list-activeSelectionBackground: #04395e; ---vscode-list-activeSelectionForeground: #ffffff; ---vscode-list-activeSelectionIconForeground: #ffffff; ---vscode-list-inactiveSelectionBackground: #37373d; ---vscode-list-hoverBackground: #2a2d2e; ---vscode-list-dropBackground: #383b3d; ---vscode-list-dropBetweenBackground: #cccccc; ---vscode-list-highlightForeground: #2aaaff; ---vscode-list-focusHighlightForeground: #2aaaff; ---vscode-list-invalidItemForeground: #b89500; ---vscode-list-errorForeground: #f88070; ---vscode-list-warningForeground: #cca700; ---vscode-listFilterWidget-background: #202020; ---vscode-listFilterWidget-outline: rgba(0, 0, 0, 0); ---vscode-listFilterWidget-noMatchesOutline: #be1100; ---vscode-listFilterWidget-shadow: rgba(0, 0, 0, 0.36); ---vscode-list-filterMatchBackground: rgba(234, 92, 0, 0.33); ---vscode-list-deemphasizedForeground: #8c8c8c; ---vscode-tree-indentGuidesStroke: #585858; ---vscode-tree-inactiveIndentGuidesStroke: rgba(88, 88, 88, 0.4); ---vscode-tree-tableColumnsBorder: rgba(204, 204, 204, 0.13); ---vscode-tree-tableOddRowsBackground: rgba(204, 204, 204, 0.04); ---vscode-editorActionList-background: #202020; ---vscode-editorActionList-foreground: #cccccc; ---vscode-editorActionList-focusForeground: #ffffff; ---vscode-editorActionList-focusBackground: #04395e; ---vscode-menu-border: #454545; ---vscode-menu-foreground: #cccccc; ---vscode-menu-background: #1f1f1f; ---vscode-menu-selectionForeground: #ffffff; ---vscode-menu-selectionBackground: #0078d4; ---vscode-menu-separatorBackground: #454545; ---vscode-quickInput-background: #222222; ---vscode-quickInput-foreground: #cccccc; ---vscode-quickInputTitle-background: rgba(255, 255, 255, 0.1); ---vscode-pickerGroup-foreground: #3794ff; ---vscode-pickerGroup-border: #3c3c3c; ---vscode-quickInputList-focusForeground: #ffffff; ---vscode-quickInputList-focusIconForeground: #ffffff; ---vscode-quickInputList-focusBackground: #04395e; ---vscode-search-resultsInfoForeground: rgba(204, 204, 204, 0.65); ---vscode-searchEditor-findMatchBackground: rgba(234, 92, 0, 0.22); ---vscode-editor-lineHighlightBorder: #282828; ---vscode-editor-rangeHighlightBackground: rgba(255, 255, 255, 0.04); ---vscode-editor-symbolHighlightBackground: rgba(234, 92, 0, 0.33); ---vscode-editorCursor-foreground: #aeafad; ---vscode-editorMultiCursor-primary\.foreground: #aeafad; ---vscode-editorMultiCursor-secondary\.foreground: #aeafad; ---vscode-editorWhitespace-foreground: rgba(227, 228, 226, 0.16); ---vscode-editorLineNumber-foreground: #6e7681; ---vscode-editorIndentGuide-background: rgba(227, 228, 226, 0.16); ---vscode-editorIndentGuide-activeBackground: rgba(227, 228, 226, 0.16); ---vscode-editorIndentGuide-background1: #404040; ---vscode-editorIndentGuide-background2: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-background3: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-background4: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-background5: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-background6: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-activeBackground1: #707070; ---vscode-editorIndentGuide-activeBackground2: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-activeBackground3: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-activeBackground4: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-activeBackground5: rgba(0, 0, 0, 0); ---vscode-editorIndentGuide-activeBackground6: rgba(0, 0, 0, 0); ---vscode-editorActiveLineNumber-foreground: #c6c6c6; ---vscode-editorLineNumber-activeForeground: #cccccc; ---vscode-editorRuler-foreground: #5a5a5a; ---vscode-editorCodeLens-foreground: #999999; ---vscode-editorBracketMatch-background: rgba(0, 100, 0, 0.1); ---vscode-editorBracketMatch-border: #888888; ---vscode-editorOverviewRuler-border: #010409; ---vscode-editorGutter-background: #1f1f1f; ---vscode-editorUnnecessaryCode-opacity: rgba(0, 0, 0, 0.67); ---vscode-editorGhostText-foreground: rgba(255, 255, 255, 0.34); ---vscode-editorOverviewRuler-rangeHighlightForeground: rgba(0, 122, 204, 0.6); ---vscode-editorOverviewRuler-errorForeground: rgba(255, 18, 18, 0.7); ---vscode-editorOverviewRuler-warningForeground: #cca700; ---vscode-editorOverviewRuler-infoForeground: #3794ff; ---vscode-editorBracketHighlight-foreground1: #ffd700; ---vscode-editorBracketHighlight-foreground2: #da70d6; ---vscode-editorBracketHighlight-foreground3: #179fff; ---vscode-editorBracketHighlight-foreground4: rgba(0, 0, 0, 0); ---vscode-editorBracketHighlight-foreground5: rgba(0, 0, 0, 0); ---vscode-editorBracketHighlight-foreground6: rgba(0, 0, 0, 0); ---vscode-editorBracketHighlight-unexpectedBracket\.foreground: rgba(255, 18, 18, 0.8); ---vscode-editorBracketPairGuide-background1: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-background2: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-background3: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-background4: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-background5: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-background6: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-activeBackground1: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-activeBackground2: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-activeBackground3: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-activeBackground4: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-activeBackground5: rgba(0, 0, 0, 0); ---vscode-editorBracketPairGuide-activeBackground6: rgba(0, 0, 0, 0); ---vscode-editorUnicodeHighlight-border: #cca700; ---vscode-diffEditor-move\.border: rgba(139, 139, 139, 0.61); ---vscode-diffEditor-moveActive\.border: #ffa500; ---vscode-diffEditor-unchangedRegionShadow: #000000; ---vscode-editorOverviewRuler-bracketMatchForeground: #a0a0a0; ---vscode-symbolIcon-arrayForeground: #cccccc; ---vscode-symbolIcon-booleanForeground: #cccccc; ---vscode-symbolIcon-classForeground: #ee9d28; ---vscode-symbolIcon-colorForeground: #cccccc; ---vscode-symbolIcon-constantForeground: #cccccc; ---vscode-symbolIcon-constructorForeground: #b180d7; ---vscode-symbolIcon-enumeratorForeground: #ee9d28; ---vscode-symbolIcon-enumeratorMemberForeground: #75beff; ---vscode-symbolIcon-eventForeground: #ee9d28; ---vscode-symbolIcon-fieldForeground: #75beff; ---vscode-symbolIcon-fileForeground: #cccccc; ---vscode-symbolIcon-folderForeground: #cccccc; ---vscode-symbolIcon-functionForeground: #b180d7; ---vscode-symbolIcon-interfaceForeground: #75beff; ---vscode-symbolIcon-keyForeground: #cccccc; ---vscode-symbolIcon-keywordForeground: #cccccc; ---vscode-symbolIcon-methodForeground: #b180d7; ---vscode-symbolIcon-moduleForeground: #cccccc; ---vscode-symbolIcon-namespaceForeground: #cccccc; ---vscode-symbolIcon-nullForeground: #cccccc; ---vscode-symbolIcon-numberForeground: #cccccc; ---vscode-symbolIcon-objectForeground: #cccccc; ---vscode-symbolIcon-operatorForeground: #cccccc; ---vscode-symbolIcon-packageForeground: #cccccc; ---vscode-symbolIcon-propertyForeground: #cccccc; ---vscode-symbolIcon-referenceForeground: #cccccc; ---vscode-symbolIcon-snippetForeground: #cccccc; ---vscode-symbolIcon-stringForeground: #cccccc; ---vscode-symbolIcon-structForeground: #cccccc; ---vscode-symbolIcon-textForeground: #cccccc; ---vscode-symbolIcon-typeParameterForeground: #cccccc; ---vscode-symbolIcon-unitForeground: #cccccc; ---vscode-symbolIcon-variableForeground: #75beff; ---vscode-actionBar-toggledBackground: #383a49; ---vscode-peekViewTitle-background: #252526; ---vscode-peekViewTitleLabel-foreground: #ffffff; ---vscode-peekViewTitleDescription-foreground: rgba(204, 204, 204, 0.7); ---vscode-peekView-border: #3794ff; ---vscode-peekViewResult-background: #1f1f1f; ---vscode-peekViewResult-lineForeground: #bbbbbb; ---vscode-peekViewResult-fileForeground: #ffffff; ---vscode-peekViewResult-selectionBackground: rgba(51, 153, 255, 0.2); ---vscode-peekViewResult-selectionForeground: #ffffff; ---vscode-peekViewEditor-background: #1f1f1f; ---vscode-peekViewEditorGutter-background: #1f1f1f; ---vscode-peekViewEditorStickyScroll-background: #1f1f1f; ---vscode-peekViewResult-matchHighlightBackground: rgba(187, 128, 9, 0.4); ---vscode-peekViewEditor-matchHighlightBackground: rgba(187, 128, 9, 0.4); ---vscode-editor-foldBackground: rgba(38, 79, 120, 0.3); ---vscode-editor-foldPlaceholderForeground: #808080; ---vscode-editorGutter-foldingControlForeground: #cccccc; ---vscode-editorSuggestWidget-background: #202020; ---vscode-editorSuggestWidget-border: #454545; ---vscode-editorSuggestWidget-foreground: #cccccc; ---vscode-editorSuggestWidget-selectedForeground: #ffffff; ---vscode-editorSuggestWidget-selectedIconForeground: #ffffff; ---vscode-editorSuggestWidget-selectedBackground: #04395e; ---vscode-editorSuggestWidget-highlightForeground: #2aaaff; ---vscode-editorSuggestWidget-focusHighlightForeground: #2aaaff; ---vscode-editorSuggestWidgetStatus-foreground: rgba(204, 204, 204, 0.5); ---vscode-inlineEdit-indicator\.foreground: #cccccc; ---vscode-inlineEdit-indicator\.background: #202020; ---vscode-inlineEdit-indicator\.border: #454545; ---vscode-inlineEdit-originalBackground: rgba(255, 0, 0, 0.08); ---vscode-inlineEdit-modifiedBackground: rgba(156, 204, 44, 0.08); ---vscode-inlineEdit-border: #3c3c3c; ---vscode-editorMarkerNavigationError-background: #f14c4c; ---vscode-editorMarkerNavigationError-headerBackground: rgba(241, 76, 76, 0.1); ---vscode-editorMarkerNavigationWarning-background: #cca700; ---vscode-editorMarkerNavigationWarning-headerBackground: rgba(204, 167, 0, 0.1); ---vscode-editorMarkerNavigationInfo-background: #3794ff; ---vscode-editorMarkerNavigationInfo-headerBackground: rgba(55, 148, 255, 0.1); ---vscode-editorMarkerNavigation-background: #1f1f1f; ---vscode-editor-linkedEditingBackground: rgba(255, 0, 0, 0.3); ---vscode-editor-wordHighlightBackground: rgba(87, 87, 87, 0.72); ---vscode-editor-wordHighlightStrongBackground: rgba(0, 73, 114, 0.72); ---vscode-editor-wordHighlightTextBackground: rgba(87, 87, 87, 0.72); ---vscode-editorOverviewRuler-wordHighlightForeground: rgba(160, 160, 160, 0.8); ---vscode-editorOverviewRuler-wordHighlightStrongForeground: rgba(192, 160, 192, 0.8); ---vscode-editorOverviewRuler-wordHighlightTextForeground: rgba(160, 160, 160, 0.8); ---vscode-editorHoverWidget-highlightForeground: #2aaaff; ---vscode-editor-placeholder\.foreground: rgba(255, 255, 255, 0.34); ---vscode-tab-activeBackground: #1f1f1f; ---vscode-tab-unfocusedActiveBackground: #1f1f1f; ---vscode-tab-inactiveBackground: #181818; ---vscode-tab-unfocusedInactiveBackground: #181818; ---vscode-tab-activeForeground: #ffffff; ---vscode-tab-inactiveForeground: #9d9d9d; ---vscode-tab-unfocusedActiveForeground: rgba(255, 255, 255, 0.5); ---vscode-tab-unfocusedInactiveForeground: rgba(157, 157, 157, 0.5); ---vscode-tab-hoverBackground: #1f1f1f; ---vscode-tab-unfocusedHoverBackground: #1f1f1f; ---vscode-tab-border: #2b2b2b; ---vscode-tab-lastPinnedBorder: rgba(204, 204, 204, 0.2); ---vscode-tab-activeBorder: #1f1f1f; ---vscode-tab-unfocusedActiveBorder: #1f1f1f; ---vscode-tab-activeBorderTop: #0078d4; ---vscode-tab-unfocusedActiveBorderTop: #2b2b2b; ---vscode-tab-selectedBorderTop: #6caddf; ---vscode-tab-selectedBackground: #222222; ---vscode-tab-selectedForeground: rgba(255, 255, 255, 0.63); ---vscode-tab-dragAndDropBorder: #ffffff; ---vscode-tab-activeModifiedBorder: #3399cc; ---vscode-tab-inactiveModifiedBorder: rgba(51, 153, 204, 0.5); ---vscode-tab-unfocusedActiveModifiedBorder: rgba(51, 153, 204, 0.5); ---vscode-tab-unfocusedInactiveModifiedBorder: rgba(51, 153, 204, 0.25); ---vscode-editorPane-background: #1f1f1f; ---vscode-editorGroupHeader-tabsBackground: #181818; ---vscode-editorGroupHeader-tabsBorder: #2b2b2b; ---vscode-editorGroupHeader-noTabsBackground: #1f1f1f; ---vscode-editorGroup-border: rgba(255, 255, 255, 0.09); ---vscode-editorGroup-dropBackground: rgba(83, 89, 93, 0.5); ---vscode-editorGroup-dropIntoPromptForeground: #cccccc; ---vscode-editorGroup-dropIntoPromptBackground: #202020; ---vscode-sideBySideEditor-horizontalBorder: rgba(255, 255, 255, 0.09); ---vscode-sideBySideEditor-verticalBorder: rgba(255, 255, 255, 0.09); ---vscode-panel-background: #181818; ---vscode-panel-border: #2b2b2b; ---vscode-panelTitle-activeForeground: #cccccc; ---vscode-panelTitle-inactiveForeground: #9d9d9d; ---vscode-panelTitle-activeBorder: #0078d4; ---vscode-panelInput-border: #2b2b2b; ---vscode-panel-dropBorder: #cccccc; ---vscode-panelSection-dropBackground: rgba(83, 89, 93, 0.5); ---vscode-panelSectionHeader-background: rgba(128, 128, 128, 0.2); ---vscode-panelSection-border: #2b2b2b; ---vscode-panelStickyScroll-background: #181818; ---vscode-panelStickyScroll-shadow: #000000; ---vscode-banner-background: #04395e; ---vscode-banner-foreground: #ffffff; ---vscode-banner-iconForeground: #3794ff; ---vscode-statusBar-foreground: #cccccc; ---vscode-statusBar-noFolderForeground: #cccccc; ---vscode-statusBar-background: #181818; ---vscode-statusBar-noFolderBackground: #1f1f1f; ---vscode-statusBar-border: #2b2b2b; ---vscode-statusBar-focusBorder: #0078d4; ---vscode-statusBar-noFolderBorder: #2b2b2b; ---vscode-statusBarItem-activeBackground: rgba(255, 255, 255, 0.18); ---vscode-statusBarItem-focusBorder: #0078d4; ---vscode-statusBarItem-hoverBackground: rgba(255, 255, 255, 0.12); ---vscode-statusBarItem-hoverForeground: #cccccc; ---vscode-statusBarItem-compactHoverBackground: rgba(255, 255, 255, 0.2); ---vscode-statusBarItem-prominentForeground: #cccccc; ---vscode-statusBarItem-prominentBackground: rgba(110, 118, 129, 0.4); ---vscode-statusBarItem-prominentHoverForeground: #cccccc; ---vscode-statusBarItem-prominentHoverBackground: rgba(0, 0, 0, 0.3); ---vscode-statusBarItem-errorBackground: #b91007; ---vscode-statusBarItem-errorForeground: #ffffff; ---vscode-statusBarItem-errorHoverForeground: #cccccc; ---vscode-statusBarItem-errorHoverBackground: rgba(255, 255, 255, 0.12); ---vscode-statusBarItem-warningBackground: #7a6400; ---vscode-statusBarItem-warningForeground: #ffffff; ---vscode-statusBarItem-warningHoverForeground: #cccccc; ---vscode-statusBarItem-warningHoverBackground: rgba(255, 255, 255, 0.12); ---vscode-activityBar-background: #181818; ---vscode-activityBar-foreground: #d7d7d7; ---vscode-activityBar-inactiveForeground: #868686; ---vscode-activityBar-border: #2b2b2b; ---vscode-activityBar-activeBorder: #0078d4; ---vscode-activityBar-dropBorder: #d7d7d7; ---vscode-activityBarBadge-background: #0078d4; ---vscode-activityBarBadge-foreground: #ffffff; ---vscode-activityBarTop-foreground: #e7e7e7; ---vscode-activityBarTop-activeBorder: #e7e7e7; ---vscode-activityBarTop-inactiveForeground: rgba(231, 231, 231, 0.6); ---vscode-activityBarTop-dropBorder: #e7e7e7; ---vscode-profileBadge-background: #4d4d4d; ---vscode-profileBadge-foreground: #ffffff; ---vscode-statusBarItem-remoteBackground: #0078d4; ---vscode-statusBarItem-remoteForeground: #ffffff; ---vscode-statusBarItem-remoteHoverForeground: #cccccc; ---vscode-statusBarItem-remoteHoverBackground: rgba(255, 255, 255, 0.12); ---vscode-statusBarItem-offlineBackground: #6c1717; ---vscode-statusBarItem-offlineForeground: #ffffff; ---vscode-statusBarItem-offlineHoverForeground: #cccccc; ---vscode-statusBarItem-offlineHoverBackground: rgba(255, 255, 255, 0.12); ---vscode-extensionBadge-remoteBackground: #0078d4; ---vscode-extensionBadge-remoteForeground: #ffffff; ---vscode-sideBar-background: #181818; ---vscode-sideBar-foreground: #cccccc; ---vscode-sideBar-border: #2b2b2b; ---vscode-sideBarTitle-background: #181818; ---vscode-sideBarTitle-foreground: #cccccc; ---vscode-sideBar-dropBackground: rgba(83, 89, 93, 0.5); ---vscode-sideBarSectionHeader-background: #181818; ---vscode-sideBarSectionHeader-foreground: #cccccc; ---vscode-sideBarSectionHeader-border: #2b2b2b; ---vscode-sideBarActivityBarTop-border: #2b2b2b; ---vscode-sideBarStickyScroll-background: #181818; ---vscode-sideBarStickyScroll-shadow: #000000; ---vscode-titleBar-activeForeground: #cccccc; ---vscode-titleBar-inactiveForeground: #9d9d9d; ---vscode-titleBar-activeBackground: #181818; ---vscode-titleBar-inactiveBackground: #1f1f1f; ---vscode-titleBar-border: #2b2b2b; ---vscode-menubar-selectionForeground: #cccccc; ---vscode-menubar-selectionBackground: rgba(90, 93, 94, 0.31); ---vscode-commandCenter-foreground: #cccccc; ---vscode-commandCenter-activeForeground: #cccccc; ---vscode-commandCenter-inactiveForeground: #9d9d9d; ---vscode-commandCenter-background: rgba(255, 255, 255, 0.05); ---vscode-commandCenter-activeBackground: rgba(255, 255, 255, 0.08); ---vscode-commandCenter-border: rgba(204, 204, 204, 0.2); ---vscode-commandCenter-activeBorder: rgba(204, 204, 204, 0.3); ---vscode-commandCenter-inactiveBorder: rgba(157, 157, 157, 0.25); ---vscode-notificationCenter-border: #313131; ---vscode-notificationToast-border: #313131; ---vscode-notifications-foreground: #cccccc; ---vscode-notifications-background: #1f1f1f; ---vscode-notificationLink-foreground: #4daafc; ---vscode-notificationCenterHeader-foreground: #cccccc; ---vscode-notificationCenterHeader-background: #1f1f1f; ---vscode-notifications-border: #2b2b2b; ---vscode-notificationsErrorIcon-foreground: #f14c4c; ---vscode-notificationsWarningIcon-foreground: #cca700; ---vscode-notificationsInfoIcon-foreground: #3794ff; ---vscode-inlineChat-foreground: #cccccc; ---vscode-inlineChat-background: #202020; ---vscode-inlineChat-border: #454545; ---vscode-inlineChat-shadow: rgba(0, 0, 0, 0.36); ---vscode-inlineChatInput-border: #454545; ---vscode-inlineChatInput-focusBorder: #0078d4; ---vscode-inlineChatInput-placeholderForeground: #989898; ---vscode-inlineChatInput-background: #313131; ---vscode-inlineChatDiff-inserted: rgba(156, 204, 44, 0.1); ---vscode-editorOverviewRuler-inlineChatInserted: rgba(156, 204, 44, 0.12); ---vscode-inlineChatDiff-removed: rgba(255, 0, 0, 0.1); ---vscode-editorOverviewRuler-inlineChatRemoved: rgba(255, 0, 0, 0.12); ---vscode-extensionButton-background: #0078d4; ---vscode-extensionButton-foreground: #ffffff; ---vscode-extensionButton-hoverBackground: #026ec1; ---vscode-extensionButton-separator: rgba(255, 255, 255, 0.4); ---vscode-extensionButton-prominentBackground: #0078d4; ---vscode-extensionButton-prominentForeground: #ffffff; ---vscode-extensionButton-prominentHoverBackground: #026ec1; ---vscode-chat-requestBorder: rgba(255, 255, 255, 0.1); ---vscode-chat-requestBackground: rgba(31, 31, 31, 0.62); ---vscode-chat-slashCommandBackground: #34414b; ---vscode-chat-slashCommandForeground: #40a6ff; ---vscode-chat-avatarBackground: #1f1f1f; ---vscode-chat-avatarForeground: #cccccc; ---vscode-chat-editedFileForeground: #e2c08d; ---vscode-terminal-foreground: #cccccc; ---vscode-terminal-selectionBackground: #264f78; ---vscode-terminal-inactiveSelectionBackground: #3a3d41; ---vscode-terminalCommandDecoration-defaultBackground: rgba(255, 255, 255, 0.25); ---vscode-terminalCommandDecoration-successBackground: #1b81a8; ---vscode-terminalCommandDecoration-errorBackground: #f14c4c; ---vscode-terminalOverviewRuler-cursorForeground: rgba(160, 160, 160, 0.8); ---vscode-terminal-border: #2b2b2b; ---vscode-terminalOverviewRuler-border: #010409; ---vscode-terminal-findMatchBackground: #9e6a03; ---vscode-terminal-hoverHighlightBackground: rgba(38, 79, 120, 0.13); ---vscode-terminal-findMatchHighlightBackground: rgba(234, 92, 0, 0.33); ---vscode-terminalOverviewRuler-findMatchForeground: rgba(209, 134, 22, 0.49); ---vscode-terminal-dropBackground: rgba(83, 89, 93, 0.5); ---vscode-terminal-tab\.activeBorder: #0078d4; ---vscode-terminal-initialHintForeground: rgba(255, 255, 255, 0.34); ---vscode-terminalStickyScrollHover-background: #2a2d2e; ---vscode-scmGraph-historyItemRefColor: #3794ff; ---vscode-scmGraph-historyItemRemoteRefColor: #b180d7; ---vscode-scmGraph-historyItemBaseRefColor: #ea5c00; ---vscode-scmGraph-historyItemHoverDefaultLabelForeground: #cccccc; ---vscode-scmGraph-historyItemHoverDefaultLabelBackground: #616161; ---vscode-scmGraph-historyItemHoverLabelForeground: #ffffff; ---vscode-scmGraph-historyItemHoverAdditionsForeground: #81b88b; ---vscode-scmGraph-historyItemHoverDeletionsForeground: #c74e39; ---vscode-scmGraph-foreground1: #ffb000; ---vscode-scmGraph-foreground2: #dc267f; ---vscode-scmGraph-foreground3: #994f00; ---vscode-scmGraph-foreground4: #40b0a6; ---vscode-scmGraph-foreground5: #b66dff; ---vscode-commentsView-resolvedIcon: rgba(204, 204, 204, 0.5); ---vscode-commentsView-unresolvedIcon: #0078d4; ---vscode-editorCommentsWidget-replyInputBackground: #252526; ---vscode-editorCommentsWidget-resolvedBorder: rgba(204, 204, 204, 0.5); ---vscode-editorCommentsWidget-unresolvedBorder: #0078d4; ---vscode-editorCommentsWidget-rangeBackground: rgba(0, 120, 212, 0.1); ---vscode-editorCommentsWidget-rangeActiveBackground: rgba(0, 120, 212, 0.1); ---vscode-editorGutter-commentRangeForeground: #37373d; ---vscode-editorOverviewRuler-commentForeground: #37373d; ---vscode-editorOverviewRuler-commentUnresolvedForeground: #37373d; ---vscode-editorGutter-commentGlyphForeground: #cccccc; ---vscode-editorGutter-commentUnresolvedGlyphForeground: #cccccc; ---vscode-activityWarningBadge-foreground: #000000; ---vscode-activityWarningBadge-background: #cca700; ---vscode-activityErrorBadge-foreground: #000000; ---vscode-activityErrorBadge-background: #f14c4c; ---vscode-ports-iconRunningProcessForeground: #369432; ---vscode-editorWatermark-foreground: rgba(204, 204, 204, 0.6); ---vscode-settings-headerForeground: #ffffff; ---vscode-settings-settingsHeaderHoverForeground: rgba(255, 255, 255, 0.7); ---vscode-settings-modifiedItemIndicator: rgba(187, 128, 9, 0.4); ---vscode-settings-headerBorder: #2b2b2b; ---vscode-settings-sashBorder: #2b2b2b; ---vscode-settings-dropdownBackground: #313131; ---vscode-settings-dropdownForeground: #cccccc; ---vscode-settings-dropdownBorder: #3c3c3c; ---vscode-settings-dropdownListBorder: #454545; ---vscode-settings-checkboxBackground: #313131; ---vscode-settings-checkboxForeground: #cccccc; ---vscode-settings-checkboxBorder: #3c3c3c; ---vscode-settings-textInputBackground: #313131; ---vscode-settings-textInputForeground: #cccccc; ---vscode-settings-textInputBorder: #3c3c3c; ---vscode-settings-numberInputBackground: #313131; ---vscode-settings-numberInputForeground: #cccccc; ---vscode-settings-numberInputBorder: #3c3c3c; ---vscode-settings-focusedRowBackground: rgba(42, 45, 46, 0.6); ---vscode-settings-rowHoverBackground: rgba(42, 45, 46, 0.3); ---vscode-settings-focusedRowBorder: #0078d4; ---vscode-keybindingTable-headerBackground: rgba(204, 204, 204, 0.04); ---vscode-keybindingTable-rowsBackground: rgba(204, 204, 204, 0.04); ---vscode-debugToolBar-background: #181818; ---vscode-debugIcon-startForeground: #89d185; ---vscode-notebook-cellBorderColor: #37373d; ---vscode-notebook-focusedEditorBorder: #0078d4; ---vscode-notebookStatusSuccessIcon-foreground: #89d185; ---vscode-notebookEditorOverviewRuler-runningCellForeground: #89d185; ---vscode-notebookStatusErrorIcon-foreground: #f85149; ---vscode-notebookStatusRunningIcon-foreground: #cccccc; ---vscode-notebook-cellToolbarSeparator: rgba(128, 128, 128, 0.35); ---vscode-notebook-selectedCellBackground: #37373d; ---vscode-notebook-selectedCellBorder: #37373d; ---vscode-notebook-focusedCellBorder: #0078d4; ---vscode-notebook-inactiveFocusedCellBorder: #37373d; ---vscode-notebook-cellStatusBarItemHoverBackground: rgba(255, 255, 255, 0.15); ---vscode-notebook-cellInsertionIndicator: #0078d4; ---vscode-notebookScrollbarSlider-background: rgba(121, 121, 121, 0.4); ---vscode-notebookScrollbarSlider-hoverBackground: rgba(100, 100, 100, 0.7); ---vscode-notebookScrollbarSlider-activeBackground: rgba(191, 191, 191, 0.4); ---vscode-notebook-symbolHighlightBackground: rgba(255, 255, 255, 0.04); ---vscode-notebook-cellEditorBackground: #181818; ---vscode-notebook-editorBackground: #1f1f1f; ---vscode-debugIcon-breakpointForeground: #e51400; ---vscode-debugIcon-breakpointDisabledForeground: #848484; ---vscode-debugIcon-breakpointUnverifiedForeground: #848484; ---vscode-debugIcon-breakpointCurrentStackframeForeground: #ffcc00; ---vscode-debugIcon-breakpointStackframeForeground: #89d185; ---vscode-editor-stackFrameHighlightBackground: rgba(255, 255, 0, 0.2); ---vscode-editor-focusedStackFrameHighlightBackground: rgba(122, 189, 122, 0.3); ---vscode-multiDiffEditor-headerBackground: #262626; ---vscode-multiDiffEditor-background: #1f1f1f; ---vscode-multiDiffEditor-border: #2b2b2b; ---vscode-editorGutter-modifiedBackground: #0078d4; ---vscode-editorGutter-addedBackground: #2ea043; ---vscode-editorGutter-deletedBackground: #f85149; ---vscode-minimapGutter-modifiedBackground: #0078d4; ---vscode-minimapGutter-addedBackground: #2ea043; ---vscode-minimapGutter-deletedBackground: #f85149; ---vscode-editorOverviewRuler-modifiedForeground: rgba(0, 120, 212, 0.6); ---vscode-editorOverviewRuler-addedForeground: rgba(46, 160, 67, 0.6); ---vscode-editorOverviewRuler-deletedForeground: rgba(248, 81, 73, 0.6); ---vscode-interactive-activeCodeBorder: #007acc; ---vscode-interactive-inactiveCodeBorder: #37373d; ---vscode-testing-iconFailed: #f14c4c; ---vscode-testing-iconErrored: #f14c4c; ---vscode-testing-iconPassed: #73c991; ---vscode-testing-runAction: #73c991; ---vscode-testing-iconQueued: #cca700; ---vscode-testing-iconUnset: #848484; ---vscode-testing-iconSkipped: #848484; ---vscode-testing-peekBorder: #f14c4c; ---vscode-testing-messagePeekBorder: #3794ff; ---vscode-testing-peekHeaderBackground: rgba(241, 76, 76, 0.1); ---vscode-testing-messagePeekHeaderBackground: rgba(55, 148, 255, 0.1); ---vscode-testing-coveredBackground: rgba(156, 204, 44, 0.2); ---vscode-testing-coveredBorder: rgba(156, 204, 44, 0.15); ---vscode-testing-coveredGutterBackground: rgba(156, 204, 44, 0.12); ---vscode-testing-uncoveredBranchBackground: #781212; ---vscode-testing-uncoveredBackground: rgba(255, 0, 0, 0.2); ---vscode-testing-uncoveredBorder: rgba(255, 0, 0, 0.15); ---vscode-testing-uncoveredGutterBackground: rgba(255, 0, 0, 0.3); ---vscode-testing-coverCountBadgeBackground: #616161; ---vscode-testing-coverCountBadgeForeground: #f8f8f8; ---vscode-testing-message\.error\.decorationForeground: #f14c4c; ---vscode-testing-message\.error\.lineBackground: rgba(255, 0, 0, 0.1); ---vscode-testing-message\.info\.decorationForeground: rgba(204, 204, 204, 0.5); ---vscode-testing-iconErrored\.retired: rgba(241, 76, 76, 0.7); ---vscode-testing-iconFailed\.retired: rgba(241, 76, 76, 0.7); ---vscode-testing-iconPassed\.retired: rgba(115, 201, 145, 0.7); ---vscode-testing-iconQueued\.retired: rgba(204, 167, 0, 0.7); ---vscode-testing-iconUnset\.retired: rgba(132, 132, 132, 0.7); ---vscode-testing-iconSkipped\.retired: rgba(132, 132, 132, 0.7); ---vscode-searchEditor-textInputBorder: #3c3c3c; ---vscode-debugExceptionWidget-border: #a31515; ---vscode-debugExceptionWidget-background: #420b0d; ---vscode-editor-inlineValuesForeground: rgba(255, 255, 255, 0.5); ---vscode-editor-inlineValuesBackground: rgba(255, 200, 0, 0.2); ---vscode-statusBar-debuggingBackground: #0078d4; ---vscode-statusBar-debuggingForeground: #ffffff; ---vscode-statusBar-debuggingBorder: #2b2b2b; ---vscode-commandCenter-debuggingBackground: rgba(0, 120, 212, 0.26); ---vscode-debugTokenExpression-name: #c586c0; ---vscode-debugTokenExpression-type: #4a90e2; ---vscode-debugTokenExpression-value: rgba(204, 204, 204, 0.6); ---vscode-debugTokenExpression-string: #ce9178; ---vscode-debugTokenExpression-boolean: #4e94ce; ---vscode-debugTokenExpression-number: #b5cea8; ---vscode-debugTokenExpression-error: #f48771; ---vscode-debugView-exceptionLabelForeground: #cccccc; ---vscode-debugView-exceptionLabelBackground: #6c2022; ---vscode-debugView-stateLabelForeground: #cccccc; ---vscode-debugView-stateLabelBackground: rgba(136, 136, 136, 0.27); ---vscode-debugView-valueChangedHighlight: #569cd6; ---vscode-debugConsole-infoForeground: #3794ff; ---vscode-debugConsole-warningForeground: #cca700; ---vscode-debugConsole-errorForeground: #f85149; ---vscode-debugConsole-sourceForeground: #cccccc; ---vscode-debugConsoleInputIcon-foreground: #cccccc; ---vscode-debugIcon-pauseForeground: #75beff; ---vscode-debugIcon-stopForeground: #f48771; ---vscode-debugIcon-disconnectForeground: #f48771; ---vscode-debugIcon-restartForeground: #89d185; ---vscode-debugIcon-stepOverForeground: #75beff; ---vscode-debugIcon-stepIntoForeground: #75beff; ---vscode-debugIcon-stepOutForeground: #75beff; ---vscode-debugIcon-continueForeground: #75beff; ---vscode-debugIcon-stepBackForeground: #75beff; ---vscode-mergeEditor-change\.background: rgba(155, 185, 85, 0.2); ---vscode-mergeEditor-change\.word\.background: rgba(156, 204, 44, 0.2); ---vscode-mergeEditor-changeBase\.background: #4b1818; ---vscode-mergeEditor-changeBase\.word\.background: #6f1313; ---vscode-mergeEditor-conflict\.unhandledUnfocused\.border: rgba(255, 166, 0, 0.48); ---vscode-mergeEditor-conflict\.unhandledFocused\.border: #ffa600; ---vscode-mergeEditor-conflict\.handledUnfocused\.border: rgba(134, 134, 134, 0.29); ---vscode-mergeEditor-conflict\.handledFocused\.border: rgba(193, 193, 193, 0.8); ---vscode-mergeEditor-conflict\.handled\.minimapOverViewRuler: rgba(173, 172, 168, 0.93); ---vscode-mergeEditor-conflict\.unhandled\.minimapOverViewRuler: #fcba03; ---vscode-mergeEditor-conflictingLines\.background: rgba(255, 234, 0, 0.28); ---vscode-mergeEditor-conflict\.input1\.background: rgba(64, 200, 174, 0.2); ---vscode-mergeEditor-conflict\.input2\.background: rgba(64, 166, 255, 0.2); ---vscode-extensionIcon-starForeground: #ff8e00; ---vscode-extensionIcon-verifiedForeground: #4daafc; ---vscode-extensionIcon-preReleaseForeground: #1d9271; ---vscode-extensionIcon-sponsorForeground: #d758b3; ---vscode-terminal-ansiBlack: #000000; ---vscode-terminal-ansiRed: #cd3131; ---vscode-terminal-ansiGreen: #0dbc79; ---vscode-terminal-ansiYellow: #e5e510; ---vscode-terminal-ansiBlue: #2472c8; ---vscode-terminal-ansiMagenta: #bc3fbc; ---vscode-terminal-ansiCyan: #11a8cd; ---vscode-terminal-ansiWhite: #e5e5e5; ---vscode-terminal-ansiBrightBlack: #666666; ---vscode-terminal-ansiBrightRed: #f14c4c; ---vscode-terminal-ansiBrightGreen: #23d18b; ---vscode-terminal-ansiBrightYellow: #f5f543; ---vscode-terminal-ansiBrightBlue: #3b8eea; ---vscode-terminal-ansiBrightMagenta: #d670d6; ---vscode-terminal-ansiBrightCyan: #29b8db; ---vscode-terminal-ansiBrightWhite: #e5e5e5; ---vscode-simpleFindWidget-sashBorder: #454545; ---vscode-terminalCommandGuide-foreground: #37373d; ---vscode-welcomePage-tileBackground: #2b2b2b; ---vscode-welcomePage-tileHoverBackground: #262626; ---vscode-welcomePage-tileBorder: rgba(255, 255, 255, 0.1); ---vscode-welcomePage-progress\.background: #313131; ---vscode-welcomePage-progress\.foreground: #0078d4; ---vscode-walkthrough-stepTitle\.foreground: #ffffff; ---vscode-walkThrough-embeddedEditorBackground: rgba(0, 0, 0, 0.4); ---vscode-profiles-sashBorder: #2b2b2b; ---vscode-gitDecoration-addedResourceForeground: #81b88b; ---vscode-gitDecoration-modifiedResourceForeground: #e2c08d; ---vscode-gitDecoration-deletedResourceForeground: #c74e39; ---vscode-gitDecoration-renamedResourceForeground: #73c991; ---vscode-gitDecoration-untrackedResourceForeground: #73c991; ---vscode-gitDecoration-ignoredResourceForeground: #8c8c8c; ---vscode-gitDecoration-stageModifiedResourceForeground: #e2c08d; ---vscode-gitDecoration-stageDeletedResourceForeground: #c74e39; ---vscode-gitDecoration-conflictingResourceForeground: #e4676b; ---vscode-gitDecoration-submoduleResourceForeground: #8db9e2; ---vscode-errorLens-errorBackground: rgba(228, 84, 84, 0.11); ---vscode-errorLens-errorMessageBackground: rgba(228, 84, 84, 0.1); ---vscode-errorLens-errorRangeBackground: rgba(228, 84, 84, 0.1); ---vscode-errorLens-errorBackgroundLight: rgba(228, 84, 84, 0.13); ---vscode-errorLens-errorForeground: #ff6464; ---vscode-errorLens-errorForegroundLight: #e45454; ---vscode-errorLens-warningBackground: rgba(255, 148, 47, 0.11); ---vscode-errorLens-warningMessageBackground: rgba(255, 148, 47, 0.1); ---vscode-errorLens-warningRangeBackground: rgba(255, 148, 47, 0.1); ---vscode-errorLens-warningBackgroundLight: rgba(255, 148, 47, 0.13); ---vscode-errorLens-warningForeground: #fa973a; ---vscode-errorLens-warningForegroundLight: #ff942f; ---vscode-errorLens-infoBackground: rgba(0, 183, 228, 0.13); ---vscode-errorLens-infoMessageBackground: rgba(0, 183, 228, 0.1); ---vscode-errorLens-infoRangeBackground: rgba(0, 183, 228, 0.1); ---vscode-errorLens-infoBackgroundLight: rgba(0, 183, 228, 0.13); ---vscode-errorLens-infoForeground: #00b7e4; ---vscode-errorLens-infoForegroundLight: #00b7e4; ---vscode-errorLens-hintBackground: rgba(23, 162, 162, 0.13); ---vscode-errorLens-hintMessageBackground: rgba(23, 162, 162, 0.1); ---vscode-errorLens-hintRangeBackground: rgba(23, 162, 162, 0.1); ---vscode-errorLens-hintBackgroundLight: rgba(23, 162, 162, 0.13); ---vscode-errorLens-hintForeground: #2faf64; ---vscode-errorLens-hintForegroundLight: #2faf64; ---vscode-errorLens-statusBarIconErrorForeground: #ff6464; ---vscode-errorLens-statusBarIconWarningForeground: #fa973a; ---vscode-errorLens-statusBarErrorForeground: #ff6464; ---vscode-errorLens-statusBarWarningForeground: #fa973a; ---vscode-errorLens-statusBarInfoForeground: #00b7e4; ---vscode-errorLens-statusBarHintForeground: #2faf64; From 9ec324a6a4f554fa9387558f7aa5580e8f6cc47e Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:22:53 +0200 Subject: [PATCH 04/17] Rewrite extension.ts: keep only auth, theia init, and three commands --- src/extension.ts | 295 +++++------------------------------------------ 1 file changed, 30 insertions(+), 265 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 4644653..8f0d6d0 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,313 +1,78 @@ -// The module 'vscode' contains the VS Code extensibility API -// Import the module and reference it with the alias vscode in your code below import * as vscode from "vscode"; -import { buildCourseOptions } from "./course/course"; -import { buildExerciseOptions, cloneCurrentExercise } from "./exercise/exercise"; -import { SidebarProvider } from "./sidebar/sidebarProvider"; import { ArtemisAuthenticationProvider, AUTH_ID } from "./authentication/authentication_provider"; -import { clearRepoState, setDisplayedState, getState } from "./shared/state"; -import { sync_problem_statement_with_workspace } from "./problemStatement/problem_statement"; -import { NotAuthenticatedError } from "./authentication/not_authenticated.error"; import { initTheia, loadTheiaEnv, theiaEnv } from "./theia/theia"; import { initSettings } from "./shared/settings"; -import { detectRepoCourseAndExercise, submitCurrentWorkspace } from "./shared/repository.service"; -import { umlFileProvider } from "./problemStatement/uml.db"; -import { RealtimeSyncService } from "./participation/realtime-sync.service"; -export var authenticationProvider: ArtemisAuthenticationProvider; - -// This method is called when your extension is activated -// Your extension is activated the very first time the command is executed export async function activate(context: vscode.ExtensionContext) { - // This line of code will only be executed once when your extension is activated - console.log('Congratulations, your extension "scorpio" is now active!'); - - // Load credentials first (may poll credential bridge if configured) - // Blocks the activation until the credentials are loaded await loadTheiaEnv(); - await initTheia(); - initSettings(); - const realtimeSync = new RealtimeSyncService(); - context.subscriptions.push(realtimeSync); - initAuthentication(context, realtimeSync); - - const sidebar = initSidebar(context); - - // init UmlPreview - context.subscriptions.push( - vscode.workspace.registerFileSystemProvider("uml-preview", umlFileProvider, { - isReadonly: true, - }), - ); - registerCommands(context, sidebar, realtimeSync); - - listenToEvents(); - - detectRepoCourseAndExercise().catch((e) => { - console.error(e); - }); + const authProvider = new ArtemisAuthenticationProvider(context.secrets); + context.subscriptions.push(authProvider); - realtimeSync.start().catch((e) => { - console.error(e); - }); -} - -function initAuthentication(context: vscode.ExtensionContext, realtimeSync: RealtimeSyncService) { - authenticationProvider = new ArtemisAuthenticationProvider(context.secrets); - - context.subscriptions.push(authenticationProvider); - - (async () => { - // check if user is already authenticated - // is needed for the login button to be displayed on the profile button - - // Try to get existing session silently first - let session = await vscode.authentication.getSession(AUTH_ID, [], { silent: true }); - - // If no session exists but we have credentials, create one silently - if (!session && theiaEnv.ARTEMIS_TOKEN !== undefined) { - session = await authenticationProvider.createSession([]); - } - - vscode.commands.executeCommand("setContext", "scorpio.authenticated", session !== undefined); - })(); + let session = await vscode.authentication.getSession(AUTH_ID, [], { silent: true }); + if (!session && theiaEnv.ARTEMIS_TOKEN !== undefined) { + session = await authProvider.createSession([]); + } + vscode.commands.executeCommand("setContext", "scorpio.authenticated", session !== undefined); - authenticationProvider.onAuthSessionsChange.event(({ added, removed }) => { + authProvider.onAuthSessionsChange.event(({ added, removed }) => { if (added && added.length > 0) { vscode.commands.executeCommand("setContext", "scorpio.authenticated", true); - vscode.commands.executeCommand("scorpio.workspace.detectRepo"); - realtimeSync.start().catch((e) => { - console.error(e); - }); - return; } - if (removed && removed.length > 0) { vscode.commands.executeCommand("setContext", "scorpio.authenticated", false); - - clearRepoState(); - setDisplayedState(undefined, undefined); - return; } }); -} -function initSidebar(context: vscode.ExtensionContext): SidebarProvider { - // register sidebar for problem statement - const sidebarProvider = new SidebarProvider( - context.extensionUri, - authenticationProvider.onAuthSessionsChange, - ); context.subscriptions.push( - vscode.window.registerWebviewViewProvider("artemis-sidebar", sidebarProvider, { - webviewOptions: { retainContextWhenHidden: true }, + vscode.workspace.onDidChangeConfiguration(async (e) => { + if (!e.affectsConfiguration("scorpio.artemis.apiBaseUrl")) { + return; + } + if (theiaEnv.ARTEMIS_URL) { + return; + } + await authProvider.removeSession(); + vscode.commands.executeCommand("workbench.action.reloadWindow"); }), ); - return sidebarProvider; -} - -function registerCommands( - context: vscode.ExtensionContext, - sidebar: SidebarProvider, - realtimeSync: RealtimeSyncService, -) { context.subscriptions.push( vscode.commands.registerCommand("scorpio.restart", () => { - deactivate(); - activate(context); + vscode.commands.executeCommand("workbench.action.reloadWindow"); }), ); - // command to login context.subscriptions.push( vscode.commands.registerCommand("scorpio.login", async () => { try { - const token = await vscode.authentication.getSession(AUTH_ID, [], { + const session = await vscode.authentication.getSession(AUTH_ID, [], { createIfNone: true, }); - if (!token) { + if (!session) { vscode.window.showErrorMessage("Login failed"); - return; } - } catch (e) { - _errorMessage(e, LogLevel.ERROR, "Failed to login"); + } catch (e: unknown) { + const message = e instanceof Error ? e.message : String(e); + vscode.window.showErrorMessage(`Failed to login: ${message}`); } }), ); - // command to logout context.subscriptions.push( vscode.commands.registerCommand("scorpio.logout", async () => { - vscode.window - .showWarningMessage("Sign out from Artemis - Scorpio", { modal: true }, "Sign out") - .then((value) => { - if (value === "Sign out") { - authenticationProvider.removeSession(); - vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - } - }); - }), - ); - - // command to select a course and exercise - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.displayExercise", async () => { - try { - const course = await buildCourseOptions(); - - const exercise = await buildExerciseOptions(course); - - setDisplayedState(course, exercise); - } catch (e) { - _errorMessage(e, LogLevel.ERROR, "Failed to display Exercise"); - } - }), - ); - - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.displayedExercise.back", () => { - const state = getState(); - if (state.displayedExercise) { - // only remove exercise to get into exercise selection - setDisplayedState(state.displayedCourse, undefined); - } else { - // remove course to get into course selection - setDisplayedState(undefined, undefined); - } - }), - ); - - // command to clone repository - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.displayedExercise.clone", async () => { - try { - await cloneCurrentExercise(); - // In Theia mode the repo is materialized into the workspace root, - // so we can detect it immediately and update repoKey without a round-trip. - await detectRepoCourseAndExercise(); - await realtimeSync.refreshNow(); - } catch (e) { - _errorMessage(e, LogLevel.ERROR, "Failed to clone repository"); - } - }), - ); - - // command to submit workspace - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.workspace.submit", async () => { - try { - await submitCurrentWorkspace(); - } catch (e) { - _errorMessage(e, LogLevel.ERROR, "Failed to submit workspace"); + const choice = await vscode.window.showWarningMessage( + "Sign out from Artemis - Scorpio", + { modal: true }, + "Sign out", + ); + if (choice === "Sign out") { + await authProvider.removeSession(); } }), ); - - // command to detect repo in workspace - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.workspace.detectRepo", async () => { - detectRepoCourseAndExercise().catch((e) => { - _errorMessage(e, LogLevel.ERROR, "Failed to detect repo"); - }); - }), - ); - - // command to sync problem statement with workspace - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.workspace.sync", async () => { - sync_problem_statement_with_workspace().catch((e) => { - _errorMessage(e, LogLevel.ERROR, "Failed to sync workspace"); - }); - }), - ); - - // command to refresh sidebar - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.sidebar.refresh", () => { - sidebar.resolveWebviewView(sidebar._view!); - }), - ); -} - -function listenToEvents() { - // listen to workspace changes to display problem statement - vscode.workspace.onDidChangeWorkspaceFolders(() => { - detectRepoCourseAndExercise().catch((e) => { - console.error(e); - }); - }); -} - -enum LogLevel { - INFO = "info", - ERROR = "error", - WARN = "warn", -} -function _errorMessage(e: any, logLevel: LogLevel = LogLevel.ERROR, messagePrefix: string = "") { - switch (logLevel) { - case LogLevel.INFO: - console.info(e); - if (e instanceof NotAuthenticatedError) { - vscode.window - .showInformationMessage(`${messagePrefix}: ${e.message}`, "Login") - .then((value) => { - if (value === "Login") { - vscode.commands.executeCommand("scorpio.login"); - } - }); - return; - } - if (e instanceof Error) { - vscode.window.showInformationMessage(`${messagePrefix}: ${e.message}`); - return; - } - - vscode.window.showInformationMessage(`${messagePrefix}: ${e}`); - break; - case LogLevel.ERROR: - console.error(e); - if (e instanceof NotAuthenticatedError) { - vscode.window.showErrorMessage(`${messagePrefix}: ${e.message}`, "Login").then((value) => { - if (value === "Login") { - vscode.commands.executeCommand("scorpio.login"); - } - }); - return; - } - if (e instanceof Error) { - vscode.window.showErrorMessage(`${messagePrefix}: ${e.message}`); - return; - } - - vscode.window.showErrorMessage(`${messagePrefix}: ${e}`); - break; - case LogLevel.WARN: - console.warn(e); - if (e instanceof NotAuthenticatedError) { - vscode.window - .showWarningMessage(`${messagePrefix}: ${e.message}`, "Login") - .then((value) => { - if (value === "Login") { - vscode.commands.executeCommand("scorpio.login"); - } - }); - return; - } - if (e instanceof Error) { - vscode.window.showWarningMessage(`${messagePrefix}: ${e.message}`); - return; - } - - vscode.window.showWarningMessage(`${messagePrefix}: ${e}`); - break; - } } -// This method is called when your extension is deactivated export function deactivate() {} From 480a319c7c029e7509a772fb0654be10431452bc Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:23:07 +0200 Subject: [PATCH 05/17] Strip settings.ts: remove circular dep, easter egg, and restart logic --- src/shared/settings.ts | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/shared/settings.ts b/src/shared/settings.ts index b740796..09e438e 100644 --- a/src/shared/settings.ts +++ b/src/shared/settings.ts @@ -1,11 +1,9 @@ import * as vscode from "vscode"; -import { authenticationProvider } from "../extension"; import { theiaEnv } from "../theia/theia"; export type Settings = { base_url: string | undefined; default_repo_path: string | undefined; - easter_egg: boolean; }; export var settings: Settings; @@ -34,16 +32,13 @@ function getSettings(): Settings { .getConfiguration("scorpio") .get("defaults.repoPath"); - const easter_egg = vscode.workspace.getConfiguration("scorpio").get("?") ?? false; - return { base_url: base_url, default_repo_path: default_repo_path, - easter_egg: easter_egg, }; } -async function handleSettingsChange(e: vscode.ConfigurationChangeEvent) { +function handleSettingsChange(e: vscode.ConfigurationChangeEvent) { if (e.affectsConfiguration("scorpio.artemis.apiBaseUrl")) { if (theiaEnv.ARTEMIS_URL) { console.warn("Artemis URL can not be changed in theia environment"); @@ -57,10 +52,6 @@ async function handleSettingsChange(e: vscode.ConfigurationChangeEvent) { vscode.window.showErrorMessage("Artemis Base URL not set. Please set it in the settings."); } settings.base_url = base_url; - - await authenticationProvider.removeSession(); - console.warn("Restarting extension"); - vscode.commands.executeCommand("scorpio.restart"); } if (e.affectsConfiguration("scorpio.defaults.repoPath")) { @@ -80,9 +71,4 @@ async function handleSettingsChange(e: vscode.ConfigurationChangeEvent) { .get("defaults.repoPath"); settings.default_repo_path = default_repo_path; } - - if (e.affectsConfiguration("scorpio.?")) { - const easter_egg = vscode.workspace.getConfiguration("scorpio").get("?") ?? false; - settings.easter_egg = easter_egg; - } } From 8e3e477cb12004ed3b42bc20b41c305558f854d8 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:23:32 +0200 Subject: [PATCH 06/17] Strip cloning.service.ts: remove cloneUserRepo and dead imports --- src/participation/cloning.service.ts | 94 +--------------------------- 1 file changed, 1 insertion(+), 93 deletions(-) diff --git a/src/participation/cloning.service.ts b/src/participation/cloning.service.ts index 88886f9..54166e7 100644 --- a/src/participation/cloning.service.ts +++ b/src/participation/cloning.service.ts @@ -1,15 +1,7 @@ -import * as vscode from "vscode"; -import { settings } from "../shared/settings"; -import { NotAuthenticatedError } from "../authentication/not_authenticated.error"; -import { AUTH_ID } from "../authentication/authentication_provider"; -import { getState } from "../shared/state"; import simpleGit from "simple-git"; import { tmpdir } from "os"; import * as path from "path"; import * as fs from "fs/promises"; -import { retrieveVcsAccessToken } from "../artemis/authentication.client"; -import { getWorkspaceFolder, theiaEnv } from "../theia/theia"; -import { addVcsTokenToUrl } from "@shared/models/participation.model"; type CloneMode = "subdirectory" | "workspace-root"; @@ -24,87 +16,14 @@ type PreservedWorkspaceEntry = { isDirectory: boolean; }; -// Theia images seed a few workspace-owned paths into /home/project before Scorpio runs. -// We preserve only those exact paths. Everything else in the workspace should come from -// the exercise repository so repo content can fully define the student's project. const THEIA_PRESERVED_PATHS = [".vscode/settings.json", ".theia", "persisted", "lost+found"]; -export async function cloneUserRepo(repoUrl: string, username: string) { - // get folder to clone repo into - let destinationPath: string | undefined; - let cloneOptions: CloneOptions | undefined; - if (theiaEnv.THEIA_FLAG) { - // Check if a workspace is available in which the exercise can be cloned - destinationPath = getWorkspaceFolder()?.fsPath; - if (!destinationPath) { - throw new Error("No workspace folder available to clone repository"); - } - cloneOptions = { - mode: "workspace-root", - preservedPaths: THEIA_PRESERVED_PATHS, - }; - } else { - // Open a dialog to select the folder where the repo will be cloned - destinationPath = ( - await vscode.window.showOpenDialog({ - canSelectFolders: true, - openLabel: "Select folder to clone into", - defaultUri: vscode.Uri.file(settings.default_repo_path ?? ""), - }) - )?.at(0)?.fsPath; - - if (!destinationPath) { - throw new Error("No folder selected"); - } - } - - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: false, - }); - if (!session) { - throw new NotAuthenticatedError(); - } - - const vcsToken = await retrieveVcsAccessToken( - session.accessToken, - getState().displayedExercise?.studentParticipations![0].id!, - ); - // Clone the repository - const cloneUrlWithToken = new URL(addVcsTokenToUrl(repoUrl, username, vcsToken)); - const clonePath = await cloneByGivenURL(cloneUrlWithToken, destinationPath, cloneOptions); - - if (!theiaEnv.THEIA_FLAG) { - // Prompt the user to open the cloned folder in a new workspace - const openIn = await vscode.window.showInformationMessage( - `Would you like to open the cloned repository?`, - { modal: true }, - "Open", - "Open in New Window", - "Cancel", - ); - - if (openIn === "Open") { - vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(clonePath)); - } else if (openIn === "Open in New Window") { - vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(clonePath), true); - } - } -} - -/** - * - * @param cloneUrl which includes all credentials necessary to clone the repository - * @param destinationPath the folder path where the repository should be cloned into - * @returns the repository path of the cloned repository - */ export async function cloneByGivenURL( cloneUrl: URL, destinationPath: string, options?: CloneOptions, ): Promise { if (options?.mode === "workspace-root") { - // Theia mounts a fixed working directory and we want the repository content at that root - // instead of inside an extra subfolder. return cloneIntoWorkspaceRoot( cloneUrl, destinationPath, @@ -112,7 +31,7 @@ export async function cloneByGivenURL( ); } - const repoName = path.basename(cloneUrl.pathname, ".git"); // Use repository name as subdirectory name + const repoName = path.basename(cloneUrl.pathname, ".git"); const clonePath = path.join(destinationPath, repoName); const gitForClone = simpleGit(destinationPath); @@ -131,8 +50,6 @@ async function cloneIntoWorkspaceRoot( workspacePath: string, preservedPaths: string[] = [], ): Promise { - // Store preserved workspace-owned files outside the mounted workspace so we can safely - // clear /home/project and let `git clone ... .` materialize the repository at the root. const backupRoot = await fs.mkdtemp(path.join(tmpdir(), "scorpio-workspace-clone-")); const preservedEntries = await movePreservedWorkspaceEntries( workspacePath, @@ -144,12 +61,9 @@ async function cloneIntoWorkspaceRoot( let restoredEntries: PreservedWorkspaceEntry[] = []; try { - // After preserved entries have been moved out, the remaining workspace content should not - // survive. This ensures repo files win over any preexisting files from the image or volume. await clearDirectory(workspacePath); const gitForClone = simpleGit(workspacePath); - // Clone into "." so the exercise repository becomes the workspace root in Theia. await gitForClone.clone(cloneUrl.toString(), "."); cloneSucceeded = true; @@ -183,8 +97,6 @@ async function movePreservedWorkspaceEntries( const backupPath = path.join(backupRoot, relativePath); await ensureParentDirectory(backupPath); - // Copy + remove is intentional here: the workspace is usually a mounted volume while the - // temp directory may live on another filesystem, so rename() would fail with EXDEV. await copyPath(sourcePath, backupPath, sourceStats.isDirectory()); await fs.rm(sourcePath, { recursive: true, force: true }); @@ -209,8 +121,6 @@ async function restorePreservedWorkspaceEntries( const targetStats = await safeStat(targetPath); if (!targetStats) { - // Restore only when the repository did not provide that path itself. Repo content must - // override preexisting workspace content if both define the same file or directory. await ensureParentDirectory(targetPath); await copyPath(entry.backupPath, targetPath, entry.isDirectory); restoredEntries.push(entry); @@ -233,8 +143,6 @@ async function addEntriesToGitExclude( const excludePath = path.join(workspacePath, ".git", "info", "exclude"); const existingContent = await fs.readFile(excludePath, "utf8").catch(() => ""); const existingEntries = new Set(existingContent.split(/\r?\n/).filter(Boolean)); - // Keep restored workspace-owned files local to the Theia workspace instead of surfacing - // them as untracked files inside the student's repository. const newEntries = restoredEntries.map((entry) => entry.isDirectory ? `${normalizeGitPath(entry.relativePath)}/` From 4cd9bd8098b7e0c6409e94771a35f07951f21d4f Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:23:45 +0200 Subject: [PATCH 07/17] Add idempotence guard: skip auto-clone if repo already matches GIT_URI --- src/theia/theia.ts | 65 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/src/theia/theia.ts b/src/theia/theia.ts index b47c14c..11a6538 100644 --- a/src/theia/theia.ts +++ b/src/theia/theia.ts @@ -1,10 +1,11 @@ import * as vscode from "vscode"; import simpleGit, { GitConfigScope } from "simple-git"; import { hostname } from "os"; +import * as path from "path"; +import * as fs from "fs/promises"; import { cloneByGivenURL } from "../participation/cloning.service"; import { createTheiaEnvStrategy, TheiaEnv } from "./env-strategy"; -// Mutable theiaEnv that gets populated after loading export let theiaEnv: TheiaEnv = { THEIA_FLAG: false, ARTEMIS_TOKEN: undefined, @@ -14,10 +15,6 @@ export let theiaEnv: TheiaEnv = { GIT_MAIL: undefined, }; -/** - * Loads the theia environment using the configured credential strategy. - * Must be called before accessing theiaEnv. - */ export async function loadTheiaEnv(): Promise { const strategy = await createTheiaEnvStrategy(); theiaEnv = await strategy.load(); @@ -27,12 +24,52 @@ export function getWorkspaceFolder() { return vscode.workspace.workspaceFolders?.at(0)?.uri; } +function normalizeRepoUrl(raw: string): string { + try { + const url = new URL(raw); + url.username = ""; + url.password = ""; + if ( + (url.protocol === "https:" && url.port === "443") || + (url.protocol === "http:" && url.port === "80") + ) { + url.port = ""; + } + let normalized = url.origin.toLowerCase() + url.pathname; + normalized = normalized.replace(/\.git\/?$/, ""); + normalized = normalized.replace(/\/+$/, ""); + return normalized; + } catch { + return raw; + } +} + +async function isRepoAlreadyCloned(workspacePath: string, targetUri: URL): Promise { + const gitPath = path.join(workspacePath, ".git"); + try { + await fs.stat(gitPath); + } catch { + return false; + } + + try { + const git = simpleGit(workspacePath); + const remotes = await git.getRemotes(true); + const origin = remotes.find((r) => r.name === "origin"); + if (!origin?.refs.fetch) { + return false; + } + return normalizeRepoUrl(origin.refs.fetch) === normalizeRepoUrl(targetUri.toString()); + } catch { + return false; + } +} + export async function initTheia() { if (theiaEnv.GIT_URI) { vscode.commands.executeCommand("setContext", "scorpio.theia.givenExercise", true); } - // Materialize the repository directly into the existing Theia workspace. if (theiaEnv.GIT_URI) { const workspaceFolderUri = getWorkspaceFolder(); if (!workspaceFolderUri) { @@ -40,12 +77,19 @@ export async function initTheia() { return; } - await cloneByGivenURL(theiaEnv.GIT_URI, workspaceFolderUri.fsPath, { - mode: "workspace-root", - }); + const alreadyCloned = await isRepoAlreadyCloned( + workspaceFolderUri.fsPath, + theiaEnv.GIT_URI, + ); + if (alreadyCloned) { + console.log("Repository already present, skipping auto-clone"); + } else { + await cloneByGivenURL(theiaEnv.GIT_URI, workspaceFolderUri.fsPath, { + mode: "workspace-root", + }); + } } - // set git config values if (theiaEnv.THEIA_FLAG) { try { const git = simpleGit(); @@ -63,5 +107,4 @@ export async function initTheia() { console.error(`Error setting git config: ${e.message}`); } } - // login should trigger workspace detection } From 05d84b77b528590df451d654579f55a112b39728 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:23:52 +0200 Subject: [PATCH 08/17] Remove dead retrieveVcsAccessToken from authentication client --- src/artemis/authentication.client.ts | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/artemis/authentication.client.ts b/src/artemis/authentication.client.ts index 2e36908..709e8e3 100644 --- a/src/artemis/authentication.client.ts +++ b/src/artemis/authentication.client.ts @@ -1,4 +1,4 @@ -import { artemisRequestText, artemisRequest } from "../infra/http/artemis-http.client"; +import { artemisRequest } from "../infra/http/artemis-http.client"; export async function authenticateToken( username: string, @@ -24,26 +24,3 @@ export async function authenticateToken( return response.json(); } - -export function retrieveVcsAccessToken(token: string, participationId: number): Promise { - return getVcsAccessToken(token, participationId, "GET").catch(() => { - return getVcsAccessToken(token, participationId, "PUT"); - }); -} - -function getVcsAccessToken( - token: string, - participationId: number, - method: "GET" | "PUT", -): Promise { - return artemisRequestText("/api/core/account/participation-vcs-access-token", { - method, - token, - headers: { - "Content-Type": "application/json", - }, - query: { - participationId, - }, - }); -} From fb25d8e987137fbc6837c314befffe544c27a420 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:23:57 +0200 Subject: [PATCH 09/17] DataBridge: only require ARTEMIS_TOKEN/URL/GIT_URI, auto-set THEIA_FLAG --- src/theia/env-strategy.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/theia/env-strategy.ts b/src/theia/env-strategy.ts index 2b1a02f..11ea1d4 100644 --- a/src/theia/env-strategy.ts +++ b/src/theia/env-strategy.ts @@ -19,14 +19,20 @@ const ENV_KEYS = [ "GIT_MAIL", ] as const satisfies Array; +const REQUIRED_ENV_KEYS = ["ARTEMIS_TOKEN", "ARTEMIS_URL", "GIT_URI"] as const; + export interface TheiaEnvStrategy { load(): Promise; } -function parseTheiaEnv(env: Record): TheiaEnv { +function parseTheiaEnv( + env: Record, + fromDataBridge: boolean = false, +): TheiaEnv { const gitUriString = env["GIT_URI"]; + const hasRequiredKeys = !!(env["ARTEMIS_TOKEN"] && env["ARTEMIS_URL"] && gitUriString); return { - THEIA_FLAG: env["THEIA"] !== undefined, + THEIA_FLAG: env["THEIA"] !== undefined || (fromDataBridge && hasRequiredKeys), ARTEMIS_TOKEN: env["ARTEMIS_TOKEN"], ARTEMIS_URL: env["ARTEMIS_URL"], GIT_URI: gitUriString ? new URL(gitUriString) : undefined, @@ -121,9 +127,9 @@ export class DataBridgeStrategy implements TheiaEnvStrategy { // Check if we have ALL environment variables available // We won't act until all environment variables are available. - if (ENV_KEYS.every((key) => Boolean(env[key]))) { + if (REQUIRED_ENV_KEYS.every((key) => Boolean(env[key]))) { this.outputChannel.appendLine("Environment variables received from bridge"); - return parseTheiaEnv(env); + return parseTheiaEnv(env, true); } this.outputChannel.appendLine( From 064c6fca6c1206fada053a96a9c183bd941da4e8 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:24:12 +0200 Subject: [PATCH 10/17] tsconfig: remove shared aliases, WebWorker lib, webview exclude --- tsconfig.json | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 4957243..da081ee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,27 +1,21 @@ { "compilerOptions": { - "baseUrl": "./", - "paths": { - "@shared/*": ["shared/*"], - "@shared/models/*": ["shared/models/*"] - }, "module": "Node16", "target": "ES2020", "outDir": "dist", - "lib": ["ES2020", "WebWorker"], + "lib": ["ES2020"], "sourceMap": true, "rootDir": "./", - "strict": true /* enable all strict type-checking options */, + "strict": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, - /* Additional Checks */ - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - "noUnusedParameters": true /* Report errors on unused parameters. */, - "noUnusedLocals": true /* Report errors on unused locals. */, - "noImplicitThis": true /* Report errors when 'this' is used in a non-class context. */, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "noImplicitThis": true, "skipLibCheck": true }, - "include": ["src/**/*", "shared/**/*"], - "exclude": ["node_modules", "webview"] + "include": ["src/**/*"], + "exclude": ["node_modules"] } From 3ad952777ffe5d23ef5834752e0b2f8390830013 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:24:13 +0200 Subject: [PATCH 11/17] Strip package.json: remove unused deps, views, commands, menus, browser config --- package.json | 176 ++++----------------------------------------------- 1 file changed, 11 insertions(+), 165 deletions(-) diff --git a/package.json b/package.json index 2769205..f2bcc18 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "displayName": "Artemis - Scorpio", "version": "0.0.0", "description": "", + "private": true, "categories": [ "Other" ], @@ -15,61 +16,33 @@ }, "publisher": "tum-aet", "main": "./dist/extension.js", - "browser": "./dist/extension.js", "scripts": { - "install:all": "npm run install:webview && npm run install:extension", - "build": "npm run build:webview && npm run build:extension", - "watch": "npm run watch:webview && npm run watch:extension", + "install:all": "npm install --no-scripts", + "build": "webpack --mode production", + "watch": "webpack --watch", "install:extension": "npm install --no-scripts", "build:extension": "webpack --mode production", "compile:extension": "webpack", "watch:extension": "webpack --watch", - "install:webview": "cd webview && npm install", - "build:webview": "cd webview && npm run build", - "watch:webview": "cd webview && npm run watch", - "test": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=dist/web/test/suite/index.js", - "pretest": "npm run compile:extension", "lint": "eslint src", "package": "vsce package", "vscode:prepublish": "npm run build", - "run-in-browser": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. .", - "open-in-browser": "vscode-test-web --extensionDevelopmentPath=. .", "fmt": "oxfmt", "fmt:check": "oxfmt --check" }, "dependencies": { - "@stomp/stompjs": "^7.0.0", - "@vscode/vsce": "^3.1.1", - "fetch-cookie": "^3.0.1", - "markdown-it": "^14.1.1", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "simple-git": "^3.27.0", - "sockjs-client": "^1.6.1", - "ts-node": "^10.9.2", - "uuid": "^10.0.0", - "ws": "^8.18.0" + "simple-git": "^3.27.0" }, "devDependencies": { - "@types/assert": "^1.5.11", - "@types/mocha": "^10.0.9", - "@types/sockjs-client": "^1.5.4", - "@types/stompjs": "^2.3.10", + "@types/node": "^22.0.0", "@types/vscode": "^1.94.0", - "@types/webpack-env": "^1.18.8", - "@types/ws": "^8.5.13", "@typescript-eslint/eslint-plugin": "^8.9.0", "@typescript-eslint/parser": "^8.9.0", - "@vscode/test-web": "^0.0.80", - "assert": "^2.1.0", - "dotenv": "^16.4.5", + "@vscode/vsce": "^3.1.1", "eslint": "^9.39.3", - "html-loader": "^5.1.0", - "mocha": "^10.7.3", "oxfmt": "^0.31.0", - "process": "^0.11.10", - "raw-loader": "^4.0.2", "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", "typescript": "^5.5.4", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" @@ -98,89 +71,24 @@ "editPresentation": "singlelineText", "type": "string", "format": "path" - }, - "scorpio.?": { - "order": 99, - "description": "Wait and see", - "type": "boolean" } } }, - "viewsContainers": { - "activitybar": [ - { - "id": "artemis-sidebar-view", - "title": "Artemis", - "icon": "media/icon.svg" - } - ] - }, - "views": { - "artemis-sidebar-view": [ - { - "type": "webview", - "id": "artemis-sidebar", - "name": "Scorpio", - "icon": "media/icon.svg", - "contextualTitle": "Artemis" - } - ] - }, "commands": [ { "command": "scorpio.restart", - "category": "Artemis", + "category": "Scorpio", "title": "Restart Extension" }, { "command": "scorpio.login", - "category": "Artemis", + "category": "Scorpio", "title": "Login" }, { "command": "scorpio.logout", - "category": "Artemis", + "category": "Scorpio", "title": "Logout" - }, - { - "command": "scorpio.displayExercise", - "category": "Artemis", - "title": "Display Exercise" - }, - { - "command": "scorpio.displayedExercise.back", - "category": "Artemis", - "title": "Show Course Selection", - "icon": "$(arrow-left)" - }, - { - "command": "scorpio.displayedExercise.clone", - "category": "Artemis", - "title": "Clone Displayed Exercise", - "icon": "$(repo-pull)" - }, - { - "command": "scorpio.workspace.submit", - "category": "Artemis", - "title": "Submit Workspace", - "icon": "$(repo-push)" - }, - { - "command": "scorpio.workspace.detectRepo", - "category": "Artemis", - "title": "Detect Repository in Workspace" - }, - { - "command": "scorpio.workspace.sync", - "category": "Artemis", - "title": "Sync Problem Statement with Workspace", - "icon": "$(repo-sync)" - }, - { - "command": "scorpio.sidebar.refresh", - "category": "Artemis", - "title": "Refresh Artemis Window", - "icon": "$(refresh)" } ], "menus": { @@ -192,64 +100,6 @@ { "command": "scorpio.logout", "when": "scorpio.authenticated" - }, - { - "command": "scorpio.displayExercise", - "when": "!scorpio.theia.givenExercise && scorpio.authenticated" - }, - { - "command": "scorpio.displayedExercise.back", - "when": "false" - }, - { - "command": "scorpio.displayedExercise.clone", - "when": "!scorpio.theia.givenExercise && scorpio.authenticated && scorpio.displayedKey" - }, - { - "command": "scorpio.workspace.submit", - "when": "scorpio.repoKey" - }, - { - "command": "scorpio.workspace.detectRepo", - "when": "scorpio.authenticated" - }, - { - "command": "scorpio.workspace.sync", - "when": "scorpio.authenticated && scorpio.repoKey && scorpio.displayedKey not in scorpio.repoKey" - } - ], - "editor/title": [ - { - "command": "scorpio.workspace.submit", - "group": "navigation", - "when": "scorpio.repoKey" - } - ], - "view/title": [ - { - "command": "scorpio.sidebar.refresh", - "when": "view == artemis-sidebar", - "group": "navigation@4" - }, - { - "command": "scorpio.workspace.submit", - "when": "(view == artemis-sidebar) && (scorpio.repoKey && scorpio.displayedKey in scorpio.repoKey)", - "group": "navigation@3" - }, - { - "command": "scorpio.displayedExercise.clone", - "when": "!scorpio.theia.givenExercise && (view == artemis-sidebar) && scorpio.authenticated && (scorpio.displayedKey && scorpio.displayedKey not in scorpio.repoKey)", - "group": "navigation@3" - }, - { - "command": "scorpio.workspace.sync", - "when": "(view == artemis-sidebar) && scorpio.authenticated && (scorpio.repoKey && scorpio.displayedKey not in scorpio.repoKey)", - "group": "navigation@2" - }, - { - "command": "scorpio.displayedExercise.back", - "when": "!scorpio.theia.givenExercise && (view == artemis-sidebar) && scorpio.displayBackButton", - "group": "navigation@1" } ] } @@ -257,11 +107,7 @@ "activationEvents": [ "onStartupFinished" ], - "extensionDependencies": [ - "vscode.git" - ], "extensionKind": [ - "ui", "workspace" ], "icon": "media/icon.png", From edc061b80e40e3f46f6766b38f26e0415bf1fc35 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:24:19 +0200 Subject: [PATCH 12/17] webpack: Node-only config, remove browser polyfills, test entry, plugins --- webpack.config.js | 45 +++++++-------------------------------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 0915ad4..f7ab6ce 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,24 +1,16 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - //@ts-check "use strict"; -//@ts-check /** @typedef {import('webpack').Configuration} WebpackConfig **/ const path = require("path"); -const webpack = require("webpack"); /** @type WebpackConfig */ const extensionConfig = { - mode: "none", // this leaves the source code as close as possible to the original (when packaging we set this to 'production') - target: "node", // extensions run in a webworker context + mode: "none", + target: "node", entry: { extension: "./src/extension.ts", - "test/suite/index": "./src/test/suite/index.ts", }, output: { filename: "[name].js", @@ -27,21 +19,8 @@ const extensionConfig = { devtoolModuleFilenameTemplate: "../[resource-path]", }, resolve: { - mainFields: ["main", "module", "browser"], // look for `browser` entry point in imported node modules - extensions: [".ts", ".js"], // support ts-files and js-files - alias: { - // provides alternate implementation for node module and source files - "@shared": path.resolve(__dirname, "shared"), - }, - fallback: { - // Webpack 5 no longer polyfills Node.js core modules automatically. - // see https://webpack.js.org/configuration/resolve/#resolvefallback - // for the list of Node.js core module polyfills. - crypto: false, - assert: require.resolve("assert"), - path: require.resolve("path-browserify"), - os: require.resolve("os-browserify/browser"), - }, + mainFields: ["main", "module"], + extensions: [".ts", ".js"], }, module: { rules: [ @@ -56,25 +35,15 @@ const extensionConfig = { }, ], }, - plugins: [ - new webpack.optimize.LimitChunkCountPlugin({ - maxChunks: 1, // disable chunks by default since web extensions must be a single bundle - }), - new webpack.ProvidePlugin({ - process: "process/browser", // provide a shim for the global `process` variable - }), - ], externals: { - vscode: "commonjs vscode", // ignored because it doesn't exist - bufferutil: "commonjs bufferutil", // optional ws dependency - "utf-8-validate": "commonjs utf-8-validate", // optional ws dependency + vscode: "commonjs vscode", }, performance: { hints: false, }, - devtool: "nosources-source-map", // create a source map that points to the original source file + devtool: "nosources-source-map", infrastructureLogging: { - level: "log", // enables logging required for problem matchers + level: "log", }, }; From 48fdaea82a3efba0aee141f4c9393ee680201308 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:26:01 +0200 Subject: [PATCH 13/17] Fix type errors: replace BodyInit with string, cast json response, remove dead HTTP helpers --- src/artemis/authentication.client.ts | 2 +- src/infra/http/artemis-http.client.ts | 35 +-------------------------- 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/src/artemis/authentication.client.ts b/src/artemis/authentication.client.ts index 709e8e3..bf2555a 100644 --- a/src/artemis/authentication.client.ts +++ b/src/artemis/authentication.client.ts @@ -22,5 +22,5 @@ export async function authenticateToken( throw new Error(`HTTP error with status: ${response.status} ${errorText}`); } - return response.json(); + return (await response.json()) as { access_token: string }; } diff --git a/src/infra/http/artemis-http.client.ts b/src/infra/http/artemis-http.client.ts index 538eff5..f6f71ee 100644 --- a/src/infra/http/artemis-http.client.ts +++ b/src/infra/http/artemis-http.client.ts @@ -5,7 +5,7 @@ type QueryValue = string | number | boolean | undefined; type ArtemisRequestOptions = { method?: string; token?: string; - body?: BodyInit | null; + body?: string | null; query?: Record; headers?: Record; }; @@ -43,36 +43,3 @@ export async function artemisRequest( }); } -export async function artemisRequestJson( - path: string, - options: ArtemisRequestOptions = {}, -): Promise { - const response = await artemisRequest(path, { - ...options, - headers: { - "Content-Type": "application/json", - ...(options.headers ?? {}), - }, - }); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`HTTP error! status: ${response.status} message: ${errorText}`); - } - - return (await response.json()) as T; -} - -export async function artemisRequestText( - path: string, - options: ArtemisRequestOptions = {}, -): Promise { - const response = await artemisRequest(path, options); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`HTTP error! status: ${response.status} message: ${errorText}`); - } - - return response.text(); -} From 69c67b23e211933d2321bf68358f3f1a4afe93a3 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 May 2026 17:26:04 +0200 Subject: [PATCH 14/17] Regenerate package-lock.json after dependency cleanup --- package-lock.json | 5949 ++++++++++++++++----------------------------- 1 file changed, 2131 insertions(+), 3818 deletions(-) diff --git a/package-lock.json b/package-lock.json index e51ea90..5321cfd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,38 +8,18 @@ "name": "artemis-scorpio", "version": "0.0.0", "dependencies": { - "@stomp/stompjs": "^7.0.0", - "@vscode/vsce": "^3.1.1", - "fetch-cookie": "^3.0.1", - "markdown-it": "^14.1.1", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "simple-git": "^3.27.0", - "sockjs-client": "^1.6.1", - "ts-node": "^10.9.2", - "uuid": "^10.0.0", - "ws": "^8.18.0" + "simple-git": "^3.27.0" }, "devDependencies": { - "@types/assert": "^1.5.11", - "@types/mocha": "^10.0.9", - "@types/sockjs-client": "^1.5.4", - "@types/stompjs": "^2.3.10", + "@types/node": "^22.0.0", "@types/vscode": "^1.94.0", - "@types/webpack-env": "^1.18.8", - "@types/ws": "^8.5.13", "@typescript-eslint/eslint-plugin": "^8.9.0", "@typescript-eslint/parser": "^8.9.0", - "@vscode/test-web": "^0.0.80", - "assert": "^2.1.0", - "dotenv": "^16.4.5", + "@vscode/vsce": "^3.1.1", "eslint": "^9.39.3", - "html-loader": "^5.1.0", - "mocha": "^10.7.3", "oxfmt": "^0.31.0", - "process": "^0.11.10", - "raw-loader": "^4.0.2", "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", "typescript": "^5.5.4", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" @@ -48,36 +28,28 @@ "vscode": "^1.95.0" } }, - "node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } + "node_modules/@azu/format-text": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", + "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/@azure/core-auth": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.8.0.tgz", - "integrity": "sha512-YvFMowkXzLbXNM11yZtVLhUCmuG0ex7JKOH366ipjmHBhL3vpDcPAeWF+jf0X+jVXwFqo3UhsWUq4kH0ZPdu/g==", - "license": "MIT", + "node_modules/@azu/style-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", + "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", + "dev": true, + "license": "WTFPL", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@azu/format-text": "^1.0.1" } }, - "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "node_modules/@azure/abort-controller": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -86,242 +58,191 @@ "node": ">=18.0.0" } }, - "node_modules/@azure/core-client": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", - "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "node_modules/@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", + "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.9.1", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.6.1", - "@azure/logger": "^1.0.0", + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "node_modules/@azure/core-client": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", + "dev": true, "license": "MIT", "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz", - "integrity": "sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.8.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.9.0", - "@azure/logger": "^1.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", + "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==", + "dev": true, "license": "MIT", "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-tracing": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", - "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-util": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.10.0.tgz", - "integrity": "sha512-dqLWQsh9Nro1YQU+405POVtXnwrIVqPyfUzc4zXCbThTg7+vNNaiMkwbX9AMXKyoFYFClxmB3s25ZFr3+jZkww==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "dev": true, "license": "MIT", "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/identity": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", - "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", + "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", + "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.5.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.3.0", + "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.14.0", - "@azure/msal-node": "^2.9.2", - "events": "^3.0.0", - "jws": "^4.0.0", - "open": "^8.0.0", - "stoppable": "^1.1.0", + "@azure/msal-browser": "^5.5.0", + "@azure/msal-node": "^5.1.0", + "open": "^10.1.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/identity/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@azure/identity/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==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@azure/identity/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==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@azure/identity/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20.0.0" } }, "node_modules/@azure/logger": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", - "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "dev": true, "license": "MIT", "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/msal-browser": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.26.1.tgz", - "integrity": "sha512-y78sr9g61aCAH9fcLO1um+oHFXc1/5Ap88RIsUSuzkm0BHzFnN+PXGaQeuM1h5Qf5dTnWNOd6JqkskkMPAhh7Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.9.0.tgz", + "integrity": "sha512-CzE+4PefDSJWj26zU7G1bKchlGRRHMBFreG4tAlGuzyI8hAPiYGobaJvZBgZBf6L63iphX7VH+ityL8VgEQz9Q==", + "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "14.15.0" + "@azure/msal-common": "16.5.2" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.15.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.15.0.tgz", - "integrity": "sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ==", + "version": "16.5.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.5.2.tgz", + "integrity": "sha512-GkDEL6TYo3HgT3UuqakdgE9PZfc1hMki6+Hwgy1uddb/EauvAKfu85vVhuofRSo22D1xTnWt8Ucwfg4vSCVwvA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.15.0.tgz", - "integrity": "sha512-gVPW8YLz92ZeCibQH2QUw96odJoiM3k/ZPH3f2HxptozmH6+OnyyvKXo/Egg39HAM230akarQKHf0W74UHlh0Q==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.1.5.tgz", + "integrity": "sha512-ObTeMoNPmq19X3z40et9Xvs4ZoWVeJg43PZMRLG5iwVL+2nCtAerG3YTDItqPp1CfXNwmCXBbg8jn1DOx65c3g==", + "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "14.15.0", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" + "@azure/msal-common": "16.5.2", + "jsonwebtoken": "^9.0.0" }, "engines": { - "node": ">=16" + "node": ">=20" } }, - "node_modules/@azure/msal-node/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==", + "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==", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -330,20 +251,20 @@ "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "engines": { + "node": ">=10.0.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -370,24 +291,31 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/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/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -396,9 +324,9 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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": { @@ -435,20 +363,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -458,10 +386,34 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -469,10 +421,27 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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": { @@ -483,9 +452,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -520,29 +489,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -571,99 +554,42 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { @@ -671,9 +597,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -681,16 +607,10 @@ "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -698,41 +618,22 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@koa/cors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz", - "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "license": "MIT", - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 14.0.0" - } + "license": "MIT" }, - "node_modules/@koa/router": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-15.3.1.tgz", - "integrity": "sha512-n7UgxsPmgKtEsrguz8a0d6BNx3lO2x52Z4UqkGsGwJculk4TlzZf3btd3QZMq1r1M+bSxUkBbyul4mDhysIVaQ==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "koa-compose": "^4.1.0", - "path-to-regexp": "^8.3.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "koa": "^2.0.0 || ^3.0.0" - }, - "peerDependenciesMeta": { - "koa": { - "optional": false - } + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@kwsites/file-exists": { @@ -1111,54 +1012,317 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@playwright/browser-chromium": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.58.2.tgz", - "integrity": "sha512-/HHFVVP2pzEtqBVOFRoWlDtBoO8bzIWOqS62APdm3OhYbE2+kVUs/ALpkevvAKKfY0DMDVezYN22bDBh77UQ9Q==", + "node_modules/@secretlint/config-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", + "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/config-loader": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", + "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/profiler": "^10.2.2", + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "ajv": "^8.17.1", + "debug": "^4.4.1", + "rc-config-loader": "^4.1.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/core": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", + "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/profiler": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "structured-source": "^4.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/formatter": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", + "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "@textlint/linter-formatter": "^15.2.0", + "@textlint/module-interop": "^15.2.0", + "@textlint/types": "^15.2.0", + "chalk": "^5.4.1", + "debug": "^4.4.1", + "pluralize": "^8.0.0", + "strip-ansi": "^7.1.0", + "table": "^6.9.0", + "terminal-link": "^4.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/formatter/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@secretlint/node": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", + "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/config-loader": "^10.2.2", + "@secretlint/core": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "@secretlint/source-creator": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "p-map": "^7.0.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/profiler": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", + "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/resolver": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", + "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/secretlint-formatter-sarif": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", + "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-sarif-builder": "^3.2.0" + } + }, + "node_modules/@secretlint/secretlint-rule-no-dotenv": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", + "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/secretlint-rule-preset-recommend": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", + "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/source-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", + "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", + "dev": true, + "license": "MIT", "dependencies": { - "playwright-core": "1.58.2" + "@secretlint/types": "^10.2.2", + "istextorbinary": "^9.5.0" }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/types": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", + "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@simple-git/args-pathspec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz", + "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==", + "license": "MIT" + }, + "node_modules/@simple-git/argv-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz", + "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==", + "license": "MIT", + "dependencies": { + "@simple-git/args-pathspec": "^1.0.3" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@stomp/stompjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.0.0.tgz", - "integrity": "sha512-fGdq4wPDnSV/KyOsjq4P+zLc8MFWC3lMmP5FBgLWKPJTYcuCbAIrnRGjB7q2jHZdYCOD5vxLuFoKIYLy5/u8Pw==", - "license": "Apache-2.0" + "node_modules/@textlint/ast-node-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.6.0.tgz", + "integrity": "sha512-CxZHFbYAU7J0A4izz31wV2ZZfySR6aVj2OSR6/3tppZm7VV6hM7nA7sutsLwIiBL/v4lsB1RM79l4Dc/VrH4qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.6.0.tgz", + "integrity": "sha512-IwHRhjwxs0a5t1eNAoKAdV224CDca38LyopPofXpwO/d0J75wBvzf/cBHXNl4TMsLKhYGtR83UprcLEKj/gZsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azu/format-text": "^1.0.2", + "@azu/style-format": "^1.0.1", + "@textlint/module-interop": "15.6.0", + "@textlint/resolver": "15.6.0", + "@textlint/types": "15.6.0", + "chalk": "^4.1.2", + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "lodash": "^4.18.1", + "pluralize": "^2.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "table": "^6.9.0", + "text-table": "^0.2.0" + } + }, + "node_modules/@textlint/linter-formatter/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/@textlint/linter-formatter/node_modules/pluralize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", + "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter/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/@textlint/module-interop": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.6.0.tgz", + "integrity": "sha512-MHY6pJx9i5kOlrvUSK51887tYZjHAV2qnr6unBm7LtBLGDFo93utdYqHyWep8r9QLsilQdeijWtufJI46z4v4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/resolver": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.6.0.tgz", + "integrity": "sha512-T1l2Gd3455pwtm0cTewhX/LLy3bL9z6/Fu/am+jj+jjGfXVoknYkjfkZEKrjHlA7xzay0EfUKnu//teYemLeZw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.6.0.tgz", + "integrity": "sha512-CvgYb1PiqF4BGyoZebGWzAJCZ4ChJAZ9gtWjpQIMKE4Xe2KlSwDA8m8MsiZIV321f5Ibx38BMjC1Z/2ZYP2GQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "15.6.0" + } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "license": "MIT" - }, - "node_modules/@types/assert": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/@types/assert/-/assert-1.5.11.tgz", - "integrity": "sha512-FjS1mxq2dlGr9N4z72/DO+XmyRS3ZZIoVn998MEopAN/OmyN28F4yumRL5pOw2z+hbFLuWGYuF2rrw5p11xM5A==", "dev": true, "license": "MIT" }, @@ -1198,79 +1362,78 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mocha": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz", - "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, - "node_modules/@types/sockjs-client": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/sockjs-client/-/sockjs-client-1.5.4.tgz", - "integrity": "sha512-zk+uFZeWyvJ5ZFkLIwoGA/DfJ+pYzcZ8eH4H/EILCm2OBZyHH6Hkdna1/UWL/CFruh5wj6ES7g75SvUB0VsH5w==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true, "license": "MIT" }, - "node_modules/@types/stompjs": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/stompjs/-/stompjs-2.3.10.tgz", - "integrity": "sha512-iGTEy0T3fl21FdSoRk65G/6AyL7ETj25h39XkT756gw9mrKm2JRBqPcHRWcWRiP8daAv+kNT9mGOH4UZ/fBT+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/vscode": { - "version": "1.94.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.94.0.tgz", - "integrity": "sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==", + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", "dev": true, "license": "MIT" }, - "node_modules/@types/webpack-env": { - "version": "1.18.8", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", - "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", + "node_modules/@types/vscode": { + "version": "1.118.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.118.0.tgz", + "integrity": "sha512-Ah6eTlqDcwIMELEVwQMO++rJAFBRz/oLluLD/vWdYrH1KuI9kfpaM+7pg0OvvascgcJy+ghLCERAYouM4QbzGw==", "dev": true, "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", + "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/type-utils": "8.59.1", + "@typescript-eslint/utils": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.9.0.tgz", - "integrity": "sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==", + "node_modules/@typescript-eslint/parser": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", + "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.9.0", - "@typescript-eslint/type-utils": "8.9.0", - "@typescript-eslint/utils": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1280,27 +1443,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.9.0.tgz", - "integrity": "sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", + "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.9.0", - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/typescript-estree": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1310,43 +1466,56 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz", - "integrity": "sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", + "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.9.0.tgz", - "integrity": "sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", + "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.9.0", - "@typescript-eslint/utils": "8.9.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/utils": "8.59.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1355,16 +1524,15 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.9.0.tgz", - "integrity": "sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", "dev": true, "license": "MIT", "engines": { @@ -1376,20 +1544,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz", - "integrity": "sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1398,23 +1567,21 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.9.0.tgz", - "integrity": "sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", + "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.9.0", - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/typescript-estree": "8.9.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1424,18 +1591,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz", - "integrity": "sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.9.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.59.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1445,49 +1613,52 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vscode/test-web": { - "version": "0.0.80", - "resolved": "https://registry.npmjs.org/@vscode/test-web/-/test-web-0.0.80.tgz", - "integrity": "sha512-QgsRPp8IuPcdbUdVtqQkFN/sGd+6cr6g0ENEVFOHwJbQqZtJSiZD5w0e6tgmoeq9nBjNqZCq87OO1GkwFHkPyw==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", + "integrity": "sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==", "dev": true, "license": "MIT", "dependencies": { - "@koa/cors": "^5.0.0", - "@koa/router": "^15.3.0", - "@playwright/browser-chromium": "^1.58.2", - "gunzip-maybe": "^1.4.2", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "koa": "^3.1.2", - "koa-morgan": "^1.0.1", - "koa-mount": "^4.2.0", - "koa-static": "^5.0.0", - "minimist": "^1.2.8", - "playwright": "^1.58.2", - "tar-fs": "^3.1.1", - "tinyglobby": "^0.2.15", - "vscode-uri": "^3.1.0" - }, - "bin": { - "vscode-test-web": "out/server/index.js" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=20" + "node": ">=20.0.0" } }, "node_modules/@vscode/vsce": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.1.1.tgz", - "integrity": "sha512-N62Ca9ElRPLUUzf7l9CeEBlLrYzFPRQq7huKk4pVW+LjIOSXfFIPudixn5QvZcz+yXDOh15IopI3K2o3y9666Q==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.9.1.tgz", + "integrity": "sha512-MPn5p+DoudI+3GfJSpAZZraE1lgLv0LcwbH3+xy7RgEhty3UIkmUMUA+5jPTDaxXae00AnX5u77FxGM8FhfKKA==", + "dev": true, "license": "MIT", "dependencies": { "@azure/identity": "^4.1.0", + "@secretlint/node": "^10.1.2", + "@secretlint/secretlint-formatter-sarif": "^10.1.2", + "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", + "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", "@vscode/vsce-sign": "^2.0.0", "azure-devops-node-api": "^12.5.0", - "chalk": "^2.4.2", + "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.9", "cockatiel": "^3.1.2", - "commander": "^6.2.1", + "commander": "^12.1.0", "form-data": "^4.0.0", "glob": "^11.0.0", "hosted-git-info": "^4.0.2", @@ -1498,12 +1669,13 @@ "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", + "secretlint": "^10.1.2", "semver": "^7.5.2", "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", - "yauzl": "^2.3.1", + "yauzl": "^3.2.1", "yazl": "^2.2.2" }, "bin": { @@ -1517,30 +1689,32 @@ } }, "node_modules/@vscode/vsce-sign": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.4.tgz", - "integrity": "sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", + "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", + "dev": true, "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.txt", "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.2", - "@vscode/vsce-sign-alpine-x64": "2.0.2", - "@vscode/vsce-sign-darwin-arm64": "2.0.2", - "@vscode/vsce-sign-darwin-x64": "2.0.2", - "@vscode/vsce-sign-linux-arm": "2.0.2", - "@vscode/vsce-sign-linux-arm64": "2.0.2", - "@vscode/vsce-sign-linux-x64": "2.0.2", - "@vscode/vsce-sign-win32-arm64": "2.0.2", - "@vscode/vsce-sign-win32-x64": "2.0.2" + "@vscode/vsce-sign-alpine-arm64": "2.0.6", + "@vscode/vsce-sign-alpine-x64": "2.0.6", + "@vscode/vsce-sign-darwin-arm64": "2.0.6", + "@vscode/vsce-sign-darwin-x64": "2.0.6", + "@vscode/vsce-sign-linux-arm": "2.0.6", + "@vscode/vsce-sign-linux-arm64": "2.0.6", + "@vscode/vsce-sign-linux-x64": "2.0.6", + "@vscode/vsce-sign-win32-arm64": "2.0.6", + "@vscode/vsce-sign-win32-x64": "2.0.6" } }, "node_modules/@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", - "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", + "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", "cpu": [ "arm64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1548,12 +1722,13 @@ ] }, "node_modules/@vscode/vsce-sign-alpine-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", - "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", + "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", "cpu": [ "x64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1561,12 +1736,13 @@ ] }, "node_modules/@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", - "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", + "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", "cpu": [ "arm64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1574,12 +1750,13 @@ ] }, "node_modules/@vscode/vsce-sign-darwin-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", - "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", + "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", "cpu": [ "x64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1587,12 +1764,13 @@ ] }, "node_modules/@vscode/vsce-sign-linux-arm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", - "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", + "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", "cpu": [ "arm" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1600,12 +1778,13 @@ ] }, "node_modules/@vscode/vsce-sign-linux-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", - "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", + "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", "cpu": [ "arm64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1613,12 +1792,13 @@ ] }, "node_modules/@vscode/vsce-sign-linux-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", - "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", + "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", "cpu": [ "x64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1626,12 +1806,13 @@ ] }, "node_modules/@vscode/vsce-sign-win32-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", - "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", + "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", "cpu": [ "arm64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ @@ -1639,22 +1820,31 @@ ] }, "node_modules/@vscode/vsce-sign-win32-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", - "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", + "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", "cpu": [ "x64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "optional": true, "os": [ "win32" ] }, + "node_modules/@vscode/vsce/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/@vscode/vsce/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1662,9 +1852,10 @@ } }, "node_modules/@vscode/vsce/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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" @@ -1895,24 +2086,11 @@ "dev": true, "license": "Apache-2.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/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1945,9 +2123,10 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -1960,22 +2139,23 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "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" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2000,240 +2180,121 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" + "node": ">=12" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, "license": "MIT" }, "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==", + "dev": true, "license": "Python-2.0" }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" + "engines": { + "node": ">=8" } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "node_modules/azure-devops-node-api": { "version": "12.5.0", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", + "dev": true, "license": "MIT", "dependencies": { "tunnel": "0.0.6", "typed-rest-client": "^1.8.4" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", - "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "MIT", "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } + "node": "18 || 20 || >=22" } }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -2252,62 +2313,39 @@ "optional": true }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" + "baseline-browser-mapping": "dist/cli.cjs" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" + "node": ">=6.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", "dev": true, - "license": "MIT", + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, "engines": { - "node": ">=8" + "node": ">=4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://bevry.me/fund" } }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -2320,16 +2358,27 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, "license": "ISC" }, + "node_modules/boundary": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", + "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -2345,27 +2394,10 @@ "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/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pako": "~0.2.0" - } - }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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": [ { @@ -2383,11 +2415,11 @@ ], "license": "MIT", "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" + "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" @@ -2400,6 +2432,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -2425,6 +2458,7 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -2434,6 +2468,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/buffer-from": { @@ -2443,30 +2478,27 @@ "dev": true, "license": "MIT" }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "run-applescript": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "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", @@ -2480,6 +2512,7 @@ "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", @@ -2502,34 +2535,10 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "node_modules/caniuse-lite": { + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", "dev": true, "funding": [ { @@ -2548,39 +2557,43 @@ "license": "CC-BY-4.0" }, "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==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "dev": true, "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", + "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=18.17" + "node": ">=20.18.1" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -2590,6 +2603,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -2603,6 +2617,14 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC", + "optional": true + }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -2613,29 +2635,6 @@ "node": ">=6.0" } }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -2655,24 +2654,30 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=16" } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "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==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/colorette": { @@ -2686,6 +2691,7 @@ "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" @@ -2695,62 +2701,19 @@ } }, "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=18" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "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/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, @@ -2758,12 +2721,14 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2775,9 +2740,10 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -2791,9 +2757,10 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -2819,23 +2786,11 @@ } } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -2848,17 +2803,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true, - "license": "MIT" - }, "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", "optional": true, "engines": { @@ -2872,83 +2821,64 @@ "dev": true, "license": "MIT" }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.4.0" } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, "license": "Apache-2.0", "optional": true, "engines": { @@ -2956,9 +2886,9 @@ } }, "node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -2969,6 +2899,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -2983,6 +2914,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, "funding": [ { "type": "github", @@ -2995,6 +2927,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -3007,9 +2940,10 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -3020,34 +2954,11 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -3058,111 +2969,52 @@ "node": ">= 0.4" } }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexify/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } }, - "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==", + "node_modules/editions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", "dev": true, - "license": "MIT" + "license": "Artistic-2.0", + "dependencies": { + "version-range": "^4.15.0" + }, + "engines": { + "ecmascript": ">= es5", + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.349", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.349.tgz", + "integrity": "sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "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", - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -3173,24 +3025,25 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "devOptional": true, + "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", + "optional": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -3200,6 +3053,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -3209,9 +3063,9 @@ } }, "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -3221,10 +3075,24 @@ "node": ">=4" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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" @@ -3234,15 +3102,16 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true, "license": "MIT" }, @@ -3250,6 +3119,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3262,6 +3132,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3283,42 +3154,39 @@ "node": ">=6" } }, - "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": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -3337,7 +3205,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -3389,26 +3257,34 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/eslint/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": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "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": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/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/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -3416,56 +3292,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -3479,20 +3305,27 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4" } }, + "node_modules/eslint/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/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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": { @@ -3502,19 +3335,6 @@ "node": "*" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -3547,9 +3367,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3596,24 +3416,17 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" } }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, "license": "(MIT OR WTFPL)", "optional": true, "engines": { @@ -3627,17 +3440,10 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3645,7 +3451,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -3679,9 +3485,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.1.tgz", + "integrity": "sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==", "dev": true, "funding": [ { @@ -3706,64 +3512,15 @@ } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fetch-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.0.1.tgz", - "integrity": "sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==", - "license": "Unlicense", - "dependencies": { - "set-cookie-parser": "^2.4.8", - "tough-cookie": "^4.0.0" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3832,26 +3589,17 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", @@ -3868,6 +3616,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -3880,68 +3629,44 @@ "node": ">= 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-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, "license": "MIT", "optional": true }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=14.14" } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3966,6 +3691,7 @@ "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", @@ -3979,6 +3705,7 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, "license": "MIT", "optional": true }, @@ -3986,6 +3713,8 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "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": "BlueOak-1.0.0", "dependencies": { "foreground-child": "^3.3.1", @@ -4025,27 +3754,33 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, "engines": { "node": ">=18" }, @@ -4057,6 +3792,7 @@ "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" @@ -4072,57 +3808,21 @@ "dev": true, "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, "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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "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" @@ -4135,6 +3835,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -4147,9 +3848,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4158,20 +3860,11 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" @@ -4180,81 +3873,11 @@ "node": ">=10" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/html-loader": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-5.1.0.tgz", - "integrity": "sha512-Jb3xwDbsm0W3qlXrCZwcYqYGnYz55hb6aoKQTlzyZPXsPpi6tHXzAfqalecglMQgNvtEfxrCQPaKT90Irt5XDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "html-minifier-terser": "^7.2.0", - "parse5": "^7.1.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -4266,92 +3889,28 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-assert/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "domutils": "^3.2.2", + "entities": "^7.0.1" } }, - "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==", + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "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" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.8" + "node": ">=0.12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "license": "MIT" - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -4365,6 +3924,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -4378,6 +3938,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4390,6 +3951,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -4408,9 +3970,9 @@ "optional": true }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -4454,75 +4016,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/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/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4533,23 +4026,34 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "dev": true, + "license": "ISC", + "optional": true + }, + "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", + "optional": true }, "node_modules/interpret": { "version": "3.1.1", @@ -4561,42 +4065,15 @@ "node": ">=10.13.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "hasown": "^2.0.2" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4604,29 +4081,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4641,25 +4111,10 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/is-glob": { @@ -4675,31 +4130,23 @@ "node": ">=0.10.0" } }, - "node_modules/is-gzip": { + "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { @@ -4725,46 +4172,27 @@ "node": ">=0.10.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" + "is-inside-container": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "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/isobject": { @@ -4777,13 +4205,32 @@ "node": ">=0.10.0" } }, + "node_modules/istextorbinary": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", + "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "binaryextensions": "^6.11.0", + "editions": "^6.21.0", + "textextensions": "^6.11.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@isaacs/cliui": "^9.0.0" }, "engines": { "node": "20 || >=22" @@ -4807,16 +4254,6 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -4833,6 +4270,13 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -4854,9 +4298,9 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -4884,15 +4328,30 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, "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/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, "license": "MIT", "dependencies": { - "jws": "^3.2.2", + "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", @@ -4908,31 +4367,11 @@ "npm": ">=6" } }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", - "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.2", - "safe-buffer": "^5.0.1" - } - }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -4944,29 +4383,18 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, "license": "MIT", "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/keytar": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -4995,174 +4423,11 @@ "node": ">=0.10.0" } }, - "node_modules/koa": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/koa/-/koa-3.1.2.tgz", - "integrity": "sha512-2LOQnFKu3m0VxpE+5sb5+BRTSKrXmNxGgxVRiKwD9s5KQB1zID/FRXhtzeV7RT1L2GVpdEEAfVuclFOMGl1ikA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^1.3.8", - "content-disposition": "~1.0.1", - "content-type": "^1.0.5", - "cookies": "~0.9.1", - "delegates": "^1.0.0", - "destroy": "^1.2.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.5.0", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/koa-morgan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/koa-morgan/-/koa-morgan-1.0.1.tgz", - "integrity": "sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "morgan": "^1.6.1" - } - }, - "node_modules/koa-mount": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/koa-mount/-/koa-mount-4.2.0.tgz", - "integrity": "sha512-2iHQc7vbA9qLeVq5gKAYh3m5DOMMlMfIKjW/REPAS18Mf63daCJHHVXY9nbu7ivrnYn5PiPC4CE523Tf5qvjeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.1", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/koa/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5186,15 +4451,16 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "dev": true, "license": "MIT", "engines": { @@ -5221,40 +4487,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { @@ -5268,170 +4547,82 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "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": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "license": "ISC" }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "bin": { + "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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==", "dev": true, "license": "MIT" }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC" - }, - "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/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": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -5452,23 +4643,11 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "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" @@ -5481,6 +4660,7 @@ "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" @@ -5490,6 +4670,7 @@ "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" @@ -5502,6 +4683,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -5512,16 +4694,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5531,17 +4713,19 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "devOptional": true, + "dev": true, "license": "MIT", + "optional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -5550,335 +4734,9 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT", - "optional": true - }, - "node_modules/mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/mocha/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/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/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mocha/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/mocha/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/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/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/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/morgan": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", - "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "dev": true, "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.1.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/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/morgan/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/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "optional": true }, "node_modules/ms": { "version": "2.1.3", @@ -5886,10 +4744,18 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, "license": "MIT", "optional": true }, @@ -5900,16 +4766,6 @@ "dev": true, "license": "MIT" }, - "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/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -5917,21 +4773,11 @@ "dev": true, "license": "MIT" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.90.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.90.0.tgz", + "integrity": "sha512-pZNQT7UnYlMwMBy5N1lV5X/YLTbZM5ncytN3xL7CHEzhDN8uVe0u55yaPUJICIJjaCW8NrM5BFdqr7HLweStNA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -5945,30 +4791,71 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, "license": "MIT", "optional": true }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "dev": true, "license": "MIT" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/node-sarif-builder": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", + "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", "dev": true, "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=20" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -5981,24 +4868,8 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, "engines": { "node": ">= 0.4" }, @@ -6006,66 +4877,34 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "license": "ISC", + "optional": true, + "dependencies": { + "wrappy": "1" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { @@ -6086,12 +4925,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "license": "MIT" - }, "node_modules/oxfmt": { "version": "0.31.0", "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.31.0.tgz", @@ -6164,6 +4997,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "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", @@ -6178,25 +5024,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", "dev": true, - "license": "MIT" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } + "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { "version": "1.0.1", @@ -6211,10 +5040,29 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, "license": "MIT", "dependencies": { "semver": "^5.1.0" @@ -6224,18 +5072,20 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/parse5": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", - "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -6245,6 +5095,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -6258,6 +5109,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, "license": "MIT", "dependencies": { "parse5": "^7.0.0" @@ -6266,33 +5118,19 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6303,20 +5141,11 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6330,57 +5159,50 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", - "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, - "node_modules/peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -6391,64 +5213,103 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/playwright": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", - "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "playwright-core": "1.58.2" + "find-up": "^4.0.0" }, - "bin": { - "playwright": "cli.js" + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" }, - "optionalDependencies": { - "fsevents": "2.3.2" + "engines": { + "node": ">=8" } }, - "node_modules/playwright-core": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "node_modules/pkg-dir/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": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -6457,7 +5318,7 @@ "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -6472,43 +5333,6 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6519,58 +5343,13 @@ "node": ">= 0.8.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT" - }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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", + "optional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6580,6 +5359,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -6589,15 +5369,17 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -6609,12 +5391,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6636,85 +5412,11 @@ ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/raw-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/raw-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/raw-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "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)", "optional": true, "dependencies": { @@ -6727,17 +5429,24 @@ "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==", - "license": "ISC", - "optional": true + "node_modules/rc-config-loader": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.4.tgz", + "integrity": "sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "json5": "^2.2.3", + "require-from-string": "^2.0.2" + } }, "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", "optional": true, "engines": { @@ -6748,6 +5457,7 @@ "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" @@ -6756,16 +5466,44 @@ "node": ">=0.8" } }, - "node_modules/read/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -6790,26 +5528,6 @@ "node": ">= 10.13.0" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6820,26 +5538,24 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6877,79 +5593,28 @@ "node": ">=4" } }, - "node_modules/resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { + "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-parallel": { @@ -6980,6 +5645,7 @@ "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", @@ -7000,13 +5666,18 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -7028,47 +5699,33 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/secretlint": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", + "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@secretlint/config-creator": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/node": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "debug": "^4.4.1", + "globby": "^14.1.0", + "read-pkg": "^9.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" + "bin": { + "secretlint": "bin/secretlint.js" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7077,47 +5734,6 @@ "node": ">=10" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", - "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -7135,6 +5751,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -7147,6 +5764,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7156,6 +5774,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7172,13 +5791,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "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.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -7191,6 +5811,7 @@ "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", @@ -7209,6 +5830,7 @@ "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", @@ -7228,6 +5850,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -7240,6 +5863,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, "funding": [ { "type": "github", @@ -7261,6 +5885,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, "funding": [ { "type": "github", @@ -7284,56 +5909,61 @@ } }, "node_modules/simple-git": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", - "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz", + "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==", "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.5" + "@simple-git/args-pathspec": "^1.0.3", + "@simple-git/argv-parser": "^1.1.0", + "debug": "^4.4.0" }, "funding": { "type": "github", "url": "https://github.com/steveukx/git-js?sponsor=1" } }, - "node_modules/sockjs-client": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", - "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "eventsource": "^2.0.2", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { - "url": "https://tidelift.com/funding/github/npm/sockjs-client" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-support": { @@ -7357,51 +5987,47 @@ "node": ">=0.10.0" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "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": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "license": "MIT", - "engines": { - "node": ">=4", - "npm": ">=6" + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, - "license": "MIT" + "license": "CC-BY-3.0" }, - "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "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": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -7409,27 +6035,10 @@ } }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -7440,31 +6049,37 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/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==", - "license": "MIT" - }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "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": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -7473,73 +6088,116 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/structured-source": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", + "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "ansi-regex": "^5.0.1" + "boundary": "^2.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10.0.0" } }, - "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==", + "node_modules/table/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", - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/table/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", - "engines": { - "node": ">= 0.4" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -7551,41 +6209,63 @@ } }, "node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" + "tar-stream": "^2.1.4" } }, "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", + "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", "dev": true, "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "ansi-escapes": "^7.0.0", + "supports-hyperlinks": "^3.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", + "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -7597,16 +6277,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", "dev": true, "license": "MIT", "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" }, "engines": { @@ -7631,6 +6310,17 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -7638,75 +6328,75 @@ "dev": true, "license": "MIT" }, - "node_modules/text-decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", - "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } + "license": "MIT" }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", "dev": true, - "license": "MIT", + "license": "Artistic-2.0", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" } }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "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" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, "engines": { - "node": ">=12.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/tinypool": { @@ -7723,6 +6413,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, "license": "MIT", "engines": { "node": ">=14.14" @@ -7741,48 +6432,23 @@ "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": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "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/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "version": "9.5.7", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", + "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", "dev": true, "license": "MIT", "dependencies": { @@ -7800,86 +6466,11 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-loader/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-loader/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ts-loader/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-loader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -7919,35 +6510,18 @@ } } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "license": "0BSD" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.x" - } + "license": "0BSD" }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" @@ -7957,6 +6531,7 @@ "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", "optional": true, "dependencies": { @@ -7979,52 +6554,24 @@ "node": ">= 0.8.0" } }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18" + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-rest-client": { "version": "1.8.11", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dev": true, "license": "MIT", "dependencies": { "qs": "^6.9.1", @@ -8033,9 +6580,10 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -8049,36 +6597,54 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, "license": "MIT" }, "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "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.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "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": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { @@ -8126,74 +6692,47 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "license": "MIT" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } + "optional": true }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, "license": "MIT" }, - "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==", + "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": "MIT", - "engines": { - "node": ">= 0.8" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "node_modules/version-range": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", "dev": true, - "license": "MIT" + "license": "Artistic-2.0", + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } }, "node_modules/watchpack": { "version": "2.5.1", @@ -8210,9 +6749,9 @@ } }, "node_modules/webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", "dev": true, "license": "MIT", "dependencies": { @@ -8222,25 +6761,24 @@ "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", + "enhanced-resolve": "^5.20.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", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", + "terser-webpack-plugin": "^5.3.17", "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -8304,16 +6842,6 @@ } } }, - "node_modules/webpack-cli/node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-cli/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -8324,7 +6852,7 @@ "node": ">=14" } }, - "node_modules/webpack-cli/node_modules/webpack-merge": { + "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", @@ -8340,9 +6868,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "dev": true, "license": "MIT", "engines": { @@ -8373,40 +6901,22 @@ "node": ">=4.0" } }, - "node_modules/webpack/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==", + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, - "license": "MIT" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.6" } }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -8419,6 +6929,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -8428,6 +6939,7 @@ "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" @@ -8439,26 +6951,6 @@ "node": ">= 8" } }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -8476,172 +6968,35 @@ "node": ">=0.10.0" } }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/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==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/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==", - "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/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true, - "license": "ISC" + "dev": true, + "license": "ISC", + "optional": true }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=10.0.0" + "dependencies": { + "is-wsl": "^3.1.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, "license": "MIT", "dependencies": { "sax": ">=0.6.0", @@ -8655,81 +7010,38 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "node": ">=4.0" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } + "license": "ISC" }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "node_modules/yauzl": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.0.tgz", + "integrity": "sha512-PtGEvEP30p7sbIBJKUBjUnqgTVOyMURc4dLo9iNyAJnNIEz9pm88cCXF21w94Kg3k6RXkeZh5DHOGS0qEONvNQ==", "dev": true, "license": "MIT", "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "node": ">=12" } }, "node_modules/yazl": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3" @@ -8739,6 +7051,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" From 55bb1c059e6b8eb18c9a6c09de6f2cff0245c060 Mon Sep 17 00:00:00 2001 From: Liam Date: Fri, 15 May 2026 23:13:16 +0200 Subject: [PATCH 15/17] Remove auth infrastructure, clean up ARTEMIS_TOKEN dependency, update docs Auth has no consumer after the feature strip: clone uses GIT_URI directly, git identity uses GIT_USER/GIT_MAIL, settings protection needs no token. Remove ARTEMIS_TOKEN from env requirements so DataBridge polling no longer blocks on a value scorpio never reads. Fix disposable leak in initSettings. Rewrite READMEs to reflect the stripped-down Theia infrastructure scope. --- README.md | 52 +----- README_DEVELOPER.md | 88 +++------ README_THEIA.md | 20 ++- package.json | 30 +--- src/artemis/authentication.client.ts | 26 --- src/authentication/authentication_provider.ts | 170 ------------------ src/authentication/not_authenticated.error.ts | 8 - src/extension.ts | 65 +------ src/infra/http/artemis-http.client.ts | 45 ----- src/shared/settings.ts | 4 +- src/theia/env-strategy.ts | 11 +- src/theia/theia.ts | 1 - 12 files changed, 58 insertions(+), 462 deletions(-) delete mode 100644 src/artemis/authentication.client.ts delete mode 100644 src/authentication/authentication_provider.ts delete mode 100644 src/authentication/not_authenticated.error.ts delete mode 100644 src/infra/http/artemis-http.client.ts diff --git a/README.md b/README.md index d4f84cc..cac8c0b 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,19 @@ -# Scorpio: A VSCode Extension for the Interactive Learning Platform [Artemis](https://github.com/ls1intum/Artemis) +# Scorpio: Theia Infrastructure for [Artemis](https://github.com/ls1intum/Artemis) -Scorpio is an IDE-integrated Visual Studio Code plugin for the online learning platform Artemis. The plugin seamlessly incorporates the entire programming exercise life cycle directly within the student's IDE. It enables the student to start the programming exercise, displays the instructions, offers the option to submit the exercise, and returns the submission results all within the IDE. +Scorpio provides Theia/EduIDE infrastructure for the Artemis learning platform. It handles environment setup, repository cloning, and git identity configuration in managed Theia workspaces. ## Features -_For features exclusively to the online IDE Theia Cloud, please refer to [Theia Cloud Scorpio README](README_THEIA.md)._ - -### Seamless Authentication - -The plugin allows the student to authenticate to the Artemis Server with the known credentials from the web application. - -![](.github/media/scorpio_login.gif) - -### Exercise Start - -The student can start the exercise from with the IDE. The exercise repository is then automatically cloned into the corresponding workspace. - -![](.github/media/course_selection.gif) - -![](.github/media/cloning.gif) - -### Problem Statement - -The plugin displays the problem statement within the IDE. The problem statement related to the exercise repository, currently open in the student's workspace, is displayed. The problem statement can be composed of text and UML diagrams. - -### UML Diagram Pop Out - -The plugin allows the student to inspect the UML diagrams in detail. Each UML diagram can be opened in a separate window by simply clicking on it. - -![](.github/media/scorpio_uml.gif) - -### Exercise Submission - -The plugin allows the students to submit the exercise directly within the IDE. The submission leads to the synchronization of the student's workspace and the exercise repository and triggers the automatic assessment of the student's submission. - -![](.github/media/submit.gif) - -### Feedback Display - -The plugin displays submission feedback within the IDE. The feedback can either be displayed inside the textual part of the problem statement or within the UML diagrams. This should enable the student to get instant submission feedback and aid the solving process. - -![](.github/media/results.gif) +- **Automatic Repository Cloning:** Clones the exercise repository into the workspace root with path preservation for `.vscode/settings.json`, `.theia`, `persisted`, and `lost+found`. +- **Git Identity:** Configures `user.name` and `user.email` globally, with hostname fallback when credentials are unavailable. +- **Environment Variable Loading:** Reads Theia environment variables via DataBridge or process environment (configurable via `SCORPIO_THEIA_ENV_STRATEGY`). +- **Settings Protection:** Prevents modification of `apiBaseUrl` and `repoPath` in Theia environments. ## Extension Settings -- `scorpio.artemis.apiBaseUrl`: Specifies the base URL of the Artemis API. Default value is `https://artemis.ase.in.tum.de` +- `scorpio.artemis.apiBaseUrl`: The base URL of the Artemis Server. Default: `https://artemis.cit.tum.de` +- `scorpio.defaults.repoPath`: Default path for repository cloning (absolute path). ## Development [Developer Guide](README_DEVELOPER.md) - -## Further Reading - -- Bachelor Thesis: [Scorpio: A Visual Studio Code Extension for Interactive Learning Platforms](<./.github/media/thesis/20241101 Jandow Dennis.pdf>) diff --git a/README_DEVELOPER.md b/README_DEVELOPER.md index 2ebb321..8c1413b 100644 --- a/README_DEVELOPER.md +++ b/README_DEVELOPER.md @@ -2,79 +2,39 @@ ## Setup -Navigate into any of the repositories files and press +Navigate into the repository and press F5 (fn + F5 on Mac) to start the extension in a new VS Code window with the extension loaded. -F5 (fn + F5 on Mac) - -to start the extension [ ref ](https://code.visualstudio.com/api/get-started/your-first-extension#debugging-the-extension). This will open a new instance of VSCode with the extension loaded. \ -Behind the scenes, this shortcut runs the default task in [./vscode/tasks.json](.vscode/tasks.json) - -```bash -npm build -``` - -(`npm run build:webview && npm run build:extension`). This builds the extension and the webview. \ -If you only make changes to the **extension**, it might be faster to set this to +Behind the scenes, this runs the default build task defined in [.vscode/tasks.json](.vscode/tasks.json): ```bash -npm run build:extension +npm run build ``` -to only build the extension. - ## Architecture -_The following diagram shows the architecture **WITH** implementation details. This is not a formal UML diagram, but should give you an overview of the architecture and the communication between components._ - -![](./.github/diagrams/architecture.drawio.png) - -The extension is composed of two main components. The **extension core** and the **webview**. The extension core acts as a proxy to the VSCode Engine and Artemis. The webview mainly has the purpose of displaying UI in the sidebar. The following further differentiate the purpose of each component - -### Core - -- running in a **node.js** environment -- communicates with the VSCode engine to handle the extension **lifecycle**, extension **settings**, extension **commands** -- communicates with the Artemis server to **authenticate**, **fetch and send data** -- holds the extensions **state** - -The core is responsible for interacting with the VSCode engine. It handles basic extension functionality like settings, commands used by `CMD + SHIFT + P` and the extension lifecycle (activation and deactivation). The most important part of this functionality can be found in [src/extension.ts](src/extension.ts). \ -The core also handles the communication with the Artemis server. It is responsible for authenticating the user, fetching and sending exercise data to the server. \ -The webview can NOT communicate with the Artemis API directly due to CORS. Therefore all communication has to go through the core which acts as a proxy. +Scorpio is a Node.js-only VS Code extension (no webview). The source is in `src/` and consists of five modules: -### Webview +- `extension.ts` - Activation: loads Theia env, initializes settings, registers the restart command. +- `shared/settings.ts` - Reads and protects `scorpio.artemis.apiBaseUrl` and `scorpio.defaults.repoPath`. +- `theia/env-strategy.ts` - Two strategies for reading Theia environment variables: `ProcessEnvStrategy` and `DataBridgeStrategy`. +- `theia/theia.ts` - Auto-clone into workspace root with idempotence guard, git identity setup. +- `participation/cloning.service.ts` - Git clone operations with workspace-root path preservation. -- running in a **browser environment** and hosting its own website -- built with **Angular** and support shared components with the Artemis webapp -- **communicates with the core via `postMessage`** calls (all possible commands are defined in the [shared/webview-commands.ts](shared/webview-commands.ts) file) +## Build -The webview is built with Angular to support shared components with the Artemis webapp. Examples how to use Angular in a VSCode webview can be found here: \ -[https://github.com/4gray/vscode-webview-angular/tree/master](https://github.com/4gray/vscode-webview-angular/tree/master) \ -[https://github.com/microsoft/vscode-webview-ui-toolkit-samples/tree/main/frameworks/hello-world-angular](https://github.com/microsoft/vscode-webview-ui-toolkit-samples/tree/main/frameworks/hello-world-angular) \ -This allows us to use the same components in both the webapp and the extension. For now sharable components are implemented separately in each repository. The goal is to merge them both into the Artemis repository in the future. \ -As the webview is running in a browser environment by hosting its own website, it is only possible to embed the webapp within an iframe. With that the extension falls under the CORS policy, preventing the webview from accessing the website properly. Use of the Artemis sameSite=Lax cookie is not possible (This can be also experienced in the VSCode integrated SimpleBroswer). - -## Release a new version - -The release workflow is similar to the one of the Orion plugin. Therefore don't be confused by the different names in the images. The release process is as follows: - -![](.github/media/home_to_release.png) - -1. Go to the GitHub `Releases` in the `scorpio` repository -2. Click on `Draft a new release` - - ![](.github/media/releases_list.png) - -3. Choose as a tag the new version number to release (e.g. tag version `v1.5.0` releases the version `1.5.0`) -4. Let the release notes be auto-generated by clicking `Generate release notes` - - ![](.github/media/create_release.png) - -5. An admin now has to review and accept the new release -6. After the release is approved, GitHub will automatically build and upload the artifact as well as publish the new version to the marketplace. - -The latest plugin artifact is now available on GitHub and via the VS Code marketplace. +```bash +npm install +npm run build # webpack production build +npm run watch # webpack watch mode +npm run lint # eslint +npm run package # vsce package +``` -**It might take some time for the latest version to be seen on the marketplace since VS Code still has to review -and approve the changes!** +## Release -![](.github/media/release.gif) +1. Go to GitHub Releases in the scorpio repository +2. Click "Draft a new release" +3. Choose a tag with the new version number (e.g. `v1.5.0`) +4. Generate release notes automatically +5. An admin reviews and approves the release +6. GitHub builds, uploads the artifact, and publishes to the marketplace diff --git a/README_THEIA.md b/README_THEIA.md index 04686cf..b435500 100644 --- a/README_THEIA.md +++ b/README_THEIA.md @@ -1,5 +1,19 @@ -## Features +# Theia/EduIDE Features -**Automatic Authentication** +Scorpio is primarily designed for Theia/EduIDE environments. All core features (auto-clone, git identity, env loading, settings protection) activate automatically when running in Theia. -**Automatic Exercise Cloning** +## Environment Variables + +Scorpio reads the following variables from the Theia environment: + +| Variable | Required | Purpose | +|----------|----------|---------| +| `ARTEMIS_URL` | Yes | Artemis server base URL | +| `GIT_URI` | Yes | Repository URL to clone | +| `GIT_USER` | No | Git username (falls back to hostname) | +| `GIT_MAIL` | No | Git email (falls back to `@artemis-theia.de`) | +| `THEIA` | No | Explicit Theia flag (auto-detected via DataBridge) | + +## Environment Strategy + +Set `SCORPIO_THEIA_ENV_STRATEGY=data-bridge` to use the DataBridge extension (`tum-aet.data-bridge`) for environment variable loading. Otherwise, process environment variables are read directly. diff --git a/package.json b/package.json index f2bcc18..953cc00 100644 --- a/package.json +++ b/package.json @@ -48,12 +48,6 @@ "webpack-cli": "^5.1.4" }, "contributes": { - "authentication": [ - { - "id": "artemis", - "label": "Credentials" - } - ], "configuration": { "title": "Scorpio - Artemis", "properties": { @@ -79,30 +73,8 @@ "command": "scorpio.restart", "category": "Scorpio", "title": "Restart Extension" - }, - { - "command": "scorpio.login", - "category": "Scorpio", - "title": "Login" - }, - { - "command": "scorpio.logout", - "category": "Scorpio", - "title": "Logout" } - ], - "menus": { - "commandPalette": [ - { - "command": "scorpio.login", - "when": "!scorpio.authenticated" - }, - { - "command": "scorpio.logout", - "when": "scorpio.authenticated" - } - ] - } + ] }, "activationEvents": [ "onStartupFinished" diff --git a/src/artemis/authentication.client.ts b/src/artemis/authentication.client.ts deleted file mode 100644 index bf2555a..0000000 --- a/src/artemis/authentication.client.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { artemisRequest } from "../infra/http/artemis-http.client"; - -export async function authenticateToken( - username: string, - password: string, -): Promise<{ access_token: string }> { - const response = await artemisRequest("/api/core/public/authenticate", { - method: "POST", - query: { tool: "SCORPIO" }, - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - username, - password, - rememberMe: true, - }), - }); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`HTTP error with status: ${response.status} ${errorText}`); - } - - return (await response.json()) as { access_token: string }; -} diff --git a/src/authentication/authentication_provider.ts b/src/authentication/authentication_provider.ts deleted file mode 100644 index ccdb4f1..0000000 --- a/src/authentication/authentication_provider.ts +++ /dev/null @@ -1,170 +0,0 @@ -import * as vscode from "vscode"; -import { authenticateToken } from "../artemis/authentication.client"; -import { theiaEnv } from "../theia/theia"; -import { settings } from "../shared/settings"; -import { hostname } from "os"; - -export const AUTH_ID = "artemis"; -const AUTH_NAME = `Credentials`; // what is displayed on the profile button -var SESSIONS_SECRET_KEY = `${AUTH_ID}.sessions`; - -class ArtemisSession implements vscode.AuthenticationSession { - id: string = AUTH_ID; - accessToken: string; - account: { label: string; id: string }; - scopes: string[]; - - constructor(accessToken: string, username: string, scopes: string[]) { - this.accessToken = accessToken; - this.account = { - label: username, - id: username, - }; - this.scopes = scopes ?? []; - } -} - -export class ArtemisAuthenticationProvider - implements vscode.AuthenticationProvider, vscode.Disposable -{ - private readonly _disposable: vscode.Disposable | undefined; - private sessionPromise: Promise; - - constructor(private readonly secretStorage: vscode.SecretStorage) { - SESSIONS_SECRET_KEY = `${AUTH_ID}.${settings.base_url}.sessions`; - this.sessionPromise = this.getSessionFromStorage(); - - this._disposable = vscode.Disposable.from( - vscode.authentication.registerAuthenticationProvider(AUTH_ID, AUTH_NAME, this), - secretStorage.onDidChange(() => this.checkForUpdates()), - ); - } - - public onAuthSessionsChange = - new vscode.EventEmitter(); - get onDidChangeSessions(): vscode.Event { - return this.onAuthSessionsChange.event; - } - - /** - * Get the existing sessions - * @param scopes - * @returns - */ - public async getSessions(): Promise { - const session = await this.getSessionFromStorage(); - return session ? [session] : []; - } - - private async getSessionFromStorage() { - return this.secretStorage - .get(SESSIONS_SECRET_KEY) - .then((sessionString) => (sessionString ? JSON.parse(sessionString) : undefined)); - } - - private async loginDialog(): Promise<{ username: string; password: string }> { - const username = await vscode.window.showInputBox({ - ignoreFocusOut: true, - prompt: "Enter your Artemis username", - }); - if (!username) { - throw new Error("No username provided"); - } - - const password = await vscode.window.showInputBox({ - ignoreFocusOut: true, - prompt: "Enter your Artemis password", - password: true, - }); - if (!password) { - throw new Error("No password provided"); - } - - return { username, password }; - } - - /** - * Create a new auth session - * @param scopes - * @returns - */ - public async createSession(scopes: string[]): Promise { - var token = ""; - var username = ""; - if (theiaEnv.ARTEMIS_TOKEN) { - token = theiaEnv.ARTEMIS_TOKEN; - username = theiaEnv.GIT_USER ?? hostname(); - } else { - const { username: _username, password: _password } = await this.loginDialog(); - token = (await authenticateToken(_username, _password)).access_token; - if (!token) { - throw new Error(`login failure`); - } - - username = _username; - } - - const session = new ArtemisSession(token, username, scopes); - - await this.secretStorage.store(SESSIONS_SECRET_KEY, JSON.stringify(session)); - - this.onAuthSessionsChange.fire({ - added: [session], - removed: [], - changed: [], - }); - - return session; - } - - // This function is called when the end user signs out of the account. - async removeSession(_sessionId: string = ""): Promise { - const session = await this.sessionPromise; - if (!session) { - return; - } - await this.secretStorage.delete(SESSIONS_SECRET_KEY); - - this.onAuthSessionsChange.fire({ - added: [], - removed: [session], - changed: [], - }); - } - - // This is a crucial function that handles whether or not the token has changed in - // a different window of VS Code and sends the necessary event if it has. - private async checkForUpdates(): Promise { - const added: vscode.AuthenticationSession[] = []; - const removed: vscode.AuthenticationSession[] = []; - - const previousSession = await this.sessionPromise; - this.sessionPromise = this.getSessionFromStorage(); - const currentSession = await this.sessionPromise; - if (!currentSession) { - return; - } - - if (previousSession?.accessToken !== currentSession?.accessToken) { - if (previousSession) { - removed.push(previousSession); - } - - if (currentSession) { - added.push(currentSession); - } - } else { - return; - } - - this.onAuthSessionsChange.fire({ - added: added, - removed: removed, - changed: [], - }); - } - - dispose(): void { - this._disposable?.dispose(); - } -} diff --git a/src/authentication/not_authenticated.error.ts b/src/authentication/not_authenticated.error.ts deleted file mode 100644 index 993ce9e..0000000 --- a/src/authentication/not_authenticated.error.ts +++ /dev/null @@ -1,8 +0,0 @@ -export class NotAuthenticatedError extends Error { - constructor() { - super("Please sign in"); - - // Set the prototype explicitly. - Object.setPrototypeOf(this, NotAuthenticatedError.prototype); - } -} diff --git a/src/extension.ts b/src/extension.ts index 8f0d6d0..861e7c4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,78 +1,17 @@ import * as vscode from "vscode"; -import { ArtemisAuthenticationProvider, AUTH_ID } from "./authentication/authentication_provider"; -import { initTheia, loadTheiaEnv, theiaEnv } from "./theia/theia"; +import { initTheia, loadTheiaEnv } from "./theia/theia"; import { initSettings } from "./shared/settings"; export async function activate(context: vscode.ExtensionContext) { await loadTheiaEnv(); await initTheia(); - initSettings(); - - const authProvider = new ArtemisAuthenticationProvider(context.secrets); - context.subscriptions.push(authProvider); - - let session = await vscode.authentication.getSession(AUTH_ID, [], { silent: true }); - if (!session && theiaEnv.ARTEMIS_TOKEN !== undefined) { - session = await authProvider.createSession([]); - } - vscode.commands.executeCommand("setContext", "scorpio.authenticated", session !== undefined); - - authProvider.onAuthSessionsChange.event(({ added, removed }) => { - if (added && added.length > 0) { - vscode.commands.executeCommand("setContext", "scorpio.authenticated", true); - } - if (removed && removed.length > 0) { - vscode.commands.executeCommand("setContext", "scorpio.authenticated", false); - } - }); - - context.subscriptions.push( - vscode.workspace.onDidChangeConfiguration(async (e) => { - if (!e.affectsConfiguration("scorpio.artemis.apiBaseUrl")) { - return; - } - if (theiaEnv.ARTEMIS_URL) { - return; - } - await authProvider.removeSession(); - vscode.commands.executeCommand("workbench.action.reloadWindow"); - }), - ); + context.subscriptions.push(initSettings()); context.subscriptions.push( vscode.commands.registerCommand("scorpio.restart", () => { vscode.commands.executeCommand("workbench.action.reloadWindow"); }), ); - - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.login", async () => { - try { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: true, - }); - if (!session) { - vscode.window.showErrorMessage("Login failed"); - } - } catch (e: unknown) { - const message = e instanceof Error ? e.message : String(e); - vscode.window.showErrorMessage(`Failed to login: ${message}`); - } - }), - ); - - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.logout", async () => { - const choice = await vscode.window.showWarningMessage( - "Sign out from Artemis - Scorpio", - { modal: true }, - "Sign out", - ); - if (choice === "Sign out") { - await authProvider.removeSession(); - } - }), - ); } export function deactivate() {} diff --git a/src/infra/http/artemis-http.client.ts b/src/infra/http/artemis-http.client.ts deleted file mode 100644 index f6f71ee..0000000 --- a/src/infra/http/artemis-http.client.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { settings } from "../../shared/settings"; - -type QueryValue = string | number | boolean | undefined; - -type ArtemisRequestOptions = { - method?: string; - token?: string; - body?: string | null; - query?: Record; - headers?: Record; -}; - -function buildUrl(path: string, query?: Record): URL { - if (!settings.base_url) { - throw new Error("Base URL is not set"); - } - - const url = new URL(path, settings.base_url); - if (!query) return url; - for (const [key, value] of Object.entries(query)) { - if (value !== undefined) { - url.searchParams.append(key, String(value)); - } - } - return url; -} - -export async function artemisRequest( - path: string, - options: ArtemisRequestOptions = {}, -): Promise { - const headers: Record = { ...options.headers }; - if (options.token) { - headers.Authorization = `Bearer ${options.token}`; - } - - const url = buildUrl(path, options.query); - - return fetch(url, { - method: options.method ?? "GET", - headers, - body: options.body ?? undefined, - }); -} - diff --git a/src/shared/settings.ts b/src/shared/settings.ts index 09e438e..98a6bfd 100644 --- a/src/shared/settings.ts +++ b/src/shared/settings.ts @@ -8,10 +8,10 @@ export type Settings = { export var settings: Settings; -export function initSettings() { +export function initSettings(): vscode.Disposable { settings = getSettings(); - vscode.workspace.onDidChangeConfiguration((e) => { + return vscode.workspace.onDidChangeConfiguration((e) => { handleSettingsChange(e); }); } diff --git a/src/theia/env-strategy.ts b/src/theia/env-strategy.ts index 11ea1d4..9ed6512 100644 --- a/src/theia/env-strategy.ts +++ b/src/theia/env-strategy.ts @@ -3,7 +3,6 @@ import { exec } from "child_process"; export type TheiaEnv = { THEIA_FLAG: boolean; - ARTEMIS_TOKEN: string | undefined; ARTEMIS_URL: string | undefined; GIT_URI: URL | undefined; GIT_USER: string | undefined; @@ -12,14 +11,13 @@ export type TheiaEnv = { const ENV_KEYS = [ "THEIA", - "ARTEMIS_TOKEN", "ARTEMIS_URL", "GIT_URI", "GIT_USER", "GIT_MAIL", ] as const satisfies Array; -const REQUIRED_ENV_KEYS = ["ARTEMIS_TOKEN", "ARTEMIS_URL", "GIT_URI"] as const; +const REQUIRED_ENV_KEYS = ["ARTEMIS_URL", "GIT_URI"] as const; export interface TheiaEnvStrategy { load(): Promise; @@ -30,10 +28,9 @@ function parseTheiaEnv( fromDataBridge: boolean = false, ): TheiaEnv { const gitUriString = env["GIT_URI"]; - const hasRequiredKeys = !!(env["ARTEMIS_TOKEN"] && env["ARTEMIS_URL"] && gitUriString); + const hasRequiredKeys = !!(env["ARTEMIS_URL"] && gitUriString); return { THEIA_FLAG: env["THEIA"] !== undefined || (fromDataBridge && hasRequiredKeys), - ARTEMIS_TOKEN: env["ARTEMIS_TOKEN"], ARTEMIS_URL: env["ARTEMIS_URL"], GIT_URI: gitUriString ? new URL(gitUriString) : undefined, GIT_USER: env["GIT_USER"], @@ -64,7 +61,7 @@ async function getEnvVariable(key: string): Promise { } /** - * Strategy that reads credentials from process environment variables. + * Strategy that reads Theia environment variables from the process. * This is the default/legacy behavior. */ export class ProcessEnvStrategy implements TheiaEnvStrategy { @@ -152,7 +149,7 @@ export class DataBridgeStrategy implements TheiaEnvStrategy { ); return result ?? {}; } catch (error) { - this.outputChannel.appendLine(`Error fetching credentials: ${error}`); + this.outputChannel.appendLine(`Error fetching environment variables: ${error}`); return {}; } } diff --git a/src/theia/theia.ts b/src/theia/theia.ts index 11a6538..b7348ca 100644 --- a/src/theia/theia.ts +++ b/src/theia/theia.ts @@ -8,7 +8,6 @@ import { createTheiaEnvStrategy, TheiaEnv } from "./env-strategy"; export let theiaEnv: TheiaEnv = { THEIA_FLAG: false, - ARTEMIS_TOKEN: undefined, ARTEMIS_URL: undefined, GIT_URI: undefined, GIT_USER: undefined, From d65fc702278180a0b7d62bf2aacf1aa664c4ca7e Mon Sep 17 00:00:00 2001 From: Liam Date: Tue, 19 May 2026 14:33:14 +0200 Subject: [PATCH 16/17] Clean up post-strip cruft: dead configs, credentials, packaging - Remove legacy .eslintrc.json (superseded by eslint.config.js flat config) - Remove unused ts-node devDependency - Drop dead "Extension Tests" launch config and stale ARTEMIS_TOKEN env entry - Replace real VCS credentials in launch.json with placeholders - Exclude dev tooling configs and docs from the VSIX package - Remove yo-code boilerplate quickstart and internal planning docs - Add MIT license text and package.json license field --- .eslintrc.json | 18 - .vscode/launch.json | 26 +- .vscodeignore | 16 +- LICENSE.txt | 21 + .../plans/2026-05-04-scorpio-strip.md | 1036 ----------------- .../specs/2026-05-04-scorpio-strip-design.md | 239 ---- package-lock.json | 158 --- package.json | 2 +- vsc-extension-quickstart.md | 44 - 9 files changed, 32 insertions(+), 1528 deletions(-) delete mode 100644 .eslintrc.json delete mode 100644 docs/superpowers/plans/2026-05-04-scorpio-strip.md delete mode 100644 docs/superpowers/specs/2026-05-04-scorpio-strip-design.md delete mode 100644 vsc-extension-quickstart.md diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index f171a27..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": ["@typescript-eslint"], - "rules": { - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/semi": "warn", - "curly": "warn", - "eqeqeq": "warn", - "no-throw-literal": "warn", - "semi": "off" - }, - "ignorePatterns": ["**/*.d.ts"] -} diff --git a/.vscode/launch.json b/.vscode/launch.json index c6e5c55..3cbca2c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,28 +13,12 @@ "outFiles": ["${workspaceFolder}/dist/**/*.js"], "preLaunchTask": "${defaultBuildTask}", "env": { - // "THEIA":"true", - // "ARTEMIS_TOKEN":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhcnRlbWlzX3Rlc3RfdXNlcl8xIiwiYXV0aCI6IlJPTEVfVVNFUiIsInRvb2xzIjoiU0NPUlBJTyIsImV4cCI6MTczOTY1MzI0N30.OpCoHLV-h3pF_FXrspb455eGC7ltYsE68YZjxTT9RXChSrxOhkuZMRnhHV3dyzhjvNi7pzgvKnvg7ko3F9N-8w", + // Uncomment to simulate a Theia environment locally. + // "THEIA": "true", "ARTEMIS_URL": "https://artemis-test1.artemis.cit.tum.de" - // "GIT_URI":"https://artemis_test_user_1:vcpat-8gBv37zCDU5OSVVVBPYJrn6pjOCmYKCSxe7ZrA954g6P@artemis-test9.artemis.cit.tum.de/git/THEIATESTTESTEXERCISE/theiatesttestexercise-artemis_test_user_1.git", - // "GIT_USER":"dennis", - // "GIT_MAIL":"dp.jandow@gmail.com" - } - }, - { - "name": "Extension Tests", - "type": "extensionHost", - "debugWebWorkerHost": true, - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - // "--extensionDevelopmentKind=web", - "--extensionTestsPath=${workspaceFolder}/dist/test/suite/index" - ], - "outFiles": ["${workspaceFolder}/dist/**/*.js"], - "preLaunchTask": "${defaultBuildTask}", - "env": { - "DEBUG": "true" + // "GIT_URI": "https://:@/git//.git", + // "GIT_USER": "", + // "GIT_MAIL": "" } } ] diff --git a/.vscodeignore b/.vscodeignore index 4f7e94a..886cfda 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -14,17 +14,11 @@ webpack.config.js esbuild.js .github/** -#Ignore all webview files except build directory -webview/src/** -webview/public/** -webview/scripts/** -webview/index.html -webview/README.md -webview/package.json -webview/package-lock.json -webview/node_modules/** -webview/.gitignore -webview/.vscode/** +# Ignore dev tooling configs +eslint.config.js +renovate.json +.oxfmtrc.json +docs/** # Ignore misc .yarnrc diff --git a/LICENSE.txt b/LICENSE.txt index e69de29..507cc7d 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 TUM Applied Education Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/superpowers/plans/2026-05-04-scorpio-strip.md b/docs/superpowers/plans/2026-05-04-scorpio-strip.md deleted file mode 100644 index 442a575..0000000 --- a/docs/superpowers/plans/2026-05-04-scorpio-strip.md +++ /dev/null @@ -1,1036 +0,0 @@ -# Scorpio Strip Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Strip scorpio to its unique Theia features (workspace-root auto-clone, env strategy, settings protection, git identity fallback) plus auth infrastructure, deleting all duplicate features. - -**Architecture:** Delete all user-facing UI (sidebar, course/exercise pickers, submit, repo detection, websocket, UML, realtime sync), the webview app, shared models, and tests. Rewrite extension.ts to only wire up the kept services. Edit retained files to remove dead imports/functions. Update build config (package.json, tsconfig, webpack) for Node-only. - -**Tech Stack:** TypeScript, VS Code Extension API, simple-git, webpack - -**Spec:** `docs/superpowers/specs/2026-05-04-scorpio-strip-design.md` - ---- - -### Task 1: Delete all removed source files and directories - -**Files:** -- Delete: `src/sidebar/` (entire directory) -- Delete: `src/course/` (entire directory) -- Delete: `src/exercise/` (entire directory) -- Delete: `src/problemStatement/` (entire directory) -- Delete: `src/utils/` (entire directory) -- Delete: `src/test/` (entire directory) -- Delete: `webview/` (entire directory) -- Delete: `src/shared/state.ts` -- Delete: `src/shared/repository.service.ts` -- Delete: `src/shared/websocket.ts` -- Delete: `src/participation/realtime-sync.service.ts` -- Delete: `src/participation/realtime.handlers.ts` -- Delete: `src/artemis/course.client.ts` -- Delete: `src/artemis/exercise.client.ts` -- Delete: `src/artemis/participation.client.ts` -- Delete: `src/artemis/problem-statement.client.ts` -- Delete: `shared/webview-commands.ts` -- Delete: `shared/models/course.model.ts` -- Delete: `shared/models/exercise.model.ts` -- Delete: `shared/models/feedback.model.ts` -- Delete: `shared/models/participation.model.ts` -- Delete: `shared/models/result.model.ts` -- Delete: `shared/models/submission.model.ts` -- Delete: `shared/models/testcase.model.ts` -- Delete: `media/artemis_logo.png` -- Delete: `media/artemis_logo.svg` -- Delete: `media/icon2.png` -- Delete: `media/icon2.svg` - -- [ ] **Step 1: Delete directories** - -```bash -rm -rf src/sidebar src/course src/exercise src/problemStatement src/utils src/test webview -``` - -- [ ] **Step 2: Delete individual source files** - -```bash -rm src/shared/state.ts src/shared/repository.service.ts src/shared/websocket.ts -rm src/participation/realtime-sync.service.ts src/participation/realtime.handlers.ts -rm src/artemis/course.client.ts src/artemis/exercise.client.ts src/artemis/participation.client.ts src/artemis/problem-statement.client.ts -``` - -- [ ] **Step 3: Delete shared models and webview protocol** - -```bash -rm shared/webview-commands.ts -rm shared/models/course.model.ts shared/models/exercise.model.ts shared/models/feedback.model.ts shared/models/participation.model.ts shared/models/result.model.ts shared/models/submission.model.ts shared/models/testcase.model.ts -``` - -After deleting all model files, remove the now-empty directories: - -```bash -rmdir shared/models shared -``` - -- [ ] **Step 4: Delete unused media files** - -```bash -rm media/artemis_logo.png media/artemis_logo.svg media/icon2.png media/icon2.svg -``` - -- [ ] **Step 5: Commit** - -```bash -git add -u -git commit -m "Delete all stripped source files, shared models, webview, and unused media" -``` - ---- - -### Task 2: Rewrite extension.ts - -**Files:** -- Modify: `src/extension.ts` - -- [ ] **Step 1: Replace entire contents of `src/extension.ts`** - -```typescript -import * as vscode from "vscode"; -import { ArtemisAuthenticationProvider, AUTH_ID } from "./authentication/authentication_provider"; -import { initTheia, loadTheiaEnv, theiaEnv } from "./theia/theia"; -import { initSettings } from "./shared/settings"; - -export async function activate(context: vscode.ExtensionContext) { - await loadTheiaEnv(); - await initTheia(); - initSettings(); - - const authProvider = new ArtemisAuthenticationProvider(context.secrets); - context.subscriptions.push(authProvider); - - let session = await vscode.authentication.getSession(AUTH_ID, [], { silent: true }); - if (!session && theiaEnv.ARTEMIS_TOKEN !== undefined) { - session = await authProvider.createSession([]); - } - vscode.commands.executeCommand("setContext", "scorpio.authenticated", session !== undefined); - - authProvider.onAuthSessionsChange.event(({ added, removed }) => { - if (added && added.length > 0) { - vscode.commands.executeCommand("setContext", "scorpio.authenticated", true); - } - if (removed && removed.length > 0) { - vscode.commands.executeCommand("setContext", "scorpio.authenticated", false); - } - }); - - context.subscriptions.push( - vscode.workspace.onDidChangeConfiguration(async (e) => { - if (!e.affectsConfiguration("scorpio.artemis.apiBaseUrl")) { - return; - } - if (theiaEnv.ARTEMIS_URL) { - return; - } - await authProvider.removeSession(); - vscode.commands.executeCommand("workbench.action.reloadWindow"); - }), - ); - - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.restart", () => { - vscode.commands.executeCommand("workbench.action.reloadWindow"); - }), - ); - - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.login", async () => { - try { - const session = await vscode.authentication.getSession(AUTH_ID, [], { - createIfNone: true, - }); - if (!session) { - vscode.window.showErrorMessage("Login failed"); - } - } catch (e: unknown) { - const message = e instanceof Error ? e.message : String(e); - vscode.window.showErrorMessage(`Failed to login: ${message}`); - } - }), - ); - - context.subscriptions.push( - vscode.commands.registerCommand("scorpio.logout", async () => { - const choice = await vscode.window.showWarningMessage( - "Sign out from Artemis - Scorpio", - { modal: true }, - "Sign out", - ); - if (choice === "Sign out") { - await authProvider.removeSession(); - } - }), - ); -} - -export function deactivate() {} -``` - -- [ ] **Step 2: Commit** - -```bash -git add src/extension.ts -git commit -m "Rewrite extension.ts: keep only auth, theia init, and three commands" -``` - ---- - -### Task 3: Edit settings.ts (remove circular dep, easter egg, restart logic) - -**Files:** -- Modify: `src/shared/settings.ts` - -- [ ] **Step 1: Replace entire contents of `src/shared/settings.ts`** - -```typescript -import * as vscode from "vscode"; -import { theiaEnv } from "../theia/theia"; - -export type Settings = { - base_url: string | undefined; - default_repo_path: string | undefined; -}; - -export var settings: Settings; - -export function initSettings() { - settings = getSettings(); - - vscode.workspace.onDidChangeConfiguration((e) => { - handleSettingsChange(e); - }); -} - -function getSettings(): Settings { - let base_url = vscode.workspace.getConfiguration("scorpio").get("artemis.apiBaseUrl"); - if (theiaEnv.ARTEMIS_URL) { - const config = vscode.workspace.getConfiguration("scorpio"); - config.update("artemis.apiBaseUrl", theiaEnv.ARTEMIS_URL, vscode.ConfigurationTarget.Global); - base_url = theiaEnv.ARTEMIS_URL; - } - - if (!base_url) { - vscode.window.showErrorMessage("Artemis Base URL not set. Please set it in the settings."); - } - - const default_repo_path = vscode.workspace - .getConfiguration("scorpio") - .get("defaults.repoPath"); - - return { - base_url: base_url, - default_repo_path: default_repo_path, - }; -} - -function handleSettingsChange(e: vscode.ConfigurationChangeEvent) { - if (e.affectsConfiguration("scorpio.artemis.apiBaseUrl")) { - if (theiaEnv.ARTEMIS_URL) { - console.warn("Artemis URL can not be changed in theia environment"); - const config = vscode.workspace.getConfiguration("scorpio"); - config.update("artemis.apiBaseUrl", settings.base_url, vscode.ConfigurationTarget.Global); - return; - } - - const base_url = vscode.workspace.getConfiguration("scorpio").get("artemis.apiBaseUrl"); - if (!base_url) { - vscode.window.showErrorMessage("Artemis Base URL not set. Please set it in the settings."); - } - settings.base_url = base_url; - } - - if (e.affectsConfiguration("scorpio.defaults.repoPath")) { - if (theiaEnv.THEIA_FLAG) { - console.warn("Default repository path can not be changed in theia environment"); - const config = vscode.workspace.getConfiguration("scorpio"); - config.update( - "defaults.repoPath", - settings.default_repo_path, - vscode.ConfigurationTarget.Global, - ); - return; - } - - const default_repo_path = vscode.workspace - .getConfiguration("scorpio") - .get("defaults.repoPath"); - settings.default_repo_path = default_repo_path; - } -} -``` - -- [ ] **Step 2: Commit** - -```bash -git add src/shared/settings.ts -git commit -m "Strip settings.ts: remove circular dep, easter egg, and restart logic" -``` - ---- - -### Task 4: Edit cloning.service.ts (remove cloneUserRepo and dead imports) - -**Files:** -- Modify: `src/participation/cloning.service.ts` - -- [ ] **Step 1: Replace entire contents of `src/participation/cloning.service.ts`** - -Keep only `cloneByGivenURL`, `cloneIntoWorkspaceRoot`, and all helpers. Remove `cloneUserRepo` and its imports. - -```typescript -import simpleGit from "simple-git"; -import { tmpdir } from "os"; -import * as path from "path"; -import * as fs from "fs/promises"; - -type CloneMode = "subdirectory" | "workspace-root"; - -type CloneOptions = { - mode?: CloneMode; - preservedPaths?: string[]; -}; - -type PreservedWorkspaceEntry = { - relativePath: string; - backupPath: string; - isDirectory: boolean; -}; - -const THEIA_PRESERVED_PATHS = [".vscode/settings.json", ".theia", "persisted", "lost+found"]; - -export async function cloneByGivenURL( - cloneUrl: URL, - destinationPath: string, - options?: CloneOptions, -): Promise { - if (options?.mode === "workspace-root") { - return cloneIntoWorkspaceRoot( - cloneUrl, - destinationPath, - options.preservedPaths ?? THEIA_PRESERVED_PATHS, - ); - } - - const repoName = path.basename(cloneUrl.pathname, ".git"); - const clonePath = path.join(destinationPath, repoName); - - const gitForClone = simpleGit(destinationPath); - - try { - await gitForClone.clone(cloneUrl.toString(), clonePath); - } catch (e: any) { - throw new Error(`Error cloning repository: ${e.message}`); - } - - return clonePath; -} - -async function cloneIntoWorkspaceRoot( - cloneUrl: URL, - workspacePath: string, - preservedPaths: string[] = [], -): Promise { - const backupRoot = await fs.mkdtemp(path.join(tmpdir(), "scorpio-workspace-clone-")); - const preservedEntries = await movePreservedWorkspaceEntries( - workspacePath, - preservedPaths, - backupRoot, - ); - - let cloneSucceeded = false; - let restoredEntries: PreservedWorkspaceEntry[] = []; - - try { - await clearDirectory(workspacePath); - - const gitForClone = simpleGit(workspacePath); - await gitForClone.clone(cloneUrl.toString(), "."); - cloneSucceeded = true; - - return workspacePath; - } catch (e: any) { - throw new Error(`Error cloning repository into workspace root: ${e.message}`); - } finally { - restoredEntries = await restorePreservedWorkspaceEntries(workspacePath, preservedEntries); - - if (cloneSucceeded) { - await addEntriesToGitExclude(workspacePath, restoredEntries); - } - - await fs.rm(backupRoot, { recursive: true, force: true }); - } -} - -async function movePreservedWorkspaceEntries( - workspacePath: string, - preservedPaths: string[], - backupRoot: string, -): Promise { - const preservedEntries: PreservedWorkspaceEntry[] = []; - - for (const relativePath of preservedPaths) { - const sourcePath = path.join(workspacePath, relativePath); - const sourceStats = await safeStat(sourcePath); - if (!sourceStats) { - continue; - } - - const backupPath = path.join(backupRoot, relativePath); - await ensureParentDirectory(backupPath); - await copyPath(sourcePath, backupPath, sourceStats.isDirectory()); - await fs.rm(sourcePath, { recursive: true, force: true }); - - preservedEntries.push({ - relativePath, - backupPath, - isDirectory: sourceStats.isDirectory(), - }); - } - - return preservedEntries; -} - -async function restorePreservedWorkspaceEntries( - workspacePath: string, - preservedEntries: PreservedWorkspaceEntry[], -): Promise { - const restoredEntries: PreservedWorkspaceEntry[] = []; - - for (const entry of preservedEntries) { - const targetPath = path.join(workspacePath, entry.relativePath); - const targetStats = await safeStat(targetPath); - - if (!targetStats) { - await ensureParentDirectory(targetPath); - await copyPath(entry.backupPath, targetPath, entry.isDirectory); - restoredEntries.push(entry); - } - - await fs.rm(entry.backupPath, { recursive: true, force: true }); - } - - return restoredEntries; -} - -async function addEntriesToGitExclude( - workspacePath: string, - restoredEntries: PreservedWorkspaceEntry[], -): Promise { - if (restoredEntries.length === 0) { - return; - } - - const excludePath = path.join(workspacePath, ".git", "info", "exclude"); - const existingContent = await fs.readFile(excludePath, "utf8").catch(() => ""); - const existingEntries = new Set(existingContent.split(/\r?\n/).filter(Boolean)); - const newEntries = restoredEntries.map((entry) => - entry.isDirectory - ? `${normalizeGitPath(entry.relativePath)}/` - : normalizeGitPath(entry.relativePath), - ); - - let hasChanges = false; - for (const entry of newEntries) { - if (!existingEntries.has(entry)) { - existingEntries.add(entry); - hasChanges = true; - } - } - - if (!hasChanges) { - return; - } - - await ensureParentDirectory(excludePath); - const nextContent = `${Array.from(existingEntries).join("\n")}\n`; - await fs.writeFile(excludePath, nextContent, "utf8"); -} - -async function clearDirectory(directoryPath: string): Promise { - const entries = await fs.readdir(directoryPath); - await Promise.all( - entries.map((entry) => - fs.rm(path.join(directoryPath, entry), { recursive: true, force: true }), - ), - ); -} - -async function ensureParentDirectory(filePath: string): Promise { - await fs.mkdir(path.dirname(filePath), { recursive: true }); -} - -async function copyPath( - sourcePath: string, - targetPath: string, - isDirectory: boolean, -): Promise { - if (isDirectory) { - await fs.cp(sourcePath, targetPath, { recursive: true, force: true }); - } else { - await fs.copyFile(sourcePath, targetPath); - } -} - -async function safeStat(targetPath: string) { - try { - return await fs.lstat(targetPath); - } catch { - return undefined; - } -} - -function normalizeGitPath(relativePath: string): string { - return relativePath.split(path.sep).join("/"); -} -``` - -- [ ] **Step 2: Commit** - -```bash -git add src/participation/cloning.service.ts -git commit -m "Strip cloning.service.ts: remove cloneUserRepo and dead imports" -``` - ---- - -### Task 5: Add idempotence guard to theia.ts - -**Files:** -- Modify: `src/theia/theia.ts` - -- [ ] **Step 1: Replace entire contents of `src/theia/theia.ts`** - -```typescript -import * as vscode from "vscode"; -import simpleGit, { GitConfigScope } from "simple-git"; -import { hostname } from "os"; -import * as path from "path"; -import { cloneByGivenURL } from "../participation/cloning.service"; -import { createTheiaEnvStrategy, TheiaEnv } from "./env-strategy"; - -export let theiaEnv: TheiaEnv = { - THEIA_FLAG: false, - ARTEMIS_TOKEN: undefined, - ARTEMIS_URL: undefined, - GIT_URI: undefined, - GIT_USER: undefined, - GIT_MAIL: undefined, -}; - -export async function loadTheiaEnv(): Promise { - const strategy = await createTheiaEnvStrategy(); - theiaEnv = await strategy.load(); -} - -export function getWorkspaceFolder() { - return vscode.workspace.workspaceFolders?.at(0)?.uri; -} - -function normalizeRepoUrl(raw: string): string { - try { - const url = new URL(raw); - url.username = ""; - url.password = ""; - if ( - (url.protocol === "https:" && url.port === "443") || - (url.protocol === "http:" && url.port === "80") - ) { - url.port = ""; - } - let normalized = url.origin.toLowerCase() + url.pathname; - normalized = normalized.replace(/\.git\/?$/, ""); - normalized = normalized.replace(/\/+$/, ""); - return normalized; - } catch { - return raw; - } -} - -async function isRepoAlreadyCloned(workspacePath: string, targetUri: URL): Promise { - const gitPath = path.join(workspacePath, ".git"); - try { - await import("fs/promises").then((fs) => fs.stat(gitPath)); - } catch { - return false; - } - - try { - const git = simpleGit(workspacePath); - const remotes = await git.getRemotes(true); - const origin = remotes.find((r) => r.name === "origin"); - if (!origin?.refs.fetch) { - return false; - } - return normalizeRepoUrl(origin.refs.fetch) === normalizeRepoUrl(targetUri.toString()); - } catch { - return false; - } -} - -export async function initTheia() { - if (theiaEnv.GIT_URI) { - vscode.commands.executeCommand("setContext", "scorpio.theia.givenExercise", true); - } - - if (theiaEnv.GIT_URI) { - const workspaceFolderUri = getWorkspaceFolder(); - if (!workspaceFolderUri) { - vscode.window.showErrorMessage("No workspace folder available to clone repository"); - return; - } - - const alreadyCloned = await isRepoAlreadyCloned( - workspaceFolderUri.fsPath, - theiaEnv.GIT_URI, - ); - if (alreadyCloned) { - console.log("Repository already present, skipping auto-clone"); - } else { - await cloneByGivenURL(theiaEnv.GIT_URI, workspaceFolderUri.fsPath, { - mode: "workspace-root", - }); - } - } - - if (theiaEnv.THEIA_FLAG) { - try { - const git = simpleGit(); - const hostnameConst = hostname(); - theiaEnv.GIT_USER = theiaEnv.GIT_USER ? theiaEnv.GIT_USER : hostnameConst; - theiaEnv.GIT_MAIL = theiaEnv.GIT_MAIL - ? theiaEnv.GIT_MAIL - : theiaEnv.GIT_USER - ? theiaEnv.GIT_USER + "@artemis-theia.de" - : hostnameConst + "@artemis-theia.de"; - - await git.addConfig("user.name", theiaEnv.GIT_USER, undefined, GitConfigScope.global); - await git.addConfig("user.email", theiaEnv.GIT_MAIL, undefined, GitConfigScope.global); - } catch (e: any) { - console.error(`Error setting git config: ${e.message}`); - } - } -} -``` - -- [ ] **Step 2: Commit** - -```bash -git add src/theia/theia.ts -git commit -m "Add idempotence guard: skip auto-clone if repo already matches GIT_URI" -``` - ---- - -### Task 6: Edit env-strategy.ts (required vs optional keys, THEIA_FLAG auto-set) - -**Files:** -- Modify: `src/theia/env-strategy.ts` - -- [ ] **Step 1: Edit `parseTheiaEnv` to accept an optional `fromDataBridge` parameter** - -Replace the `parseTheiaEnv` function (lines 26-36): - -```typescript -function parseTheiaEnv( - env: Record, - fromDataBridge: boolean = false, -): TheiaEnv { - const gitUriString = env["GIT_URI"]; - const hasRequiredKeys = !!(env["ARTEMIS_TOKEN"] && env["ARTEMIS_URL"] && gitUriString); - return { - THEIA_FLAG: env["THEIA"] !== undefined || (fromDataBridge && hasRequiredKeys), - ARTEMIS_TOKEN: env["ARTEMIS_TOKEN"], - ARTEMIS_URL: env["ARTEMIS_URL"], - GIT_URI: gitUriString ? new URL(gitUriString) : undefined, - GIT_USER: env["GIT_USER"], - GIT_MAIL: env["GIT_MAIL"], - }; -} -``` - -- [ ] **Step 2: Add required keys constant and update poll completion condition** - -Add after `ENV_KEYS` (after line 20): - -```typescript -const REQUIRED_ENV_KEYS = ["ARTEMIS_TOKEN", "ARTEMIS_URL", "GIT_URI"] as const; -``` - -Then replace the completion condition in `pollForEnvironmentVariables` (line 124): - -Replace: -```typescript - if (ENV_KEYS.every((key) => Boolean(env[key]))) { - this.outputChannel.appendLine("Environment variables received from bridge"); - return parseTheiaEnv(env); - } -``` - -With: -```typescript - if (REQUIRED_ENV_KEYS.every((key) => Boolean(env[key]))) { - this.outputChannel.appendLine("Environment variables received from bridge"); - return parseTheiaEnv(env, true); - } -``` - -- [ ] **Step 3: Update the timeout fallback to also pass `fromDataBridge: false`** - -The existing `return new ProcessEnvStrategy().load();` on line 138 is already correct (ProcessEnvStrategy calls `parseTheiaEnv(env)` which defaults `fromDataBridge` to `false`). No change needed. - -- [ ] **Step 4: Commit** - -```bash -git add src/theia/env-strategy.ts -git commit -m "DataBridge: only require ARTEMIS_TOKEN/URL/GIT_URI, auto-set THEIA_FLAG" -``` - ---- - -### Task 7: Edit authentication.client.ts (remove dead VCS token functions) - -**Files:** -- Modify: `src/artemis/authentication.client.ts` - -- [ ] **Step 1: Replace entire contents of `src/artemis/authentication.client.ts`** - -```typescript -import { artemisRequest } from "../infra/http/artemis-http.client"; - -export async function authenticateToken( - username: string, - password: string, -): Promise<{ access_token: string }> { - const response = await artemisRequest("/api/core/public/authenticate", { - method: "POST", - query: { tool: "SCORPIO" }, - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - username, - password, - rememberMe: true, - }), - }); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`HTTP error with status: ${response.status} ${errorText}`); - } - - return response.json(); -} -``` - -- [ ] **Step 2: Commit** - -```bash -git add src/artemis/authentication.client.ts -git commit -m "Remove dead retrieveVcsAccessToken from authentication client" -``` - ---- - -### Task 8: Update package.json - -**Files:** -- Modify: `package.json` - -- [ ] **Step 1: Replace entire contents of `package.json`** - -```json -{ - "name": "artemis-scorpio", - "displayName": "Artemis - Scorpio", - "version": "0.0.0", - "description": "", - "private": true, - "categories": [ - "Other" - ], - "bugs": { - "url": "https://github.com/EduIDE/scorpio/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/EduIDE/scorpio.git" - }, - "publisher": "tum-aet", - "main": "./dist/extension.js", - "scripts": { - "install:all": "npm install --no-scripts", - "build": "webpack --mode production", - "watch": "webpack --watch", - "install:extension": "npm install --no-scripts", - "build:extension": "webpack --mode production", - "compile:extension": "webpack", - "watch:extension": "webpack --watch", - "lint": "eslint src", - "package": "vsce package", - "vscode:prepublish": "npm run build", - "fmt": "oxfmt", - "fmt:check": "oxfmt --check" - }, - "dependencies": { - "simple-git": "^3.27.0" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "@types/vscode": "^1.94.0", - "@typescript-eslint/eslint-plugin": "^8.9.0", - "@typescript-eslint/parser": "^8.9.0", - "@vscode/vsce": "^3.1.1", - "eslint": "^9.39.3", - "oxfmt": "^0.31.0", - "ts-loader": "^9.5.1", - "ts-node": "^10.9.2", - "typescript": "^5.5.4", - "webpack": "^5.93.0", - "webpack-cli": "^5.1.4" - }, - "contributes": { - "authentication": [ - { - "id": "artemis", - "label": "Credentials" - } - ], - "configuration": { - "title": "Scorpio - Artemis", - "properties": { - "scorpio.artemis.apiBaseUrl": { - "order": 1, - "description": "The base URL of the Artemis Server", - "type": "string", - "format": "uri", - "editPresentation": "singlelineText", - "default": "https://artemis.cit.tum.de" - }, - "scorpio.defaults.repoPath": { - "order": 3, - "description": "The default to search for and clone repositories into - has to be an absolute path", - "editPresentation": "singlelineText", - "type": "string", - "format": "path" - } - } - }, - "commands": [ - { - "command": "scorpio.restart", - "category": "Scorpio", - "title": "Restart Extension" - }, - { - "command": "scorpio.login", - "category": "Scorpio", - "title": "Login" - }, - { - "command": "scorpio.logout", - "category": "Scorpio", - "title": "Logout" - } - ], - "menus": { - "commandPalette": [ - { - "command": "scorpio.login", - "when": "!scorpio.authenticated" - }, - { - "command": "scorpio.logout", - "when": "scorpio.authenticated" - } - ] - } - }, - "activationEvents": [ - "onStartupFinished" - ], - "extensionKind": [ - "workspace" - ], - "icon": "media/icon.png", - "engines": { - "vscode": "^1.95.0" - } -} -``` - -- [ ] **Step 2: Commit** - -```bash -git add package.json -git commit -m "Strip package.json: remove unused deps, views, commands, menus, browser config" -``` - ---- - -### Task 9: Update tsconfig.json - -**Files:** -- Modify: `tsconfig.json` - -- [ ] **Step 1: Replace entire contents of `tsconfig.json`** - -```json -{ - "compilerOptions": { - "module": "Node16", - "target": "ES2020", - "outDir": "dist", - "lib": ["ES2020"], - "sourceMap": true, - "rootDir": "./", - "strict": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "noUnusedParameters": true, - "noUnusedLocals": true, - "noImplicitThis": true, - "skipLibCheck": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules"] -} -``` - -- [ ] **Step 2: Commit** - -```bash -git add tsconfig.json -git commit -m "tsconfig: remove shared aliases, WebWorker lib, webview exclude" -``` - ---- - -### Task 10: Update webpack.config.js - -**Files:** -- Modify: `webpack.config.js` - -- [ ] **Step 1: Replace entire contents of `webpack.config.js`** - -```javascript -//@ts-check -"use strict"; - -/** @typedef {import('webpack').Configuration} WebpackConfig **/ - -const path = require("path"); - -/** @type WebpackConfig */ -const extensionConfig = { - mode: "none", - target: "node", - entry: { - extension: "./src/extension.ts", - }, - output: { - filename: "[name].js", - path: path.join(__dirname, "dist"), - libraryTarget: "commonjs", - devtoolModuleFilenameTemplate: "../[resource-path]", - }, - resolve: { - mainFields: ["main", "module"], - extensions: [".ts", ".js"], - }, - module: { - rules: [ - { - test: /\.ts$/, - exclude: /node_modules/, - use: [ - { - loader: "ts-loader", - }, - ], - }, - ], - }, - externals: { - vscode: "commonjs vscode", - }, - performance: { - hints: false, - }, - devtool: "nosources-source-map", - infrastructureLogging: { - level: "log", - }, -}; - -module.exports = [extensionConfig]; -``` - -- [ ] **Step 2: Commit** - -```bash -git add webpack.config.js -git commit -m "webpack: Node-only config, remove browser polyfills, test entry, plugins" -``` - ---- - -### Task 11: Clean install, build, lint - -**Files:** None (verification only) - -- [ ] **Step 1: Regenerate lockfile and install** - -```bash -rm -rf node_modules dist package-lock.json && npm install -``` - -- [ ] **Step 2: Build** - -```bash -npm run build:extension -``` - -Expected: successful webpack build with no errors. - -- [ ] **Step 3: Lint** - -```bash -npm run lint -``` - -Expected: no errors. If there are warnings from naming conventions, fix them. - -- [ ] **Step 4: Verify dist output** - -```bash -ls -la dist/extension.js -``` - -Expected: single bundled file exists. - -- [ ] **Step 5: Commit lockfile** - -```bash -git add package-lock.json -git commit -m "Regenerate package-lock.json after dependency cleanup" -``` - -- [ ] **Step 6: Manual verification checklist** - -These cannot be automated in this plan. Verify each manually: - -1. **Theia auto-clone**: In a Theia/EduIDE environment with `GIT_URI` set, confirm the repository is cloned into the workspace root (not a subdirectory), `.theia`/`persisted`/`lost+found` are preserved, and `.git/info/exclude` contains restored entries. -2. **Idempotence guard**: Reload the extension (Cmd+Shift+P > "Developer: Reload Window") with an existing cloned repo. Confirm the extension host log shows "Repository already present, skipping auto-clone" and the workspace is NOT wiped. -3. **VS Code Desktop login/logout**: Open command palette, run "Scorpio: Login", enter credentials, confirm `scorpio.authenticated` context is set. Then run "Scorpio: Logout", confirm session is cleared. -4. **Extension host errors**: Open Output panel > "Extension Host" channel. Confirm no errors from scorpio on activation. diff --git a/docs/superpowers/specs/2026-05-04-scorpio-strip-design.md b/docs/superpowers/specs/2026-05-04-scorpio-strip-design.md deleted file mode 100644 index f1d9589..0000000 --- a/docs/superpowers/specs/2026-05-04-scorpio-strip-design.md +++ /dev/null @@ -1,239 +0,0 @@ -# Scorpio Strip: Remove Feature Duplicates for Parallel Installation - -**Date:** 2026-05-04 -**Status:** Approved (codex-reviewed) -**PR Target:** `main` (scorpio has no `dev` branch) - -## Problem - -The scorpio VS Code extension and the artemis-extension (Iris Thaumantias) share many features: authentication, exercise browsing, sidebar UI, repository cloning, submission, WebSocket real-time sync, problem statement display, and UML rendering. Both extensions must be installable side-by-side in the same VS Code / Theia instance without runtime conflicts. Scorpio will be repurposed later for a different use case (TBD). - -## Decision - -Strip scorpio down to its unique features (things artemis-extension does not provide) plus authentication infrastructure. Everything else gets deleted. - -## Features Retained - -### 1. Workspace-Root Auto-Clone with Path Preservation - -**Source:** `src/theia/theia.ts`, `src/participation/cloning.service.ts` - -In Theia/EduIDE, the exercise repository must live at the workspace root (`/home/project`), not in a subdirectory. Artemis-extension clones into `workspaceRoot/repoName/`, which is wrong for Theia. - -Scorpio's clone flow: -1. Backs up Theia-owned paths (`.vscode/settings.json`, `.theia`, `persisted`, `lost+found`) to a temp directory -2. Clears the workspace directory -3. Clones with `git clone .` (repo becomes workspace root) -4. Restores backed-up paths only if the cloned repo does not provide them (repo content wins) -5. Adds restored paths to `.git/info/exclude` - -**New: Idempotence guard.** Before cloning, check if `.git` already exists in the workspace and the normalized origin remote URL matches `GIT_URI`. If so, skip the clone. Only HTTPS URL forms are supported (Artemis/data-bridge only produces HTTPS URLs; SSH is out of scope). URL normalization: -- Strip userinfo (credentials) -- Remove `.git` suffix -- Remove trailing slashes -- Lowercase scheme and hostname -- Normalize default ports (remove `:443` for https, `:80` for http) - -If `.git` exists as a file (worktree), treat it the same as a directory (read origin remote via simple-git). If no origin remote exists, proceed with clone. If URLs don't match, proceed with clone. - -### 2. ProcessEnvStrategy (Env-Var Fallback) - -**Source:** `src/theia/env-strategy.ts` - -Reads Theia environment variables via two strategies: -- **DataBridgeStrategy:** Polls the `tum-aet.data-bridge` companion extension (500ms interval, 10s timeout). **Required keys:** `ARTEMIS_TOKEN`, `ARTEMIS_URL`, `GIT_URI`. **Optional keys:** `GIT_USER`, `GIT_MAIL` (hostname fallback exists). `THEIA` key: optional, but if the data-bridge strategy is active and returns required keys, `THEIA_FLAG` must be set to `true` regardless of whether the `THEIA` key was explicitly provided. Falls back to ProcessEnvStrategy on timeout or missing extension. -- **ProcessEnvStrategy:** Reads each variable via `exec("echo $VAR")`. Legacy fallback that artemis-extension deliberately does not implement (artemis-extension hard-fails when the bridge is unavailable). - -Strategy selection via `SCORPIO_THEIA_ENV_STRATEGY` environment variable. - -### 3. Settings Protection in Theia - -**Source:** `src/shared/settings.ts` - -In managed Theia environments, user-initiated config changes to `scorpio.artemis.apiBaseUrl` and `scorpio.defaults.repoPath` are reverted with a warning. Prevents students from accidentally breaking their environment. - -### 4. Git Identity with Hostname Fallback - -**Source:** `src/theia/theia.ts` (lines 48-65) - -Sets global git `user.name` and `user.email` from environment variables. Falls back to `os.hostname()` for user name and `{hostname}@artemis-theia.de` for email. Artemis-extension sets per-repo config without fallback. - -### 5. Authentication - -**Source:** `src/authentication/authentication_provider.ts`, `src/artemis/authentication.client.ts`, `src/infra/http/artemis-http.client.ts` - -VS Code Authentication Provider (ID: `"artemis"`). Login dialog for non-Theia, auto-session from `ARTEMIS_TOKEN` in Theia. SecretStorage persistence. Retained for potential future use when scorpio is repurposed. - -**Known risk:** Auth provider ID `"artemis"` does not collide today (artemis-extension uses its own AuthManager, not the VS Code Auth API). If artemis-extension ever registers an `"artemis"` auth provider, this will need renaming. - -## Files Retained (with changes) - -### `src/extension.ts` (rewrite) - -New activate() flow: -1. `loadTheiaEnv()` - load environment variables -2. `initTheia()` - auto-clone if GIT_URI set (with idempotence guard) -3. `initSettings()` - load configuration -4. Initialize auth provider, attempt silent session, create from token if in Theia -5. Register config change listener for base-URL changes: **skip if `theiaEnv.ARTEMIS_URL` is set** (Theia protection in settings.ts handles that case). Otherwise, invalidate auth session and trigger window reload. -6. Register commands: `scorpio.restart` (calls `workbench.action.reloadWindow`), `scorpio.login`, `scorpio.logout` - -The `authenticationProvider` variable is no longer exported. Session invalidation on URL change moves from `settings.ts` into `extension.ts` (registered after auth init, guarded against Theia). - -### `src/participation/cloning.service.ts` (edit) - -Remove `cloneUserRepo()` and its imports (`settings`, `AUTH_ID`, `NotAuthenticatedError`, `getState`, `retrieveVcsAccessToken`, `addVcsTokenToUrl`). Keep `cloneByGivenURL()`, `cloneIntoWorkspaceRoot()`, and all helper functions (backup/restore/exclude/clear). - -### `src/shared/settings.ts` (edit) - -- Remove import of `authenticationProvider` from `extension.ts` (breaks circular dependency) -- Remove `easter_egg` field and `scorpio.?` handling -- Remove `authenticationProvider.removeSession()` call from URL-change handler (moved to extension.ts) -- Remove the `scorpio.restart` command execution from URL-change handler (extension.ts handles reload) -- Keep Theia protection logic (revert apiBaseUrl and repoPath changes) - -### `src/theia/theia.ts` (edit) - -Add idempotence guard in `initTheia()` before the clone call: -1. Check if workspace root contains `.git` (handle both directory and file/worktree) -2. If `.git` exists, read origin remote URL via `simple-git` -3. If no origin remote, proceed with clone -4. Normalize both `GIT_URI` and origin URL (HTTPS only, as specified above) -5. If normalized URLs match, skip clone and log "Repository already present, skipping auto-clone" -6. If no match, proceed with clone - -### `src/theia/env-strategy.ts` (edit) - -Modify `DataBridgeStrategy.pollForEnvironmentVariables()`: -- Change the completion condition: return as soon as required keys (`ARTEMIS_TOKEN`, `ARTEMIS_URL`, `GIT_URI`) are present. Do not wait for optional keys (`GIT_USER`, `GIT_MAIL`). -- In `parseTheiaEnv()`: if the strategy is DataBridge and required keys were received, set `THEIA_FLAG` to `true` even if the `THEIA` env var was not explicitly provided. - -### `src/artemis/authentication.client.ts` (edit) - -Remove `retrieveVcsAccessToken()` and `getVcsAccessToken()` (dead code after `cloneUserRepo` removal). Keep `authenticateToken()`. - -### Files retained as-is - -- `src/authentication/authentication_provider.ts` -- `src/authentication/not_authenticated.error.ts` -- `src/infra/http/artemis-http.client.ts` - -## Files Deleted - -### Entire directories -- `src/sidebar/` (sidebarProvider.ts, getNonce.ts, getUri.ts) -- `src/course/` (course.ts) -- `src/exercise/` (exercise.ts) -- `src/problemStatement/` (problem_statement.ts, uml.service.ts, uml.db.ts) -- `src/utils/` (filetree.ts) -- `src/test/` (extension.test.ts, index.ts) -- `webview/` (entire Angular sidebar app) - -### Individual files -- `src/shared/state.ts` - in-memory state management (only used by removed features) -- `src/shared/repository.service.ts` - repo detection + submit -- `src/shared/websocket.ts` - STOMP WebSocket client -- `src/participation/realtime-sync.service.ts` - realtime sync + polling fallback -- `src/participation/realtime.handlers.ts` - result/submission message handlers -- `src/artemis/course.client.ts` - course API -- `src/artemis/exercise.client.ts` - exercise API -- `src/artemis/participation.client.ts` - participation API -- `src/artemis/problem-statement.client.ts` - problem statement API - -### Shared models and webview protocol -- `shared/webview-commands.ts` -- `shared/models/course.model.ts` -- `shared/models/exercise.model.ts` -- `shared/models/feedback.model.ts` -- `shared/models/participation.model.ts` -- `shared/models/result.model.ts` -- `shared/models/submission.model.ts` -- `shared/models/testcase.model.ts` - -(All shared model files are only imported by deleted source files. `authenticateToken` does not reference any shared models.) - -### Media files -- `media/artemis_logo.png` -- `media/artemis_logo.svg` -- `media/icon2.png` -- `media/icon2.svg` - -Keep `media/icon.png` and `media/icon.svg` (referenced by package.json). - -## package.json Changes - -### Added -- `"private": true` (prevent accidental publishing) - -### Removed from contributes -- `viewsContainers` (entire section) -- `views` (entire section) -- `commands`: remove `scorpio.displayExercise`, `scorpio.displayedExercise.back`, `scorpio.displayedExercise.clone`, `scorpio.workspace.submit`, `scorpio.workspace.detectRepo`, `scorpio.workspace.sync`, `scorpio.sidebar.refresh` -- `menus`: remove all entries except login/logout in commandPalette. Remove `editor/title` and `view/title` sections entirely. -- `configuration.properties`: remove `scorpio.?` - -### Removed from dependencies -- `@stomp/stompjs`, `sockjs-client`, `ws`, `fetch-cookie`, `markdown-it`, `uuid`, `os-browserify`, `path-browserify` -- `@vscode/vsce` (move to devDependencies) -- `ts-node` (move to devDependencies) - -### Removed from devDependencies -- `@types/sockjs-client`, `@types/stompjs`, `@types/ws`, `@vscode/test-web` -- `@types/assert`, `@types/mocha`, `@types/webpack-env` -- `assert`, `process`, `html-loader`, `raw-loader`, `dotenv`, `mocha` - -### Added to devDependencies -- `@types/node` -- `@vscode/vsce` (moved from dependencies) -- `ts-node` (moved from dependencies) - -### Removed from extensionDependencies -- `vscode.git` (only `simple-git` is used, not the VS Code Git API) - -### Other -- Remove `browser` field (no longer a web extension) -- Change `extensionKind` from `["ui", "workspace"]` to `["workspace"]` -- Remove scripts: `install:webview`, `build:webview`, `watch:webview`, `test`, `pretest`, `run-in-browser`, `open-in-browser` -- Update composite scripts: `install:all` becomes just `npm install --no-scripts`, `build` becomes just `webpack --mode production`, `watch` becomes just `webpack --watch` - -## tsconfig.json Changes - -- Remove `@shared/*` and `@shared/models/*` path aliases (all shared files deleted) -- Remove `"shared/**/*"` from `include` -- Change `lib` from `["ES2020", "WebWorker"]` to `["ES2020"]` (Node-only extension) -- Remove `"webview"` from `exclude` (webview deleted) - -## webpack.config.js Changes - -- Remove `"test/suite/index"` entry (test directory deleted) -- Remove entire `resolve.fallback` block (including `crypto: false`, `assert`, `path`, `os`) -- Change `resolve.mainFields` from `["main", "module", "browser"]` to `["main", "module"]` -- Remove `resolve.alias` for `@shared` (shared directory deleted) -- Remove `LimitChunkCountPlugin` (web-extension-specific, not needed for Node) -- Remove `ProvidePlugin` for `process` shim -- Remove `externals` for `bufferutil` and `utf-8-validate` (ws dependencies, ws removed) -- Keep only `vscode: "commonjs vscode"` in externals -- Fix comment: target is `"node"`, not webworker - -## package-lock.json - -Must be regenerated after dependency changes: `rm -rf node_modules package-lock.json && npm install` - -## Verification - -After all changes: -1. `rm -rf node_modules dist package-lock.json && npm install && npm run build:extension` (clean build from scratch) -2. `npm run lint` -3. Manual test in Theia: verify auto-clone still works with GIT_URI -4. Manual test: reload extension with existing repo, verify idempotence guard skips clone -5. Manual test in VS Code Desktop: verify login/logout commands work -6. Verify no runtime errors in extension host output - -## Follow-up Items (not in this PR) - -- `git ls-remote` pre-check before workspace clear (safety improvement) -- Settings scope limitation: Theia protection only reverts Global scope, not Workspace scope overrides -- Evaluate renaming auth provider ID from `"artemis"` to `"scorpio-artemis"` when scorpio's new purpose is defined -- Port workspace-root clone to artemis-extension (if desired, separate PR against `dev`) -- Node test infrastructure for stripped extension -- Docs/README cleanup (README.md, README_DEVELOPER.md, vsc-extension-quickstart.md still describe deleted functionality) diff --git a/package-lock.json b/package-lock.json index 5321cfd..937313d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,6 @@ "eslint": "^9.39.3", "oxfmt": "^0.31.0", "ts-loader": "^9.5.1", - "ts-node": "^10.9.2", "typescript": "^5.5.4", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" @@ -238,19 +237,6 @@ "node": ">=6.9.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -625,17 +611,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -1298,34 +1273,6 @@ "@textlint/ast-node-types": "15.6.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -2122,19 +2069,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -2238,13 +2172,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2717,13 +2644,6 @@ "dev": true, "license": "MIT" }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2885,16 +2805,6 @@ "node": ">=8" } }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -4570,13 +4480,6 @@ "node": ">=10" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, "node_modules/markdown-it": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", @@ -6466,50 +6369,6 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -6703,13 +6562,6 @@ "license": "MIT", "optional": true }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, "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", @@ -7047,16 +6899,6 @@ "buffer-crc32": "~0.2.3" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "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 953cc00..a742b39 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "displayName": "Artemis - Scorpio", "version": "0.0.0", "description": "", + "license": "MIT", "private": true, "categories": [ "Other" @@ -42,7 +43,6 @@ "eslint": "^9.39.3", "oxfmt": "^0.31.0", "ts-loader": "^9.5.1", - "ts-node": "^10.9.2", "typescript": "^5.5.4", "webpack": "^5.93.0", "webpack-cli": "^5.1.4" diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md deleted file mode 100644 index 9fc92e9..0000000 --- a/vsc-extension-quickstart.md +++ /dev/null @@ -1,44 +0,0 @@ -# Welcome to your VS Code Extension - -## What's in the folder - -- This folder contains all of the files necessary for your web extension. -- `package.json` \* this is the manifest file in which you declare your extension and command. -- `src/extension.ts` \* this is the main file for the browser -- `webpack.config.js` \* the webpack config file for the web main - -## Setup - -- install the recommended extensions (amodio.tsl-problem-matcher, ms-vscode.extension-test-runner, and dbaeumer.vscode-eslint) - -## Get up and running the Web Extension - -- Run `npm install`. -- Place breakpoints in `src/extension.ts`. -- Debug via F5 (Run Web Extension). -- Execute extension code via `F1 > Hello world`. - -## Make changes - -- You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. -- You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. - -## Explore the API - -- You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. - -## Run tests - -- Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. -- Press `F5` to run the tests in a new window with your extension loaded. -- See the output of the test result in the debug console. -- Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. - - The provided test runner will only consider files matching the name pattern `**.test.ts`. - - You can create folders inside the `test` folder to structure your tests any way you want. - -## Go further - -- [Follow UX guidelines](https://code.visualstudio.com/api/ux-guidelines/overview) to create extensions that seamlessly integrate with VS Code's native interface and patterns. -- Check out the [Web Extension Guide](https://code.visualstudio.com/api/extension-guides/web-extensions). -- [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. -- Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). From 0a46dd9ff6d6ef22e2fe007a8b9c8cfa7d17d0c9 Mon Sep 17 00:00:00 2001 From: Liam Date: Tue, 19 May 2026 14:41:41 +0200 Subject: [PATCH 17/17] Bump brace-expansion and fast-uri to non-vulnerable versions via npm audit fix --- package-lock.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 937313d..2840aec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "artemis-scorpio", "version": "0.0.0", + "license": "MIT", "dependencies": { "simple-git": "^3.27.0" }, @@ -2296,9 +2297,9 @@ "license": "BSD-2-Clause" }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -3395,9 +3396,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.1.tgz", - "integrity": "sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ {