diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 00000000..bec6d9b8 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "slim-dev", + "runtimeExecutable": "pnpm", + "runtimeArgs": ["start"], + "port": 3000, + "autoPort": true + } + ] +} diff --git a/.deepsource.toml b/.deepsource.toml index db512b7e..881e924a 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -1,5 +1,14 @@ version = 1 +# Playwright specs, helpers, and the local e2e static server are test +# infrastructure — not production browser code — so exclude them from the +# JavaScript analyzer (which is configured for the React app). +exclude_patterns = [ + "e2e/**", + "scripts/serve-e2e.mjs", + "playwright.config.ts", +] + [[analyzers]] name = "javascript" enabled = true diff --git a/.github/workflows/deploy-to-firebase.yml b/.github/workflows/deploy-to-firebase.yml index c89c0760..eb2118d4 100644 --- a/.github/workflows/deploy-to-firebase.yml +++ b/.github/workflows/deploy-to-firebase.yml @@ -53,15 +53,15 @@ jobs: run: ./scripts/resolve-dmv-preview-branch.sh - name: Install dependencies - # Install without lifecycle scripts, then rebuild only packages that need prepare - # (dicom-microscopy-viewer dist/). Keeps Sonar happy while still building DMV. + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. env: DMV_USE_GIT: ${{ steps.dmv.outputs.use_git }} DMV_REF: ${{ steps.dmv.outputs.ref }} DMV_SHA: ${{ steps.dmv.outputs.sha }} run: | set -euo pipefail - if [ "${DMV_USE_GIT}" = "true" ]; then + if [ "${DMV_USE_GIT:-}" = "true" ]; then case "${DMV_REF}" in ''|*[!A-Za-z0-9._/-]*|.*|*.) echo "::error::Unsafe DMV_REF rejected" @@ -82,12 +82,10 @@ jobs: ); fs.writeFileSync('pnpm-workspace.yaml', updated); " "${TARBALL_KEY}" - pnpm install --no-frozen-lockfile --ignore-scripts + pnpm install --no-frozen-lockfile else - pnpm install --frozen-lockfile --ignore-scripts + pnpm install --frozen-lockfile fi - # allowBuilds in pnpm-workspace.yaml: core-js(+pure) and dicom-microscopy-viewer - pnpm rebuild dicom-microscopy-viewer core-js core-js-pure # Build DMV if dist files are missing (git dependency in package.json) if [ ! -f "node_modules/dicom-microscopy-viewer/dist/dynamic-import/dicomMicroscopyViewer.min.js" ]; then echo "DMV dist files missing - building from git dependency" diff --git a/.github/workflows/e2e-visual.yml b/.github/workflows/e2e-visual.yml new file mode 100644 index 00000000..2055041a --- /dev/null +++ b/.github/workflows/e2e-visual.yml @@ -0,0 +1,120 @@ +name: slim/e2e-visual-regression + +# Visual-regression tests for the deck.gl bulk-annotation renderer. +# +# Runs inside the pinned Playwright container so the (SwiftShader) browser +# environment is byte-for-byte identical to the committed Linux baselines under +# e2e/__screenshots__/. See e2e/README.md. +# +# The default target study is fetched from the public IDC proxy, so runs depend +# on that external service; retries (configured in playwright.config.ts) absorb +# cold-start slowness. This check is intentionally not required for merge — +# promote it in branch protection once data is hosted locally for hermetic runs. + +on: + pull_request: + branches: [master] + # edited: re-run when the PR body changes (e.g. add/update dmv-branch:) + types: [opened, synchronize, reopened, edited] + workflow_dispatch: + +permissions: + contents: read + pull-requests: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + visual: + name: "Bulk annotation visual regression" + # Skip re-run on PR body edit unless the body actually changed (dmv-branch updates) + if: github.event.action != 'edited' || github.event.changes.body != null + runs-on: ubuntu-latest + timeout-minutes: 45 + container: + # Keep this tag in sync with the @playwright/test version in package.json. + image: mcr.microsoft.com/playwright:v1.62.1-jammy + steps: + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Setup pnpm + uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 + + - name: Install GitHub CLI + # The Playwright container doesn't include gh CLI, needed for DMV branch resolution + run: | + apt-get update && apt-get install -y gh + + - name: Resolve DMV branch for preview + id: dmv + if: github.event_name == 'pull_request' + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_BODY: ${{ github.event.pull_request.body }} + HEAD_REF: ${{ github.head_ref }} + run: ./scripts/resolve-dmv-preview-branch.sh + + - name: Install dependencies + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + shell: bash + env: + DMV_USE_GIT: ${{ steps.dmv.outputs.use_git }} + DMV_REF: ${{ steps.dmv.outputs.ref }} + DMV_SHA: ${{ steps.dmv.outputs.sha }} + run: | + set -euo pipefail + if [ "${DMV_USE_GIT:-}" = "true" ]; then + case "${DMV_REF}" in + ''|*[!A-Za-z0-9._/-]*|.*|*.) + echo "::error::Unsafe DMV_REF rejected" + exit 1 + ;; + esac + pnpm pkg set 'dependencies["dicom-microscopy-viewer"]'"=github:ImagingDataCommons/dicom-microscopy-viewer#${DMV_REF}" + # Dynamically allow builds for the resolved tarball URL so pnpm's + # dependency status check passes during `pnpm run build` + TARBALL_KEY="dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/${DMV_SHA}" + node -e " + const fs = require('fs'); + const content = fs.readFileSync('pnpm-workspace.yaml', 'utf8'); + // Insert the tarball allowBuilds entry after 'dicom-microscopy-viewer: true' + const updated = content.replace( + /(allowBuilds:[\s\S]*?dicom-microscopy-viewer: true)/, + \"\$1\\n '\" + process.argv[1] + \"': true\" + ); + fs.writeFileSync('pnpm-workspace.yaml', updated); + " "${TARBALL_KEY}" + pnpm install --no-frozen-lockfile --ignore-scripts + else + pnpm install --frozen-lockfile --ignore-scripts + fi + # allowBuilds in pnpm-workspace.yaml: core-js(+pure) and dicom-microscopy-viewer + pnpm rebuild dicom-microscopy-viewer core-js core-js-pure + # Build DMV if dist files are missing (git dependency in package.json) + if [ ! -f "node_modules/dicom-microscopy-viewer/dist/dynamic-import/dicomMicroscopyViewer.min.js" ]; then + echo "DMV dist files missing - building from git dependency" + (cd node_modules/dicom-microscopy-viewer && pnpm run build) + fi + + - name: Build (e2e config) + run: pnpm run build:e2e + + - name: Run visual-regression tests + # Playwright starts the static server (serve:e2e) itself via the + # webServer config and compares against the committed baselines. + run: pnpm run test:e2e + + - name: Upload Playwright report + if: ${{ !cancelled() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: playwright-report + path: | + playwright-report/ + test-results/ + retention-days: 14 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index db7d9bd7..47f1c1ef 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,7 +36,9 @@ jobs: cache: pnpm - name: Install dependencies - run: pnpm install --frozen-lockfile --ignore-scripts + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile - name: Build run: pnpm run build diff --git a/.gitignore b/.gitignore index e68e7de5..54ca1ce8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +/.pnpm-store # testing /coverage @@ -18,6 +19,13 @@ public/config/* !public/config/demo.js !public/config/local.js !public/config/preview.js +!public/config/e2e.js + +# Playwright +/test-results +/playwright-report +/blob-report +/playwright/.cache # misc .DS_Store diff --git a/.sonarcloud.properties b/.sonarcloud.properties new file mode 100644 index 00000000..d97df17f --- /dev/null +++ b/.sonarcloud.properties @@ -0,0 +1,13 @@ +# SonarCloud automatic-analysis configuration. +# +# Workflow files are excluded because rule githubactions:S6505 flags +# "pnpm install" without --ignore-scripts. While dicom-microscopy-viewer is +# pinned to a git commit, its prepare script must run at install time to +# build dist/. Lifecycle scripts remain gated per-package by the allowBuilds +# allowlist in pnpm-workspace.yaml, which is stricter than a blanket +# --ignore-scripts. Remove this exclusion once dmv is pinned to a published +# npm release again (npm tarballs ship prebuilt dist/). +# e2e/ and scripts/serve-e2e.mjs are test infrastructure (Playwright + a local +# static server), not production code. Excluding them keeps the quality gate +# focused on the shipped app. +sonar.exclusions=.github/workflows/*.yml,e2e/**,scripts/serve-e2e.mjs,playwright.config.ts diff --git a/e2e/README.md b/e2e/README.md new file mode 100644 index 00000000..d2c3ba00 --- /dev/null +++ b/e2e/README.md @@ -0,0 +1,81 @@ +# End-to-end / visual-regression tests + +Playwright tests that drive the real app in a real (WebGL-capable) browser and +compare the deck.gl bulk-annotation overlay against committed screenshot +baselines, so rendering regressions are caught automatically. + +## What is covered + +- `bulk-annotations.spec.ts` + - A large (~396k-polygon) annotation group loads and paints without + exhausting the JS heap (the OpenLayers Feature pipeline this replaced OOM'd + on groups this size). + - The annotation overlay matches a committed screenshot baseline (clipped to + the map viewport so the memory footer / sidebar never affect the diff). + - Hiding a group frees the overlay. + +## Data source + +By default the app is built with `public/config/e2e.js`, which points at the +**public NCI Imaging Data Commons proxy** — no local DICOM server required. The +default study is `TCGA-02-0001` (a glioblastoma WSI with a large "Nuclei" +POLYGON group). + +Override the target without editing code: + +- `E2E_STUDY_UID` — study to open +- `E2E_SERIES_UID` — SM series to open (pinned so the suite doesn't depend + on slim's default study→series redirect; this study has four slides) +- `E2E_GROUP_NAME` — annotation group name to toggle (default `Nuclei`) +- `E2E_BASE_URL` — point at an already-running server instead of letting + Playwright serve the build (e.g. a local dcm4chee-backed deployment) + +### Fully local / hermetic data (optional) + +For a network-independent run you can host the study yourself (e.g. a local +`dcm4chee` via the +[imaging-data-commons-skill](https://github.com/ImagingDataCommons/imaging-data-commons-skill) +to fetch the study, then upload to your DICOMweb server), copy +`public/config/e2e.js` to point `url` at it, and run the suite normally. This +avoids proxy rate limits but is heavier to set up and is not used in CI. + +## Running locally + +```bash +# 1. Build once with the e2e config and serve it (or use the dev server: +# PORT=3977 REACT_APP_CONFIG=e2e pnpm start). +pnpm run build:e2e && pnpm run serve:e2e # terminal A +# 2. Run the tests (reuses the running server). +pnpm run test:e2e # terminal B +``` + +`serve:e2e` is a tiny dependency-free SPA static server +(`scripts/serve-e2e.mjs`) that listens on port **3977** (chosen so it never +collides with other common `:3000` dev servers). Playwright can also start it +itself via the `webServer` config when nothing is listening on that port. + +## Screenshot baselines + +WebGL output is made deterministic across machines by forcing ANGLE + +SwiftShader (software rendering). SwiftShader still differs between operating +systems, so **baselines are per-OS** and the ones committed here are **Linux**, +matching CI. + +Regenerate them with the pinned Playwright container (browser runs in the +container; the app is served from the host): + +```bash +pnpm run build:e2e && pnpm run serve:e2e # terminal A +pnpm run test:e2e:update:docker # terminal B +# review the diff under e2e/__screenshots__/ and commit +``` + +Generating baselines with a plain `pnpm run test:e2e:update` on macOS/Windows +produces host-OS snapshots that will **not** match CI — always use the Docker +script for committed baselines. + +## CI + +`.github/workflows/e2e-visual.yml` runs this suite inside the same pinned +Playwright container, so the browser environment is byte-for-byte identical to +the local baseline-generation path above. diff --git a/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png b/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png new file mode 100644 index 00000000..950eef85 Binary files /dev/null and b/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png differ diff --git a/e2e/bulk-annotations.spec.ts b/e2e/bulk-annotations.spec.ts new file mode 100644 index 00000000..d6e7522b --- /dev/null +++ b/e2e/bulk-annotations.spec.ts @@ -0,0 +1,83 @@ +import { expect, test } from '@playwright/test' + +import { + GROUP_NAME, + SERIES_UID, + STUDY_UID, + deckDrawnPixelCount, + expandAnnotationGroups, + mapClip, + setGroupVisibility, + prepareAnnotationScreenshot, + usedHeapMB, + waitForAnnotationsCleared, + waitForAnnotationsDrawn, + waitForAnnotationsStable, + waitForSlide, +} from './helpers' + +/** + * Visual-regression + smoke coverage for the deck.gl bulk-annotation renderer. + * + * The default target is a ~396k-polygon "Nuclei" group (see helpers.ts). The + * suite asserts three things that matter for the renderer: + * 1. A large group loads and paints without exhausting the JS heap (the OL + * Feature pipeline this replaced OOM'd on groups this size). + * 2. The annotation overlay matches a committed screenshot baseline. + * 3. Hiding the group frees the overlay. + * + * Screenshots are clipped to the map viewport so the volatile memory footer + * and sidebar text never enter the comparison. + */ +test.describe('bulk annotations (deck.gl overlay)', () => { + test.beforeEach(async ({ page }) => { + await page.goto(`/studies/${STUDY_UID}/series/${SERIES_UID}`) + await waitForSlide(page) + await expandAnnotationGroups(page) + }) + + test('renders a large annotation group without exhausting memory', async ({ + page, + }) => { + const heapBefore = await usedHeapMB(page) + + await setGroupVisibility(page, GROUP_NAME, true) + + const drawnPixels = await waitForAnnotationsDrawn(page) + expect(drawnPixels).toBeGreaterThan(500) + + // Wait for progressive streaming to finish so the whole-slide overlay + // (the deterministic screenshot target) reflects the complete group. + await waitForAnnotationsStable(page) + + const heapAfter = await usedHeapMB(page) + if (heapBefore >= 0 && heapAfter >= 0) { + // Guardrail against a regression to the old multi-GB / OOM behavior. + // ~396k polygons decode to a few hundred MB; 1500 MB leaves headroom + // without letting a runaway leak pass. + expect(heapAfter).toBeLessThan(1500) + } + + // The whole-slide fit is fully deterministic (image dimensions + viewport). + // Hide the WSI tile layers / chrome so the screenshot compares only the + // deck.gl overlay — WSI tile decoding is non-deterministic across runs. + await page + .waitForLoadState('networkidle', { timeout: 60_000 }) + .catch(() => undefined) + await prepareAnnotationScreenshot(page) + await expect(page).toHaveScreenshot('nuclei-whole-slide.png', { + clip: await mapClip(page), + timeout: 120_000, + }) + }) + + test('hides an annotation group on toggle-off', async ({ page }) => { + await setGroupVisibility(page, GROUP_NAME, true) + await waitForAnnotationsDrawn(page) + + await setGroupVisibility(page, GROUP_NAME, false) + + await waitForAnnotationsCleared(page) + expect(await deckDrawnPixelCount(page)).toBeLessThan(500) + }) +}) diff --git a/e2e/helpers.ts b/e2e/helpers.ts new file mode 100644 index 00000000..dc02821a --- /dev/null +++ b/e2e/helpers.ts @@ -0,0 +1,307 @@ +import { type Page, expect } from '@playwright/test' + +/** + * Default target: the TCGA-02-0001 glioblastoma study on the public IDC proxy. + * Slim auto-selects slide DX1, whose referenced SM series is overlaid by a + * single POLYGON "Nuclei" annotation group of ~396k annotations — a good + * stress test for the deck.gl LOD / spatial-tiling path. + */ +export const STUDY_UID = + process.env.E2E_STUDY_UID ?? '2.25.68803095896966276583382138924964839274' + +/** + * SM series for slide DX1. Pinning this (instead of relying on slim's default + * study→series redirect) keeps the visual baseline pointed at one slide — + * this study has four, each with its own ~hundreds-of-thousands Nuclei group. + */ +export const SERIES_UID = + process.env.E2E_SERIES_UID ?? + '1.3.6.1.4.1.5962.99.1.1163866303.1057408148.1637546438847.2.0' + +/** Name of the annotation group to exercise. */ +export const GROUP_NAME = process.env.E2E_GROUP_NAME ?? 'Nuclei' + +/** Non-transparent deck-canvas pixels that count as "annotations drawn". */ +const DRAWN_PIXEL_THRESHOLD = 500 + +/** Ignore network-idle timeouts; WSI tile streaming rarely goes truly idle. */ +function ignoreNetworkIdleTimeout(): undefined { + return undefined +} + +/** + * Read the deck.gl overlay canvas (the large WebGL2 canvas inside the OL map) + * and count non-transparent pixels. Returns -1 when the canvas is not found. + * + * A fresh getContext() returns the existing context, so this reflects the live + * overlay rather than a new blank buffer. + */ +export async function deckDrawnPixelCount(page: Page): Promise { + return await page.evaluate(() => { + const canvases = Array.from(document.querySelectorAll('canvas')) + const deck = canvases.find((canvas) => { + try { + return canvas.getContext('webgl2') != null && canvas.width > 200 + } catch { + return false + } + }) + if (deck == null) { + return -1 + } + const gl = deck.getContext('webgl2') + if (gl == null) { + return -1 + } + const { width, height } = deck + const pixels = new Uint8Array(width * height * 4) + gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels) + let nonTransparent = 0 + for (let i = 3; i < pixels.length; i += 4) { + if (pixels[i] !== 0) { + nonTransparent++ + } + } + return nonTransparent + }) +} + +/** Current JS heap usage in MB (Chromium only), or -1 when unavailable. */ +export async function usedHeapMB(page: Page): Promise { + return await page.evaluate(() => { + const mem = ( + performance as unknown as { memory?: { usedJSHeapSize: number } } + ).memory + return mem != null + ? Number((mem.usedJSHeapSize / 1048576).toFixed(1)) + : -1 + }) +} + +/** Bounding box of the largest OpenLayers viewport (the main volume viewer). */ +export async function mapClip(page: Page): Promise<{ + x: number + y: number + width: number + height: number +}> { + const box = await page.evaluate(() => { + const viewports = Array.from(document.querySelectorAll('.ol-viewport')) + let best: DOMRect | null = null + for (const viewport of viewports) { + const rect = viewport.getBoundingClientRect() + if (best == null || rect.width * rect.height > best.width * best.height) { + best = rect + } + } + return best == null + ? null + : { x: best.x, y: best.y, width: best.width, height: best.height } + }) + if (box == null) { + throw new Error('Could not locate the OpenLayers map viewport') + } + return { + x: Math.round(box.x), + y: Math.round(box.y), + width: Math.round(box.width), + height: Math.round(box.height), + } +} + +/** + * Wait until the main slide viewer has mounted and image tiles have settled. + * A whole-slide image streams tiles continuously, so we bound the network-idle + * wait and always add a fixed settle rather than relying on true idle. + */ +export async function waitForSlide(page: Page): Promise { + await page.waitForSelector('.ol-viewport canvas', { timeout: 180_000 }) + // The left metadata panel (which holds the Annotation Groups accordion) + // renders once the slide's instances have been fetched. + await page + .getByRole('menuitem', { name: 'Annotation Groups' }) + .waitFor({ timeout: 180_000 }) + await page + .waitForLoadState('networkidle', { timeout: 30_000 }) + .catch(ignoreNetworkIdleTimeout) + await page.waitForTimeout(2000) +} + +/** Expand the "Annotation Groups" accordion so its switches render. */ +export async function expandAnnotationGroups(page: Page): Promise { + await page.getByRole('menuitem', { name: 'Annotation Groups' }).click() + await page.getByRole('switch').first().waitFor({ timeout: 15_000 }) + await page.waitForTimeout(500) +} + +/** + * Report whether the named group's visibility switch is checked, or null when + * the switch cannot be found. The switch lives in the same list container as + * the group's menuitem, so the in-page lookup walks up from the menuitem until + * it finds one. (The lookup is duplicated in setGroupVisibility because + * functions cannot be shared across the browser boundary.) + */ +async function groupSwitchChecked( + page: Page, + groupName: string, +): Promise { + return await page.evaluate((name) => { + const items = Array.from(document.querySelectorAll('[role="menuitem"]')) + const item = items.find((el) => (el.textContent ?? '').includes(name)) + let container: Element | null | undefined = item + for (let depth = 0; depth < 6 && container != null; depth++) { + const sw = container.querySelector('button[role="switch"]') + if (sw != null) { + return sw.getAttribute('aria-checked') === 'true' + } + container = container.parentElement + } + return null + }, groupName) +} + +/** + * Set the visibility of the annotation group with the given name and wait for + * the switch state to reflect it (aria-checked updates asynchronously after + * React re-renders). + * + * The switch can sit beneath the sticky footer, so it is toggled through the + * DOM (a real user would scroll first; the click still exercises the app's + * handler). + */ +export async function setGroupVisibility( + page: Page, + groupName: string, + visible: boolean, +): Promise { + const result = await page.evaluate( + ({ groupName: name, visible: wantVisible }) => { + const items = Array.from(document.querySelectorAll('[role="menuitem"]')) + const item = items.find((el) => (el.textContent ?? '').includes(name)) + let sw: HTMLButtonElement | null = null + let container: Element | null | undefined = item + for (let depth = 0; depth < 6 && container != null; depth++) { + sw = container.querySelector('button[role="switch"]') + if (sw != null) { + break + } + container = container.parentElement + } + if (sw == null) { + return 'switch-not-found' + } + const checked = sw.getAttribute('aria-checked') === 'true' + if (checked !== wantVisible) { + sw.click() + } + return 'ok' + }, + { groupName, visible }, + ) + if (result !== 'ok') { + throw new Error( + `Visibility switch for annotation group "${groupName}" not found`, + ) + } + await expect + .poll(async () => await groupSwitchChecked(page, groupName), { + timeout: 15_000, + }) + .toBe(visible) +} + +/** Poll until the deck overlay has drawn content (annotations visible). */ +export async function waitForAnnotationsDrawn(page: Page): Promise { + let count = 0 + await expect + .poll( + async () => { + count = await deckDrawnPixelCount(page) + return count + }, + { timeout: 180_000, intervals: [1000, 2000, 3000, 5000] }, + ) + .toBeGreaterThan(DRAWN_PIXEL_THRESHOLD) + return count +} + +/** + * Wait until annotation loading has settled by polling the drawn-pixel count + * until it stops changing across consecutive samples. + * + * This matters for deterministic screenshots: a group streams in progressively + * and the whole-slide overlay only reflects the complete group once streaming + * finishes. Waiting for a stable count first makes the screenshot identical + * every run. + */ +export async function waitForAnnotationsStable(page: Page): Promise { + let previous = -1 + let stableSamples = 0 + const requiredStableSamples = 3 + await expect + .poll( + async () => { + const count = await deckDrawnPixelCount(page) + // Tolerate tiny sampling jitter (< 0.5%) as "unchanged". + const changed = + previous < 0 || Math.abs(count - previous) > previous * 0.005 + 50 + stableSamples = changed ? 0 : stableSamples + 1 + previous = count + return stableSamples + }, + { timeout: 180_000, intervals: [2000] }, + ) + .toBeGreaterThanOrEqual(requiredStableSamples) +} + +/** Poll until the deck overlay is effectively empty (annotations hidden). */ +export async function waitForAnnotationsCleared(page: Page): Promise { + await expect + .poll(async () => await deckDrawnPixelCount(page), { + timeout: 60_000, + intervals: [500, 1000, 2000], + }) + .toBeLessThan(DRAWN_PIXEL_THRESHOLD) +} + +/** + * Hide everything that is not the deck.gl annotation overlay so screenshots + * compare only the annotation rendering (and not flaky WSI tile decoding, + * the overview map, or the scale bar). + * + * Mutates the live page; call immediately before toHaveScreenshot. + */ +export async function prepareAnnotationScreenshot(page: Page): Promise { + await page.evaluate(() => { + for (const canvas of document.querySelectorAll('canvas')) { + try { + if (canvas.getContext('webgl2') == null) { + ;(canvas as HTMLElement).style.visibility = 'hidden' + } + } catch { + ;(canvas as HTMLElement).style.visibility = 'hidden' + } + } + for (const selector of [ + '.ol-overviewmap', + '.ol-scale-line', + '.ol-zoom', + '.ol-attribution', + ]) { + document.querySelectorAll(selector).forEach((el) => { + ;(el as HTMLElement).style.visibility = 'hidden' + }) + } + // Slim's custom scale / overview chrome is not always an OL control. + document.querySelectorAll('body *').forEach((el) => { + const text = (el.textContent ?? '').trim() + if (/^\d+(\.\d+)?\s*(µm|mm|cm)$/.test(text)) { + ;(el as HTMLElement).style.visibility = 'hidden' + const parent = el.parentElement + if (parent != null) { + parent.style.visibility = 'hidden' + } + } + }) + }) +} diff --git a/e2e/update-snapshots-docker.sh b/e2e/update-snapshots-docker.sh new file mode 100755 index 00000000..af1a22db --- /dev/null +++ b/e2e/update-snapshots-docker.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# +# Regenerate the Linux screenshot baselines that CI compares against, using the +# pinned Playwright container so the browser environment matches CI exactly. +# +# The app itself is served from the host (static output is OS-independent); only +# the browser runs inside the container. Start the server first, e.g.: +# +# pnpm run build:e2e && pnpm run serve:e2e # in another terminal +# # or, for iterating on specs: +# REACT_APP_CONFIG=e2e pnpm start +# +# then run: +# +# pnpm run test:e2e:update:docker +# +set -euo pipefail + +# Keep in sync with the @playwright/test version in package.json. +PLAYWRIGHT_VERSION="$(node -p "require('@playwright/test/package.json').version")" +IMAGE="mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-jammy" + +# The container reaches the host dev/preview server via host.docker.internal. +BASE_URL="${E2E_BASE_URL:-http://host.docker.internal:3977}" + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" + +echo "Using ${IMAGE}" +echo "Target app: ${BASE_URL} (must already be served from the host)" + +docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -e CI=1 \ + -e "E2E_BASE_URL=${BASE_URL}" \ + -v "${REPO_ROOT}:/work" \ + -w /work \ + "${IMAGE}" \ + npx playwright test --update-snapshots + +echo "Baselines updated under e2e/__screenshots__/. Review and commit them." diff --git a/package.json b/package.json index 8ba01350..c0bab658 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,11 @@ "fmt": "biome format --write .", "format": "biome format --write .", "test": "craco test --watchAll=false", + "build:e2e": "REACT_APP_CONFIG=e2e PUBLIC_URL=/ ./scripts/set-git-env.sh craco build", + "serve:e2e": "node scripts/serve-e2e.mjs", + "test:e2e": "playwright test", + "test:e2e:update": "playwright test --update-snapshots", + "test:e2e:update:docker": "./e2e/update-snapshots-docker.sh", "predeploy": "REACT_APP_CONFIG=demo PUBLIC_URL='https://imagingdatacommons.github.io/slim/' ./scripts/set-git-env.sh craco build", "deploy": "gh-pages -d build", "clean": "rm -rf ./build ./node_modules", @@ -37,11 +42,16 @@ ] }, "dependencies": { + "@radix-ui/react-popover": "^1.1.23", + "@radix-ui/react-slider": "^1.4.7", + "@radix-ui/react-switch": "^1.3.7", "antd": "^4.22.8", + "class-variance-authority": "^0.7.1", "classnames": "^2.2.6", + "clsx": "^2.1.1", "dcmjs": "^0.35.0", "detect-browser": "^5.2.1", - "dicom-microscopy-viewer": "^0.48.24", + "dicom-microscopy-viewer": "github:ImagingDataCommons/dicom-microscopy-viewer#1b39614eae92e92578d14977f66ced60243e51bc", "dicomweb-client": "0.10.3", "oidc-client": "^1.11.5", "ol": "^10.7.0", @@ -51,6 +61,7 @@ "react-icons": "^3.11.0", "react-router-dom": "^6.3.0", "retry": "^0.13.1", + "tailwind-merge": "^3.6.0", "uuid": "^8.3.2" }, "devDependencies": { @@ -59,6 +70,13 @@ "@babel/preset-typescript": "^7.17.12", "@biomejs/biome": "2.4.16", "@craco/craco": "^6.4.0", + "@playwright/test": "^1.62.1", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/commit-analyzer": "^12.0.0", + "@semantic-release/git": "^10.0.1", + "@semantic-release/github": "^10.0.3", + "@semantic-release/npm": "^12.0.0", + "@semantic-release/release-notes-generator": "^13.0.0", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^7.1.2", @@ -72,6 +90,7 @@ "@types/retry": "^0.12.1", "@types/uuid": "^8.3.0", "ajv": "6.12.6", + "autoprefixer": "^10.5.4", "copy-webpack-plugin": "9.1.0", "craco-less": "^2.0.0", "eslint": "^8.57.0", @@ -79,9 +98,12 @@ "fraction.js": "^4.3.7", "gh-pages": "^5.0.0", "husky": "^9.1.7", + "postcss": "8.5.25", "react-scripts": "5.0.0", "react-test-renderer": "^18.2.0", + "semantic-release": "21.1.2", "sonarqube-scanner": "^4.3.0", + "tailwindcss": "^3.4.19", "typescript": "^4.7.4" } } diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..ebdf27cd --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,107 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * Playwright config for slim end-to-end / visual-regression tests. + * + * These tests drive the real app in a real browser (WebGL required for the + * deck.gl bulk-annotation overlay) and compare screenshots against committed + * baselines to catch rendering regressions. + * + * Data source: by default the app is configured (public/config/e2e.js) to talk + * to the public NCI Imaging Data Commons proxy, so no local DICOM server is + * needed. Override the target study/series with E2E_* env vars (see the spec). + * + * WebGL determinism: Chromium is launched with ANGLE + SwiftShader (software + * rendering) so the exact same pixels are produced on any machine. Because + * SwiftShader output still differs between operating systems, screenshot + * baselines are stored per-platform and MUST be generated on the same OS as CI + * (Linux). Use `pnpm test:e2e:update:docker` to (re)generate Linux baselines + * locally via the pinned Playwright container. See e2e/README.md. + */ + +const isCI = Boolean(process.env.CI) + +/** + * When E2E_BASE_URL is set we assume the caller manages the server (e.g. a + * Linux container pointed at the host, or CI serving a prebuilt bundle), so + * Playwright should not spawn its own web server. + */ +/** + * A dedicated port avoids clashes with other dev servers commonly bound to + * :3000 (note: another IPv6 listener on the same port can shadow slim when + * "localhost" resolves to ::1). + */ +const externalBaseUrl = process.env.E2E_BASE_URL +const baseURL = externalBaseUrl ?? 'http://127.0.0.1:3977' + +export default defineConfig({ + testDir: './e2e', + /** + * deck.gl rendering plus cold WSI + bulk-annotation loading over the public + * proxy is slow, especially under SwiftShader in CI; be generous. + */ + timeout: 300_000, + expect: { + timeout: 30_000, + toHaveScreenshot: { + /** + * Tolerate minor antialiasing / tile-decode differences in the WSI + * background while still catching annotation rendering regressions. + */ + // Overlay-only screenshots (WSI tiles hidden) are stable; keep this tight. + maxDiffPixelRatio: 0.01, + /** Per-pixel threshold (0-1); higher = more permissive on color. */ + threshold: 0.15, + }, + }, + /** One heavy WebGL app instance at a time keeps runs deterministic. */ + fullyParallel: false, + workers: 1, + forbidOnly: isCI, + retries: isCI ? 1 : 0, + reporter: [['list'], ['html', { open: 'never' }]], + /** Keep baselines organized and per-OS so macOS/Linux never clash. */ + snapshotPathTemplate: + '{testDir}/__screenshots__/{testFilePath}/{arg}-{platform}{ext}', + use: { + baseURL, + viewport: { width: 1600, height: 900 }, + deviceScaleFactor: 1, + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + video: 'retain-on-failure', + }, + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + viewport: { width: 1600, height: 900 }, + launchOptions: { + args: [ + // Force deterministic software WebGL2 (ANGLE + SwiftShader) so the + // deck.gl overlay renders identically across machines. + '--use-gl=angle', + '--use-angle=swiftshader', + '--enable-unsafe-swiftshader', + '--ignore-gpu-blocklist', + '--disable-dev-shm-usage', + ], + }, + }, + }, + ], + webServer: externalBaseUrl + ? undefined + : { + /** + * Serve a production build baked with the e2e config. Reuses an + * already-running dev server locally (e.g. `REACT_APP_CONFIG=e2e pnpm + * start`) so iterating on specs is fast. + */ + command: 'pnpm run serve:e2e', + url: baseURL, + reuseExistingServer: !isCI, + timeout: 180_000, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50440e40..1ba39604 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,12 +33,27 @@ importers: .: dependencies: + '@radix-ui/react-popover': + specifier: ^1.1.23 + version: 1.1.23(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': + specifier: ^1.4.7 + version: 1.4.7(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-switch': + specifier: ^1.3.7 + version: 1.3.7(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) antd: specifier: ^4.22.8 version: 4.24.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 classnames: specifier: ^2.2.6 version: 2.5.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 dcmjs: specifier: ^0.35.0 version: 0.35.0 @@ -46,8 +61,8 @@ importers: specifier: ^5.2.1 version: 5.3.0 dicom-microscopy-viewer: - specifier: ^0.48.24 - version: 0.48.24 + specifier: github:ImagingDataCommons/dicom-microscopy-viewer#1b39614eae92e92578d14977f66ced60243e51bc + version: https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc(@loaders.gl/core@4.4.5)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) dicomweb-client: specifier: 0.10.3 version: 0.10.3 @@ -75,6 +90,9 @@ importers: retry: specifier: ^0.13.1 version: 0.13.1 + tailwind-merge: + specifier: ^3.6.0 + version: 3.6.0 uuid: specifier: ^8.3.2 version: 8.3.2 @@ -94,6 +112,27 @@ importers: '@craco/craco': specifier: ^6.4.0 version: 6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5) + '@playwright/test': + specifier: ^1.62.1 + version: 1.62.1 + '@semantic-release/changelog': + specifier: ^6.0.3 + version: 6.0.3(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/commit-analyzer': + specifier: ^12.0.0 + version: 12.0.0(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/git': + specifier: ^10.0.1 + version: 10.0.1(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/github': + specifier: ^10.0.3 + version: 10.3.5(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/npm': + specifier: ^12.0.0 + version: 12.0.2(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/release-notes-generator': + specifier: ^13.0.0 + version: 13.0.0(semantic-release@21.1.2(typescript@4.9.5)) '@testing-library/jest-dom': specifier: ^5.16.4 version: 5.17.0 @@ -133,6 +172,9 @@ importers: ajv: specifier: 6.12.6 version: 6.12.6 + autoprefixer: + specifier: ^10.5.4 + version: 10.5.4(postcss@8.5.25) copy-webpack-plugin: specifier: 9.1.0 version: 9.1.0(webpack@5.107.2(postcss@8.5.25)) @@ -154,15 +196,24 @@ importers: husky: specifier: ^9.1.7 version: 9.1.7 + postcss: + specifier: 8.5.25 + version: 8.5.25 react-scripts: specifier: 5.0.0 version: 5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5) react-test-renderer: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) + semantic-release: + specifier: 21.1.2 + version: 21.1.2(typescript@4.9.5) sonarqube-scanner: specifier: ^4.3.0 version: 4.3.6 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19 typescript: specifier: ^4.7.4 version: 4.9.5 @@ -977,20 +1028,24 @@ packages: cpu: [x64] os: [win32] - '@cornerstonejs/codec-charls@1.2.3': - resolution: {integrity: sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.3.tgz} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@cornerstonejs/codec-charls@1.2.5': + resolution: {integrity: sha512-BoENE2cXfzQ2RMxPfMMJxyv7E78iErTCB8b8lod/qv3dsYfCmSOUQKiRsuOZJM24JrjCFnyzbkxhAnF8gAKQnQ==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.5.tgz} engines: {node: '>=0.14'} - '@cornerstonejs/codec-libjpeg-turbo-8bit@1.2.2': - resolution: {integrity: sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz} + '@cornerstonejs/codec-libjpeg-turbo-8bit@1.2.4': + resolution: {integrity: sha512-k5e2/EjE9gV7dkg2x3CzId6mp6P7tTya/AmnLzbN3fZTW6skTMrOTJfqowgGQBzX7styLdcsnjlqwEVqeqaaHQ==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.4.tgz} engines: {node: '>=0.14'} - '@cornerstonejs/codec-openjpeg@1.3.0': - resolution: {integrity: sha512-hP8WAZ63AcaDYmHbBVTY04x424AglXsRHrI6VBdW4eTiJ76f0heWrEodT9Sb3sNwazzYuyMOIZNndJPeVSeHcw==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.3.0.tgz} + '@cornerstonejs/codec-openjpeg@1.3.2': + resolution: {integrity: sha512-IsvhGRZ/3LzoNQFyAsKKzPw/S769b9JrKhpufU8uEEalOBn+D1OLetzZ48pvpbwxR4J7ZFrnK0FBIYtl8Hdt9Q==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.3.2.tgz} engines: {node: '>=0.14'} - '@cornerstonejs/codec-openjph@2.4.7': - resolution: {integrity: sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.7.tgz} + '@cornerstonejs/codec-openjph@2.4.9': + resolution: {integrity: sha512-iUGvF8r4SMHFrHGjwhNsTlHDPm+fIcGw3fUYm4vzhsf2J6VR9DqHtynXwUVOCBMSG9YTyWkcsD4db++0kMffMw==, tarball: https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.9.tgz} engines: {node: '>=0.14'} '@craco/craco@6.4.5': @@ -1101,6 +1156,24 @@ packages: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} + '@deck.gl/core@9.1.15': + resolution: {integrity: sha512-2Tx2aKNskDS8SZ6EB7V53exo3SVntCJJGjrAnz3KhNj4fA4BVqOH++LSpjCFhuG9m4WOWDSDq9s7w4DQnTiT+Q==} + + '@deck.gl/extensions@9.1.15': + resolution: {integrity: sha512-pH3SArgiEibHwrYwbKTknUurgpUndUFa+O97in+zRVF6KFGNZSLm1AePERh1gQjcpuQ+GwrxJ/ijmVmuH2zOow==} + peerDependencies: + '@deck.gl/core': ^9.1.0 + '@luma.gl/core': ~9.1.9 + '@luma.gl/engine': ~9.1.9 + + '@deck.gl/layers@9.1.15': + resolution: {integrity: sha512-4C8LaCXnd/cHGMGwuLu6YUqcf/4dyz82Im+C0IrY56OgJnVOKf2f75zwAKa1Uekq4XEsyPgqg9k5MWEohBzGYw==} + peerDependencies: + '@deck.gl/core': ^9.1.0 + '@loaders.gl/core': ^4.2.0 + '@luma.gl/core': ~9.1.9 + '@luma.gl/engine': ~9.1.9 + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1119,6 +1192,21 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1243,6 +1331,70 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@loaders.gl/core@4.4.5': + resolution: {integrity: sha512-hlpE200MinDAyU0kMjEM4yk+0TDxiB9nT+GcwOCrXc7buE0e0YwTn+Ynz2Q85dwDKvJZw3kNHTTBGvQwq9533A==} + + '@loaders.gl/images@4.4.5': + resolution: {integrity: sha512-7/odHt5n67OVLHelTm1euNNw5gCwycezQI7Wg3NBUg7q3bHWmTPY++Z4uz2egiuzJNY3GLegfg8AI1c3fD64Jw==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@loaders.gl/loader-utils@4.4.5': + resolution: {integrity: sha512-c4h2RUMEru+hbfvgZEIy5cLQKyQka2TPQZW/2Wy+yIPr3FU7RKwfp+vLwIfir6Xkdn2zniWyWretZwE02aY/Ug==} + + '@loaders.gl/schema-utils@4.4.5': + resolution: {integrity: sha512-vi6AROLWvoLIN609tVmchwotTaHK5rHv8SWjoVUWLhPCXmIc9npz0rCl7NJScCgr7UjYifZG1rWOnrAxaYTlyA==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@loaders.gl/schema@4.4.5': + resolution: {integrity: sha512-q2XNquegw+hX+ZEshacKYL/+FKBUIS5FHA+2Ft3JWmcNiR6umGnYCdXQhDcFCqAm8Ks87fMCV+z/zTloxaIZgQ==} + + '@loaders.gl/worker-utils@4.4.5': + resolution: {integrity: sha512-ZQDoM6f/HpZ3Lzj6vjtPHXSvi+cUK0QG7yJz+MKWAokmeWa98WMZwswS8zkn/qNkY95rLcxh66N4Sl96+7hqAQ==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@luma.gl/constants@9.1.10': + resolution: {integrity: sha512-O4Nx8UbWmrHHZ7ihKB8WiscX1cz05l1KvKorYTgq+xeXwz2Beh3MkXBMnA46uuyEtimN945OEdYshZnbh80jyw==} + + '@luma.gl/core@9.1.10': + resolution: {integrity: sha512-izvT0DDjlVpchpTokXMNYJeyhgTdGuf21LHEpVa/3EtGFDAJESb3eH99Q3KfzgbqqIAwrTy+25TSStV/3r2svA==} + + '@luma.gl/engine@9.1.10': + resolution: {integrity: sha512-Og1cFpDGq8IUDI9Oaytnm08sdeitxcStsFrjiE4AejZQgx6OdHo+tE33M3WLAUzp6oQYQwl6r2USOhH4BuEiRg==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + '@luma.gl/shadertools': ~9.1.0 + + '@luma.gl/shadertools@9.1.10': + resolution: {integrity: sha512-ET2Vs9Vws5zkjSC07RWBVEFQ6EDP5yTiEZBnvblkb5y4wgjLHAgM5NBJw51Xb5BRBH0aC4piwP+2SnDA29dOlg==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + + '@luma.gl/webgl@9.1.10': + resolution: {integrity: sha512-mwIsNEzxt6GW/fnCqBgJAorzFPi5c//3ZukKFHso+F1mvtHhTE4NQfA/pEvj4HBg/IdYkMvkoQsMrSn5+jko3A==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + + '@mapbox/tiny-sdf@2.2.0': + resolution: {integrity: sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==} + + '@math.gl/core@4.1.0': + resolution: {integrity: sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==} + + '@math.gl/polygon@4.1.0': + resolution: {integrity: sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==} + + '@math.gl/sun@4.1.0': + resolution: {integrity: sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==} + + '@math.gl/types@4.1.0': + resolution: {integrity: sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==} + + '@math.gl/web-mercator@4.1.0': + resolution: {integrity: sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -1258,9 +1410,116 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/auth-token@5.1.2': + resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.2': + resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} + engines: {node: '>= 18'} + + '@octokit/core@6.1.6': + resolution: {integrity: sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==} + engines: {node: '>= 18'} + + '@octokit/endpoint@10.1.4': + resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.6': + resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.1': + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} + engines: {node: '>= 18'} + + '@octokit/graphql@8.2.2': + resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@20.0.0': + resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + + '@octokit/openapi-types@24.2.0': + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + + '@octokit/openapi-types@25.1.0': + resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} + + '@octokit/plugin-paginate-rest@11.6.0': + resolution: {integrity: sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-paginate-rest@9.2.2': + resolution: {integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-retry@6.1.0': + resolution: {integrity: sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-retry@7.2.1': + resolution: {integrity: sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-throttling@8.2.0': + resolution: {integrity: sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^5.0.0 + + '@octokit/plugin-throttling@9.6.1': + resolution: {integrity: sha512-bt3EBUkeKUzDQXRCcFrR9SWVqlLFRRqcCrr6uAorWt6NXTyjMKqcGrFmXqJy9NCbnKgiIZ2OXWq04theFc76Jg==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^6.1.3 + + '@octokit/request-error@5.1.1': + resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} + engines: {node: '>= 18'} + + '@octokit/request-error@6.1.8': + resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.1': + resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} + engines: {node: '>= 18'} + + '@octokit/request@9.2.4': + resolution: {integrity: sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==} + engines: {node: '>= 18'} + + '@octokit/types@12.6.0': + resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} + + '@octokit/types@13.10.0': + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + + '@octokit/types@14.1.0': + resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@petamoriken/float16@3.9.3': resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} + hasBin: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.17': resolution: {integrity: sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==} engines: {node: '>= 10.13'} @@ -1287,6 +1546,296 @@ packages: webpack-plugin-serve: optional: true + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.3': + resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} + engines: {node: '>=12'} + + '@probe.gl/env@4.1.1': + resolution: {integrity: sha512-+68seNDMVsEegRB47pFA/Ws1Fjy8agcFYXxzorKToyPcD6zd+gZ5uhwoLd7TzsSw6Ydns//2KEszWn+EnNHTbA==} + + '@probe.gl/log@4.1.1': + resolution: {integrity: sha512-kcZs9BT44pL7hS1OkRGKYRXI/SN9KejUlPD+BY40DguRLzdC5tLG/28WGMyfKdn/51GT4a0p+0P8xvDn1Ez+Kg==} + + '@probe.gl/stats@4.1.1': + resolution: {integrity: sha512-4VpAyMHOqydSvPlEyHwXaE+AkIdR03nX+Qhlxsk2D/IW4OVmDZgIsvJB1cDzyEEtcfKcnaEbfXeiPgejBceT6g==} + + '@radix-ui/number@1.1.3': + resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==} + + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-arrow@1.1.15': + resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popover@1.1.23': + resolution: {integrity: sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.3.7': + resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.4.7': + resolution: {integrity: sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.3.7': + resolution: {integrity: sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.4': + resolution: {integrity: sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.4': + resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.4': + resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} + '@rc-component/portal@1.1.2': resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} engines: {node: '>=8.x'} @@ -1332,23 +1881,102 @@ packages: '@rushstack/eslint-patch@1.16.1': resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==} - '@sinclair/typebox@0.24.51': - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + '@semantic-release/changelog@6.0.3': + resolution: {integrity: sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==} + engines: {node: '>=14.17'} + peerDependencies: + semantic-release: '>=18.0.0' - '@sinonjs/fake-timers@8.1.0': - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + '@semantic-release/commit-analyzer@10.0.4': + resolution: {integrity: sha512-pFGn99fn8w4/MHE0otb2A/l5kxgOuxaaauIh4u30ncoTJuqWj4hXTgEJ03REqjS+w1R2vPftSsO26WC61yOcpw==} + engines: {node: '>=18'} + peerDependencies: + semantic-release: '>=20.1.0' - '@surma/rollup-plugin-off-main-thread@2.2.3': - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + '@semantic-release/commit-analyzer@12.0.0': + resolution: {integrity: sha512-qG+md5gdes+xa8zP7lIo1fWE17zRdO8yMCaxh9lyL65TQleoSv8WHHOqRURfghTytUh+NpkSyBprQ5hrkxOKVQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' - '@svgr/babel-plugin-add-jsx-attribute@5.4.0': - resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} - engines: {node: '>=10'} + '@semantic-release/error@3.0.0': + resolution: {integrity: sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==} + engines: {node: '>=14.17'} - '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': + '@semantic-release/error@4.0.0': + resolution: {integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==} + engines: {node: '>=18'} + + '@semantic-release/git@10.0.1': + resolution: {integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==} + engines: {node: '>=14.17'} + peerDependencies: + semantic-release: '>=18.0.0' + + '@semantic-release/github@10.3.5': + resolution: {integrity: sha512-svvRglGmvqvxjmDgkXhrjf0lC88oZowFhOfifTldbgX9Dzj0inEtMLaC+3/MkDEmxmaQjWmF5Q/0CMIvPNSVdQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/github@9.2.6': + resolution: {integrity: sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==} + engines: {node: '>=18'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/npm@10.0.6': + resolution: {integrity: sha512-DyqHrGE8aUyapA277BB+4kV0C4iMHh3sHzUWdf0jTgp5NNJxVUz76W1f57FB64Ue03him3CBXxFqQD2xGabxow==} + engines: {node: '>=18'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/npm@12.0.2': + resolution: {integrity: sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/release-notes-generator@11.0.7': + resolution: {integrity: sha512-T09QB9ImmNx7Q6hY6YnnEbw/rEJ6a+22LBxfZq+pSAXg/OL/k0siwEm5cK4k1f9dE2Z2mPIjJKKohzUm0jbxcQ==} + engines: {node: '>=18'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/release-notes-generator@13.0.0': + resolution: {integrity: sha512-LEeZWb340keMYuREMyxrODPXJJ0JOL8D/mCl74B4LdzbxhtXV2LrPN2QBEcGJrlQhoqLO0RhxQb6masHytKw+A==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@sinclair/typebox@0.24.51': + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@sinonjs/commons@1.8.6': + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + + '@sinonjs/fake-timers@8.1.0': + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@svgr/babel-plugin-add-jsx-attribute@5.4.0': + resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} + engines: {node: '>=10'} + + '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} engines: {node: '>=10'} @@ -1484,6 +2112,9 @@ packages: '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1523,12 +2154,24 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/node-forge@1.3.14': resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + '@types/node@25.9.5': + resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1733,6 +2376,10 @@ packages: '@zarrita/storage@0.2.0': resolution: {integrity: sha512-855ZXqtnds7spnT8vNvD+MXa3QExP1m2GqShe8yt7uZXHnQLgJHgkpVwFjE1B0KDDRO0ki09hmk6OboTaIfPsQ==} + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -1789,6 +2436,18 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + aggregate-error@5.0.0: + resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} + engines: {node: '>=18'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -1817,6 +2476,10 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} @@ -1835,6 +2498,10 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1843,6 +2510,9 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + antd@4.24.16: resolution: {integrity: sha512-zZrK4UYxHtU6tGOOf0uG/kBRx1kTvypfuSB3GqE/SBQxFhZ/TZ+yj7Z1qwI8vGfMtUUJdLeuoCAqGDa1zPsXnQ==} peerDependencies: @@ -1856,6 +2526,10 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + apache-arrow@21.2.0: + resolution: {integrity: sha512-Hxe6Agq26gQOM954qpzYSllJBPJl+e16U5CkfuMUhLrNba+5nKkttIVlflaovN6oaTratqMGAO8H5u/aNhmHWQ==} + hasBin: true + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -1868,6 +2542,13 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argv-formatter@1.0.0: + resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -1882,6 +2563,9 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -1925,6 +2609,10 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -1948,8 +2636,8 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - autoprefixer@10.5.0: - resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + autoprefixer@10.5.4: + resolution: {integrity: sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2097,9 +2785,20 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + baseline-browser-mapping@2.11.13: + resolution: {integrity: sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==} + engines: {node: '>=6.0.0'} + hasBin: true + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + bfj@7.1.0: resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} engines: {node: '>= 8.0.0'} @@ -2124,6 +2823,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + brace-expansion@1.1.18: resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} @@ -2142,6 +2844,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -2179,6 +2886,10 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -2190,13 +2901,21 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + + cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -2205,6 +2924,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -2231,6 +2954,9 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -2238,9 +2964,29 @@ packages: resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + clean-stack@5.3.0: + resolution: {integrity: sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==} + engines: {node: '>=14.16'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -2248,10 +2994,16 @@ packages: collect-v8-coverage@1.0.3: resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -2294,6 +3046,9 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + complex.js@2.4.3: resolution: {integrity: sha512-UrQVSUur14tNX6tiP4y8T4w4FeJAX3bi2cIv0pu/DTLFNxoq7z2Yh83Vfzztj6Px3X/lubqQ9IrPp7Bpn6p4MQ==} @@ -2311,6 +3066,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} @@ -2326,6 +3084,37 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-writer@6.0.1: + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} + hasBin: true + + conventional-changelog-writer@7.0.1: + resolution: {integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==} + engines: {node: '>=16'} + hasBin: true + + conventional-commits-filter@3.0.0: + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} + + conventional-commits-filter@4.0.0: + resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2380,6 +3169,15 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + craco-less@2.0.0: resolution: {integrity: sha512-980mQaZVrC4ZsvOwvud6/AgvW7fLY3mW5m5+gR4sw4krxszgHb+qoRyOjqsYPD0F4oUmQoSiZSrlYY/bFGD9kQ==} peerDependencies: @@ -2401,6 +3199,10 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + css-blank-pseudo@3.0.3: resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} @@ -2539,6 +3341,9 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dayjs@1.11.21: resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} @@ -2573,6 +3378,14 @@ packages: supports-color: optional: true + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -2583,6 +3396,10 @@ packages: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2618,6 +3435,9 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2629,6 +3449,9 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -2637,15 +3460,13 @@ packages: engines: {node: '>= 4.2.1'} hasBin: true - dicom-microscopy-viewer@0.48.24: - resolution: {integrity: sha512-016o/23eNqXMxgX5EjnDmFz1ROSMQmU7vmRlTVPUgshl6NaBrZzEyWkzq4BNaFFPfrE274AWdR5crW51cWh+9g==} + dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc: + resolution: {gitHosted: true, tarball: https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc} + version: 0.49.0 dicomweb-client@0.10.3: resolution: {integrity: sha512-/fHNEAYiz8j+9TNOrNJ0k+hYqirbOT85B7vM7I4VkY8DeDQb4BDUeL3RX6huDVtn6ZQlR91dI+2tejLc5c99wA==} - dicomweb-client@0.11.3: - resolution: {integrity: sha512-7t1Rc/01fyFnKlQeNPW9Pvxvmsx8R/BgB2n7BxTuWirRFwlTC5upEeLeS3vO72P+n6/SQZ3+5ij0bgaWDHQG/A==} - didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -2710,6 +3531,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} @@ -2721,9 +3546,15 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + earcut@3.0.2: resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} @@ -2738,6 +3569,9 @@ packages: electron-to-chromium@1.5.367: resolution: {integrity: sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==} + electron-to-chromium@1.5.405: + resolution: {integrity: sha512-bNglH7lPH5l+yHOes7Zr4VqxhOy4BQ9ZBUX4VdoFgxMpzJk7W1ZoO3Vgd9Pxa9PyjQ76sfm2aKH/nzEcCNRlew==} + email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -2774,6 +3608,10 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + env-ci@9.1.1: + resolution: {integrity: sha512-Im2yEWeF4b2RAMAaWvGioXk6m0UNaIjD8hj28j2ij5ldnIFrDQT0+pzDvpbRkcjurhXhf/AsBKv8P2rtmGi9Aw==} + engines: {node: ^16.14 || >=18} + errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -2844,6 +3682,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -3028,6 +3870,18 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -3044,6 +3898,9 @@ packages: resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} engines: {node: '>= 0.10.0'} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3085,6 +3942,18 @@ packages: fflate@0.8.3: resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3126,6 +3995,14 @@ packages: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -3138,10 +4015,28 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + find-versions@5.1.0: + resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} + engines: {node: '>=12'} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flatbuffers@25.9.23: + resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==} + + flatbush@4.4.0: + resolution: {integrity: sha512-cf6G+sfy/+/FLH7Ls1URQ5GCRlXgwgqUZiEsMNrMZqb3Us3EkKmzUlKbnyoBy/4wI4oLJ+8cyCQoKJIVm92Fmg==} + + flatqueue@2.0.3: + resolution: {integrity: sha512-RZCWZNkmxzUOh8jqEcEGZCycb3B8KAfpPwg3H//cURasunYxsg1eIvE+QDSjX+ZPHTIVfINfK1aLTrVKKO0i4g==} + engines: {node: '>= 12.17.0'} + flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} @@ -3197,10 +4092,17 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + engines: {node: '>=14.14'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -3215,6 +4117,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3250,6 +4157,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -3265,6 +4176,18 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@7.0.1: + resolution: {integrity: sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==} + engines: {node: '>=16'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -3274,6 +4197,9 @@ packages: engines: {node: '>=10'} hasBin: true + git-log-parser@1.2.1: + resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} + gl-matrix@3.4.4: resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} @@ -3312,6 +4238,10 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + globby@6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} @@ -3320,6 +4250,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3333,6 +4266,15 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} @@ -3340,6 +4282,10 @@ packages: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3367,10 +4313,25 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hook-std@3.0.0: + resolution: {integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hoopy@0.1.4: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -3426,6 +4387,10 @@ packages: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http-proxy-middleware@2.0.9: resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} engines: {node: '>=12.0.0'} @@ -3443,10 +4408,26 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -3477,6 +4458,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -3493,11 +4478,22 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-from-esm@1.3.4: + resolution: {integrity: sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==} + engines: {node: '>=16.20'} + + import-from@4.0.0: + resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} + engines: {node: '>=12.2'} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -3506,6 +4502,14 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + inflight@1.0.6: resolution: {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. @@ -3520,6 +4524,10 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + into-stream@7.0.0: + resolution: {integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==} + engines: {node: '>=12'} + iota-array@1.0.0: resolution: {integrity: sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==} @@ -3629,14 +4637,26 @@ packages: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -3664,6 +4684,14 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -3672,6 +4700,10 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -3679,6 +4711,14 @@ packages: is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3708,6 +4748,14 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + issue-parser@6.0.0: + resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} + engines: {node: '>=10.13'} + + issue-parser@7.0.2: + resolution: {integrity: sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==} + engines: {node: ^18.17 || >=20.6.1} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -3737,6 +4785,10 @@ packages: engines: {node: '>=10'} hasBin: true + java-properties@1.0.2: + resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} + engines: {node: '>= 0.6.0'} + javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} @@ -3952,9 +5004,16 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -3964,6 +5023,12 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json-with-bigint@3.5.12: + resolution: {integrity: sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==} + json2mq@0.2.0: resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} @@ -3982,6 +5047,10 @@ packages: jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + jsonpath@1.3.0: resolution: {integrity: sha512-0kjkYHJBkAy50Z5QzArZ7udmvxrJzkpKYW27fiF//BrMY7TQibYLl+FYIXN2BiYmwMIVzSfD8aDRj6IzgBX2/w==} @@ -4055,6 +5124,14 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + loader-runner@4.3.2: resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} @@ -4067,6 +5144,10 @@ packages: resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} engines: {node: '>= 12.13.0'} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -4079,12 +5160,34 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash.capitalize@4.2.1: + resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -4097,6 +5200,9 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -4111,6 +5217,9 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4135,6 +5244,25 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + marked-terminal@5.2.0: + resolution: {integrity: sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==} + engines: {node: '>=14.13.1 || >=16.0.0'} + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + marked@5.1.2: + resolution: {integrity: sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==} + engines: {node: '>= 16'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -4155,6 +5283,14 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -4190,11 +5326,20 @@ packages: engines: {node: '>=4'} hasBin: true + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - min-indent@1.0.1: + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -4214,9 +5359,20 @@ packages: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mjolnir.js@3.1.0: + resolution: {integrity: sha512-fWcei0lo+xauQK0CVb5vwC8FaS9xeEBiNPd5vMIM89DchQAi6ENMq9itOjq+G8zAvhKmJu5UPnuEnU8kVrHzdg==} + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -4263,9 +5419,15 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nerf-dart@1.0.0: + resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-exports-info@1.6.0: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} @@ -4281,6 +5443,21 @@ packages: resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} engines: {node: '>=18'} + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4289,10 +5466,172 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + npm@10.9.9: + resolution: {integrity: sha512-1g+6jLQvaIuB4zwvHL7yrXuXcWZwDsCtBX8bbWDqbvJSSr9nPiDDWTHNgwXR27iIcTTW7v3A57hDW9RYv2W4Yg==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/redact' + - '@npmcli/run-script' + - '@sigstore/tuf' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + + npm@9.9.4: + resolution: {integrity: sha512-NzcQiLpqDuLhavdyJ2J3tGJ/ni/ebcqHVFZkv1C4/6lblraUPbPgCJ4Vhb4oa3FFhRa2Yj9gA58jGH/ztKueNQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/run-script' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - cli-table3 + - columnify + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - npmlog + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - sigstore + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + nth-check@2.0.1: resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} @@ -4366,6 +5705,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -4378,6 +5721,22 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-each-series@3.0.0: + resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} + engines: {node: '>=12'} + + p-filter@4.1.0: + resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} + engines: {node: '>=18'} + + p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4386,6 +5745,14 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -4398,10 +5765,30 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@7.0.6: + resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} + engines: {node: '>=18'} + + p-reduce@2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} + + p-reduce@3.0.0: + resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==} + engines: {node: '>=12'} + p-retry@4.6.2: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -4419,10 +5806,26 @@ packages: parse-headers@2.0.6: resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} @@ -4445,6 +5848,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -4453,6 +5860,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -4463,6 +5874,10 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + pbf@4.0.1: resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} hasBin: true @@ -4485,6 +5900,10 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} @@ -4497,6 +5916,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkg-conf@2.1.0: + resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} + engines: {node: '>=4'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -4505,6 +5928,16 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -4960,6 +6393,10 @@ packages: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -4976,6 +6413,9 @@ packages: properties-file@4.0.0: resolution: {integrity: sha512-VWnuWVVQIeYPdJwWfBVu6/SQExpAliGkY8Bq58pHHPJHgD4THXlJfsc+qC41+62iV4WNwQhmrxbqpEXIvIMOmw==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protocol-buffers-schema@3.6.1: resolution: {integrity: sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==} @@ -5007,6 +6447,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + quick-lru@6.1.2: resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} engines: {node: '>=12'} @@ -5256,6 +6700,10 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react-app-polyfill@3.0.0: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} @@ -5302,6 +6750,26 @@ packages: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-router-dom@6.30.4: resolution: {integrity: sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==} engines: {node: '>=14.0.0'} @@ -5332,6 +6800,16 @@ packages: peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-test-renderer@18.3.1: resolution: {integrity: sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==} peerDependencies: @@ -5344,6 +6822,31 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} + engines: {node: '>=16'} + + read-pkg-up@11.0.0: + resolution: {integrity: sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==} + engines: {node: '>=18'} + deprecated: Renamed to read-package-up + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} + engines: {node: '>=16'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -5363,6 +6866,9 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + reference-spec-reader@0.2.0: resolution: {integrity: sha512-q0mfCi5yZSSHXpCyxjgQeaORq3tvDsxDyzaadA/5+AbAUwRyRuuTh0aRQuE/vAOt/qzzxidJ5iDeu1cLHaNBlQ==} @@ -5391,6 +6897,10 @@ packages: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} @@ -5570,6 +7080,19 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + semantic-release@21.1.2: + resolution: {integrity: sha512-kz76azHrT8+VEkQjoCBHE06JNQgTgsC4bT8XfCzb7DHcsk9vG3fqeMVik8h5rcWCYi2Fd+M3bwA7BG8Z8cRwtA==} + engines: {node: '>=18'} + hasBin: true + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + semver@7.5.2: resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} engines: {node: '>=10'} @@ -5640,6 +7163,14 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + signale@1.4.0: + resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} + engines: {node: '>=6'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5651,6 +7182,10 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + slugify@1.6.9: resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==} engines: {node: '>=8.0.0'} @@ -5696,6 +7231,21 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead + spawn-error-forwarder@1.0.0: + resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -5703,6 +7253,16 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} + split2@1.0.0: + resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -5732,6 +7292,9 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-combiner2@1.1.1: + resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + streamx@2.26.0: resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} @@ -5810,10 +7373,22 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5839,6 +7414,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -5866,6 +7445,9 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + tailwindcss@3.4.19: resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} engines: {node: '>=14.0.0'} @@ -5889,10 +7471,18 @@ packages: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + tempy@0.6.0: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} + tempy@3.2.0: + resolution: {integrity: sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==} + engines: {node: '>=14.16'} + terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} @@ -5952,6 +7542,10 @@ packages: text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5969,6 +7563,12 @@ packages: resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -6004,6 +7604,14 @@ packages: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} + traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + trim-repeated@1.0.0: resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} engines: {node: '>=0.10.0'} @@ -6055,6 +7663,10 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -6063,6 +7675,26 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -6099,6 +7731,11 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -6106,6 +7743,9 @@ packages: underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -6122,10 +7762,28 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + + universal-user-agent@7.0.3: + resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -6156,12 +7814,42 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6189,6 +7877,9 @@ packages: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -6282,6 +7973,9 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} + wgsl_reflect@1.5.0: + resolution: {integrity: sha512-ntYNHZgzBHs+pzmVCsSiRqyye3Ey1xdKEX0Ls8PiDBKIiGFwUOef0PdBbYvUyGTGFwLKkqTZOGmPAed70mquTw==} + whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation @@ -6328,6 +8022,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workbox-background-sync@6.6.0: resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} @@ -6428,6 +8125,10 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -6446,10 +8147,18 @@ packages: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -6458,6 +8167,14 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + zarrita@0.7.3: resolution: {integrity: sha512-wChTQ1Ox75INoQCzKAfLWAfB70JJ4KjdW8Sz5x4ZWrFB4Dw+YZdnxHTL0xSdsrB9EmKSeK7fS1Y+I2ibhfGbkw==} @@ -6554,7 +8271,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 + browserslist: 4.28.8 lru-cache: 5.1.1 semver: 7.5.2 @@ -7446,13 +9163,16 @@ snapshots: '@biomejs/cli-win32-x64@2.4.16': optional: true - '@cornerstonejs/codec-charls@1.2.3': {} + '@colors/colors@1.5.0': + optional: true + + '@cornerstonejs/codec-charls@1.2.5': {} - '@cornerstonejs/codec-libjpeg-turbo-8bit@1.2.2': {} + '@cornerstonejs/codec-libjpeg-turbo-8bit@1.2.4': {} - '@cornerstonejs/codec-openjpeg@1.3.0': {} + '@cornerstonejs/codec-openjpeg@1.3.2': {} - '@cornerstonejs/codec-openjph@2.4.7': {} + '@cornerstonejs/codec-openjph@2.4.9': {} '@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5)': dependencies: @@ -7555,6 +9275,50 @@ snapshots: '@ctrl/tinycolor@3.6.1': {} + '@deck.gl/core@9.1.15': + dependencies: + '@loaders.gl/core': 4.4.5 + '@loaders.gl/images': 4.4.5(@loaders.gl/core@4.4.5) + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@luma.gl/webgl': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + '@math.gl/sun': 4.1.0 + '@math.gl/types': 4.1.0 + '@math.gl/web-mercator': 4.1.0 + '@probe.gl/env': 4.1.1 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + '@types/offscreencanvas': 2019.7.3 + gl-matrix: 3.4.4 + mjolnir.js: 3.1.0 + + '@deck.gl/extensions@9.1.15(@deck.gl/core@9.1.15)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)))': + dependencies: + '@deck.gl/core': 9.1.15 + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + + '@deck.gl/layers@9.1.15(@deck.gl/core@9.1.15)(@loaders.gl/core@4.4.5)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)))': + dependencies: + '@deck.gl/core': 9.1.15 + '@loaders.gl/core': 4.4.5 + '@loaders.gl/images': 4.4.5(@loaders.gl/core@4.4.5) + '@loaders.gl/schema': 4.4.5 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@mapbox/tiny-sdf': 2.2.0 + '@math.gl/core': 4.1.0 + '@math.gl/polygon': 4.1.0 + '@math.gl/web-mercator': 4.1.0 + earcut: 2.2.4 + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -7578,6 +9342,23 @@ snapshots: '@eslint/js@8.57.1': {} + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + + '@floating-ui/react-dom@2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.8.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.12': {} + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -7814,6 +9595,96 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} + '@loaders.gl/core@4.4.5': + dependencies: + '@loaders.gl/loader-utils': 4.4.5(@loaders.gl/core@4.4.5) + '@loaders.gl/schema': 4.4.5 + '@loaders.gl/schema-utils': 4.4.5(@loaders.gl/core@4.4.5) + '@loaders.gl/worker-utils': 4.4.5(@loaders.gl/core@4.4.5) + '@probe.gl/log': 4.1.1 + + '@loaders.gl/images@4.4.5(@loaders.gl/core@4.4.5)': + dependencies: + '@loaders.gl/core': 4.4.5 + '@loaders.gl/loader-utils': 4.4.5(@loaders.gl/core@4.4.5) + + '@loaders.gl/loader-utils@4.4.5(@loaders.gl/core@4.4.5)': + dependencies: + '@loaders.gl/schema': 4.4.5 + '@loaders.gl/worker-utils': 4.4.5(@loaders.gl/core@4.4.5) + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + transitivePeerDependencies: + - '@loaders.gl/core' + + '@loaders.gl/schema-utils@4.4.5(@loaders.gl/core@4.4.5)': + dependencies: + '@loaders.gl/core': 4.4.5 + '@loaders.gl/schema': 4.4.5 + '@math.gl/types': 4.1.0 + '@types/geojson': 7946.0.16 + apache-arrow: 21.2.0 + + '@loaders.gl/schema@4.4.5': + dependencies: + '@types/geojson': 7946.0.16 + apache-arrow: 21.2.0 + + '@loaders.gl/worker-utils@4.4.5(@loaders.gl/core@4.4.5)': + dependencies: + '@loaders.gl/core': 4.4.5 + + '@luma.gl/constants@9.1.10': {} + + '@luma.gl/core@9.1.10': + dependencies: + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.1 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + '@types/offscreencanvas': 2019.7.3 + + '@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))': + dependencies: + '@luma.gl/core': 9.1.10 + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + + '@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)': + dependencies: + '@luma.gl/core': 9.1.10 + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 + wgsl_reflect: 1.5.0 + + '@luma.gl/webgl@9.1.10(@luma.gl/core@9.1.10)': + dependencies: + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.1 + + '@mapbox/tiny-sdf@2.2.0': {} + + '@math.gl/core@4.1.0': + dependencies: + '@math.gl/types': 4.1.0 + + '@math.gl/polygon@4.1.0': + dependencies: + '@math.gl/core': 4.1.0 + + '@math.gl/sun@4.1.0': {} + + '@math.gl/types@4.1.0': {} + + '@math.gl/web-mercator@4.1.0': + dependencies: + '@math.gl/core': 4.1.0 + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -7830,8 +9701,137 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@octokit/auth-token@4.0.0': {} + + '@octokit/auth-token@5.1.2': {} + + '@octokit/core@5.2.2': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.1 + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/core@6.1.6': + dependencies: + '@octokit/auth-token': 5.1.2 + '@octokit/graphql': 8.2.2 + '@octokit/request': 9.2.4 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.3 + + '@octokit/endpoint@10.1.4': + dependencies: + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/endpoint@9.0.6': + dependencies: + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@7.1.1': + dependencies: + '@octokit/request': 8.4.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@8.2.2': + dependencies: + '@octokit/request': 9.2.4 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/openapi-types@20.0.0': {} + + '@octokit/openapi-types@24.2.0': {} + + '@octokit/openapi-types@25.1.0': {} + + '@octokit/plugin-paginate-rest@11.6.0(@octokit/core@6.1.6)': + dependencies: + '@octokit/core': 6.1.6 + '@octokit/types': 13.10.0 + + '@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 12.6.0 + + '@octokit/plugin-retry@6.1.0(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + bottleneck: 2.19.5 + + '@octokit/plugin-retry@7.2.1(@octokit/core@6.1.6)': + dependencies: + '@octokit/core': 6.1.6 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + bottleneck: 2.19.5 + + '@octokit/plugin-throttling@8.2.0(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 12.6.0 + bottleneck: 2.19.5 + + '@octokit/plugin-throttling@9.6.1(@octokit/core@6.1.6)': + dependencies: + '@octokit/core': 6.1.6 + '@octokit/types': 13.10.0 + bottleneck: 2.19.5 + + '@octokit/request-error@5.1.1': + dependencies: + '@octokit/types': 13.10.0 + deprecation: 2.3.1 + once: 1.4.0 + + '@octokit/request-error@6.1.8': + dependencies: + '@octokit/types': 14.1.0 + + '@octokit/request@8.4.1': + dependencies: + '@octokit/endpoint': 9.0.6 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/request@9.2.4': + dependencies: + '@octokit/endpoint': 10.1.4 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.3 + + '@octokit/types@12.6.0': + dependencies: + '@octokit/openapi-types': 20.0.0 + + '@octokit/types@13.10.0': + dependencies: + '@octokit/openapi-types': 24.2.0 + + '@octokit/types@14.1.0': + dependencies: + '@octokit/openapi-types': 25.1.0 + '@petamoriken/float16@3.9.3': {} + '@playwright/test@1.62.1': + dependencies: + playwright: 1.62.1 + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.107.2(postcss@8.5.25)))(webpack@5.107.2(postcss@8.5.25))': dependencies: ansi-html: 0.0.9 @@ -7847,6 +9847,265 @@ snapshots: type-fest: 4.41.0 webpack-dev-server: 4.15.2(webpack@5.107.2(postcss@8.5.25)) + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.3': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@probe.gl/env@4.1.1': {} + + '@probe.gl/log@4.1.1': + dependencies: + '@probe.gl/env': 4.1.1 + + '@probe.gl/stats@4.1.1': {} + + '@radix-ui/number@1.1.3': {} + + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-arrow@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-collection@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.3(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-compose-refs@1.1.5(@types/react@18.3.30)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-context@1.2.2(@types/react@18.3.30)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-direction@1.1.4(@types/react@18.3.30)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-focus-guards@1.1.6(@types/react@18.3.30)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-id@1.1.4(@types/react@18.3.30)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-popover@1.1.23(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.3(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@18.3.30)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.30)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-popper@1.3.7(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/rect': 1.1.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-portal@1.1.17(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-presence@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-primitive@2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.3.3(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-slider@1.4.7(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-direction': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.4(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-slot@1.3.3(@types/react@18.3.30)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-switch@1.3.7(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-context': 1.2.2(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@18.3.7(@types/react@18.3.30))(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + '@types/react-dom': 18.3.7(@types/react@18.3.30) + + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@18.3.30)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@18.3.30)(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@18.3.30)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-use-effect-event@0.0.5(@types/react@18.3.30)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@18.3.30)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-use-previous@1.1.4(@types/react@18.3.30)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-use-rect@1.1.4(@types/react@18.3.30)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.3 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/react-use-size@1.1.4(@types/react@18.3.30)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@18.3.30)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.30 + + '@radix-ui/rect@1.1.3': {} + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.29.7 @@ -7868,34 +10127,202 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@11.2.1(rollup@3.30.0)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@3.30.0) - '@types/resolve': 1.17.1 - builtin-modules: 3.3.0 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.12 - rollup: 3.30.0 + '@rollup/plugin-node-resolve@11.2.1(rollup@3.30.0)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@3.30.0) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.12 + rollup: 3.30.0 + + '@rollup/plugin-replace@2.4.2(rollup@3.30.0)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@3.30.0) + magic-string: 0.25.9 + rollup: 3.30.0 + + '@rollup/pluginutils@3.1.0(rollup@3.30.0)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.2 + rollup: 3.30.0 + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.16.1': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@semantic-release/changelog@6.0.3(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + '@semantic-release/error': 3.0.0 + aggregate-error: 3.1.0 + fs-extra: 11.4.0 + lodash: 4.18.1 + semantic-release: 21.1.2(typescript@4.9.5) + + '@semantic-release/commit-analyzer@10.0.4(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + conventional-changelog-angular: 6.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 5.0.0 + debug: 4.4.3 + import-from: 4.0.0 + lodash-es: 4.18.1 + micromatch: 4.0.8 + semantic-release: 21.1.2(typescript@4.9.5) + transitivePeerDependencies: + - supports-color + + '@semantic-release/commit-analyzer@12.0.0(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + conventional-changelog-angular: 7.0.0 + conventional-commits-filter: 4.0.0 + conventional-commits-parser: 5.0.0 + debug: 4.4.3 + import-from-esm: 1.3.4 + lodash-es: 4.18.1 + micromatch: 4.0.8 + semantic-release: 21.1.2(typescript@4.9.5) + transitivePeerDependencies: + - supports-color + + '@semantic-release/error@3.0.0': {} + + '@semantic-release/error@4.0.0': {} + + '@semantic-release/git@10.0.1(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + '@semantic-release/error': 3.0.0 + aggregate-error: 3.1.0 + debug: 4.4.3 + dir-glob: 3.0.1 + execa: 5.1.1 + lodash: 4.18.1 + micromatch: 4.0.8 + p-reduce: 2.1.0 + semantic-release: 21.1.2(typescript@4.9.5) + transitivePeerDependencies: + - supports-color + + '@semantic-release/github@10.3.5(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + '@octokit/core': 6.1.6 + '@octokit/plugin-paginate-rest': 11.6.0(@octokit/core@6.1.6) + '@octokit/plugin-retry': 7.2.1(@octokit/core@6.1.6) + '@octokit/plugin-throttling': 9.6.1(@octokit/core@6.1.6) + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + debug: 4.4.3 + dir-glob: 3.0.1 + globby: 14.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + issue-parser: 7.0.2 + lodash-es: 4.18.1 + mime: 4.1.0 + p-filter: 4.1.0 + semantic-release: 21.1.2(typescript@4.9.5) + url-join: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@semantic-release/github@9.2.6(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.2) + '@octokit/plugin-retry': 6.1.0(@octokit/core@5.2.2) + '@octokit/plugin-throttling': 8.2.0(@octokit/core@5.2.2) + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + debug: 4.4.3 + dir-glob: 3.0.1 + globby: 14.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + issue-parser: 6.0.0 + lodash-es: 4.18.1 + mime: 4.1.0 + p-filter: 4.1.0 + semantic-release: 21.1.2(typescript@4.9.5) + url-join: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@semantic-release/npm@10.0.6(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + execa: 8.0.1 + fs-extra: 11.4.0 + lodash-es: 4.18.1 + nerf-dart: 1.0.0 + normalize-url: 8.1.1 + npm: 9.9.4 + rc: 1.2.8 + read-pkg: 8.1.0 + registry-auth-token: 5.1.1 + semantic-release: 21.1.2(typescript@4.9.5) + semver: 7.5.2 + tempy: 3.2.0 + + '@semantic-release/npm@12.0.2(semantic-release@21.1.2(typescript@4.9.5))': + dependencies: + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + execa: 9.6.1 + fs-extra: 11.4.0 + lodash-es: 4.18.1 + nerf-dart: 1.0.0 + normalize-url: 8.1.1 + npm: 10.9.9 + rc: 1.2.8 + read-pkg: 9.0.1 + registry-auth-token: 5.1.1 + semantic-release: 21.1.2(typescript@4.9.5) + semver: 7.5.2 + tempy: 3.2.0 - '@rollup/plugin-replace@2.4.2(rollup@3.30.0)': + '@semantic-release/release-notes-generator@11.0.7(semantic-release@21.1.2(typescript@4.9.5))': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@3.30.0) - magic-string: 0.25.9 - rollup: 3.30.0 + conventional-changelog-angular: 6.0.0 + conventional-changelog-writer: 6.0.1 + conventional-commits-filter: 4.0.0 + conventional-commits-parser: 5.0.0 + debug: 4.4.3 + get-stream: 7.0.1 + import-from: 4.0.0 + into-stream: 7.0.0 + lodash-es: 4.18.1 + read-pkg-up: 10.1.0 + semantic-release: 21.1.2(typescript@4.9.5) + transitivePeerDependencies: + - supports-color - '@rollup/pluginutils@3.1.0(rollup@3.30.0)': + '@semantic-release/release-notes-generator@13.0.0(semantic-release@21.1.2(typescript@4.9.5))': dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.2 - rollup: 3.30.0 + conventional-changelog-angular: 7.0.0 + conventional-changelog-writer: 7.0.1 + conventional-commits-filter: 4.0.0 + conventional-commits-parser: 5.0.0 + debug: 4.4.3 + get-stream: 7.0.1 + import-from-esm: 1.3.4 + into-stream: 7.0.0 + lodash-es: 4.18.1 + read-pkg-up: 11.0.0 + semantic-release: 21.1.2(typescript@4.9.5) + transitivePeerDependencies: + - supports-color - '@rtsao/scc@1.1.0': {} + '@sinclair/typebox@0.24.51': {} - '@rushstack/eslint-patch@1.16.1': {} + '@sindresorhus/merge-streams@2.3.0': {} - '@sinclair/typebox@0.24.51': {} + '@sindresorhus/merge-streams@4.0.0': {} '@sinonjs/commons@1.8.6': dependencies: @@ -8099,6 +10526,8 @@ snapshots: '@types/qs': 6.15.1 '@types/serve-static': 1.15.10 + '@types/geojson@7946.0.16': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 14.18.63 @@ -8136,12 +10565,22 @@ snapshots: '@types/mime@1.3.5': {} + '@types/minimist@1.2.5': {} + '@types/node-forge@1.3.14': dependencies: '@types/node': 14.18.63 '@types/node@14.18.63': {} + '@types/node@25.9.5': + dependencies: + undici-types: 7.24.6 + + '@types/normalize-package-data@2.4.4': {} + + '@types/offscreencanvas@2019.7.3': {} + '@types/parse-json@4.0.2': {} '@types/prettier@2.7.3': {} @@ -8410,6 +10849,11 @@ snapshots: reference-spec-reader: 0.2.0 unzipit: 2.0.0 + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + abab@2.0.6: {} accepts@1.3.8: @@ -8455,6 +10899,18 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + aggregate-error@5.0.0: + dependencies: + clean-stack: 5.3.0 + indent-string: 5.0.0 + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -8486,6 +10942,8 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-escapes@6.2.1: {} + ansi-html-community@0.0.8: {} ansi-html@0.0.9: {} @@ -8494,12 +10952,18 @@ snapshots: ansi-regex@6.2.2: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@5.2.0: {} + ansicolors@0.3.2: {} + antd@4.24.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@ant-design/colors': 6.0.0 @@ -8555,6 +11019,13 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + apache-arrow@21.2.0: + dependencies: + '@types/node': 25.9.5 + flatbuffers: 25.9.23 + json-with-bigint: 3.5.12 + tslib: 2.8.1 + arg@4.1.3: {} arg@5.0.2: {} @@ -8565,6 +11036,12 @@ snapshots: argparse@2.0.1: {} + argv-formatter@1.0.0: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 @@ -8578,6 +11055,8 @@ snapshots: array-flatten@1.1.1: {} + array-ify@1.0.0: {} + array-includes@3.1.9: dependencies: call-bind: 1.0.9 @@ -8650,6 +11129,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + arrify@1.0.1: {} + asap@2.0.6: {} ast-types-flow@0.0.8: {} @@ -8664,10 +11145,10 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.5.0(postcss@8.5.25): + autoprefixer@10.5.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001793 + browserslist: 4.28.8 + caniuse-lite: 1.0.30001809 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.25 @@ -8862,8 +11343,14 @@ snapshots: baseline-browser-mapping@2.10.33: {} + baseline-browser-mapping@2.11.13: {} + batch@0.6.1: {} + before-after-hook@2.2.3: {} + + before-after-hook@3.0.2: {} + bfj@7.1.0: dependencies: bluebird: 3.7.2 @@ -8902,6 +11389,8 @@ snapshots: boolbase@1.0.0: {} + bottleneck@2.19.5: {} + brace-expansion@1.1.18: dependencies: balanced-match: 1.0.2 @@ -8920,11 +11409,19 @@ snapshots: browserslist@4.28.2: dependencies: baseline-browser-mapping: 2.10.33 - caniuse-lite: 1.0.30001793 + caniuse-lite: 1.0.30001809 electron-to-chromium: 1.5.367 node-releases: 2.0.47 update-browserslist-db: 1.2.3(browserslist@4.28.2) + browserslist@4.28.8: + dependencies: + baseline-browser-mapping: 2.11.13 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.405 + node-releases: 2.0.53 + update-browserslist-db: 1.3.1(browserslist@4.28.8) + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -8961,21 +11458,38 @@ snapshots: camelcase-css@2.0.1: {} + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + camelcase@5.3.1: {} camelcase@6.3.0: {} caniuse-api@3.0.0: dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001793 + browserslist: 4.28.8 + caniuse-lite: 1.0.30001809 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001809: {} + + cardinal@2.1.1: + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 case-sensitive-paths-webpack-plugin@2.4.0: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -8986,6 +11500,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + char-regex@1.0.2: {} char-regex@2.0.2: {} @@ -9010,26 +11526,56 @@ snapshots: cjs-module-lexer@1.4.3: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + classnames@2.5.1: {} clean-css@5.3.3: dependencies: source-map: 0.6.1 + clean-stack@2.2.0: {} + + clean-stack@5.3.0: + dependencies: + escape-string-regexp: 5.0.0 + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + co@4.6.0: {} collect-v8-coverage@1.0.3: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} colord@2.9.3: {} @@ -9058,6 +11604,11 @@ snapshots: commondir@1.0.1: {} + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + complex.js@2.4.3: {} compressible@2.0.18: @@ -9080,6 +11631,11 @@ snapshots: concat-map@0.0.1: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + confusing-browser-globals@1.0.11: {} connect-history-api-fallback@2.0.0: {} @@ -9090,6 +11646,47 @@ snapshots: content-type@1.0.5: {} + conventional-changelog-angular@6.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-writer@6.0.1: + dependencies: + conventional-commits-filter: 3.0.0 + dateformat: 3.0.3 + handlebars: 4.7.9 + json-stringify-safe: 5.0.1 + meow: 8.1.2 + semver: 7.5.2 + split: 1.0.1 + + conventional-changelog-writer@7.0.1: + dependencies: + conventional-commits-filter: 4.0.0 + handlebars: 4.7.9 + json-stringify-safe: 5.0.1 + meow: 12.1.1 + semver: 7.5.2 + split2: 4.2.0 + + conventional-commits-filter@3.0.0: + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + + conventional-commits-filter@4.0.0: {} + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -9152,6 +11749,15 @@ snapshots: path-type: 4.0.0 yaml: 1.10.3 + cosmiconfig@8.3.6(typescript@4.9.5): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 4.9.5 + craco-less@2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.107.2(postcss@8.5.25)): dependencies: '@craco/craco': 6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5) @@ -9173,6 +11779,10 @@ snapshots: crypto-random-string@2.0.0: {} + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + css-blank-pseudo@3.0.3(postcss@8.5.25): dependencies: postcss: 8.5.25 @@ -9323,6 +11933,8 @@ snapshots: dependencies: '@babel/runtime': 7.29.7 + dateformat@3.0.3: {} + dayjs@1.11.21: {} dcmjs@0.35.0: @@ -9357,6 +11969,13 @@ snapshots: dependencies: ms: 2.1.3 + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + decimal.js@10.6.0: {} dedent@0.7.0: {} @@ -9382,6 +12001,8 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.21 + deep-extend@0.6.0: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -9410,12 +12031,16 @@ snapshots: depd@2.0.0: {} + deprecation@2.3.1: {} + destroy@1.2.0: {} detect-browser@5.3.0: {} detect-newline@3.1.0: {} + detect-node-es@1.1.0: {} + detect-node@2.1.0: {} detect-port-alt@1.1.6: @@ -9425,25 +12050,31 @@ snapshots: transitivePeerDependencies: - supports-color - dicom-microscopy-viewer@0.48.24: + dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc(@loaders.gl/core@4.4.5)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))): dependencies: - '@cornerstonejs/codec-charls': 1.2.3 - '@cornerstonejs/codec-libjpeg-turbo-8bit': 1.2.2 - '@cornerstonejs/codec-openjpeg': 1.3.0 - '@cornerstonejs/codec-openjph': 2.4.7 + '@cornerstonejs/codec-charls': 1.2.5 + '@cornerstonejs/codec-libjpeg-turbo-8bit': 1.2.4 + '@cornerstonejs/codec-openjpeg': 1.3.2 + '@cornerstonejs/codec-openjph': 2.4.9 + '@deck.gl/core': 9.1.15 + '@deck.gl/extensions': 9.1.15(@deck.gl/core@9.1.15)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) + '@deck.gl/layers': 9.1.15(@deck.gl/core@9.1.15)(@loaders.gl/core@4.4.5)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) '@imagingdatacommons/dicomicc': 0.2.3 colormap: 2.3.2 dcmjs: 0.41.0 - dicomweb-client: 0.11.3 + dicomweb-client: 0.10.3 + flatbush: 4.4.0 image-type: 4.1.0 mathjs: 11.12.0 ol: 10.9.0 uuid: 9.0.1 + transitivePeerDependencies: + - '@loaders.gl/core' + - '@luma.gl/core' + - '@luma.gl/engine' dicomweb-client@0.10.3: {} - dicomweb-client@0.11.3: {} - didyoumean@1.2.2: {} diff-sequences@27.5.1: {} @@ -9505,6 +12136,10 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dotenv-expand@5.1.0: {} dotenv@10.0.0: {} @@ -9515,8 +12150,14 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + duplexer@0.1.2: {} + earcut@2.2.4: {} + earcut@3.0.2: {} ee-first@1.1.1: {} @@ -9527,6 +12168,8 @@ snapshots: electron-to-chromium@1.5.367: {} + electron-to-chromium@1.5.405: {} + email-addresses@5.0.0: {} emittery@0.10.2: {} @@ -9550,6 +12193,11 @@ snapshots: entities@2.2.0: {} + env-ci@9.1.1: + dependencies: + execa: 7.2.0 + java-properties: 1.0.2 + errno@0.1.8: dependencies: prr: 1.0.1 @@ -9690,6 +12338,8 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -9965,6 +12615,45 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@7.2.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.2.0 + exit@0.1.2: {} expect@27.5.1: @@ -10018,6 +12707,8 @@ snapshots: transitivePeerDependencies: - supports-color + fast-content-type-parse@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -10054,6 +12745,19 @@ snapshots: fflate@0.8.3: {} + figures@2.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + figures@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -10102,6 +12806,12 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 + find-up-simple@1.0.1: {} + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -10116,12 +12826,29 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + find-versions@5.1.0: + dependencies: + semver-regex: 4.0.5 + flat-cache@3.2.0: dependencies: flatted: 3.4.2 keyv: 4.5.4 rimraf: 3.0.2 + flatbuffers@25.9.23: {} + + flatbush@4.4.0: + dependencies: + flatqueue: 2.0.3 + + flatqueue@2.0.3: {} + flatted@3.4.2: {} follow-redirects@1.16.0: {} @@ -10176,12 +12903,23 @@ snapshots: fresh@0.5.2: {} + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 universalify: 2.0.1 + fs-extra@11.4.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -10199,6 +12937,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -10245,6 +12986,8 @@ snapshots: hasown: 2.0.4 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-own-enumerable-property-symbols@3.0.2: {} get-package-type@0.1.0: {} @@ -10256,6 +12999,15 @@ snapshots: get-stream@6.0.1: {} + get-stream@7.0.1: {} + + get-stream@8.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -10272,6 +13024,15 @@ snapshots: fs-extra: 8.1.0 globby: 6.1.0 + git-log-parser@1.2.1: + dependencies: + argv-formatter: 1.0.0 + spawn-error-forwarder: 1.0.0 + split2: 1.0.0 + stream-combiner2: 1.1.1 + through2: 2.0.5 + traverse: 0.6.8 + gl-matrix@3.4.4: {} glob-parent@5.1.2: @@ -10321,6 +13082,15 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.6 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + globby@6.1.0: dependencies: array-union: 1.0.2 @@ -10331,6 +13101,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -10341,10 +13113,23 @@ snapshots: handle-thing@2.0.1: {} + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + hard-rejection@2.1.0: {} + harmony-reflect@1.6.2: {} has-bigints@1.1.0: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -10367,8 +13152,20 @@ snapshots: he@1.2.0: {} + hook-std@3.0.0: {} + hoopy@0.1.4: {} + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -10441,6 +13238,13 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 @@ -10468,8 +13272,21 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} + human-signals@4.3.1: {} + + human-signals@5.0.0: {} + + human-signals@8.0.1: {} + husky@9.1.7: {} iconv-lite@0.4.24: @@ -10492,6 +13309,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.6: {} + image-size@0.5.5: optional: true @@ -10506,15 +13325,30 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-from-esm@1.3.4: + dependencies: + debug: 4.4.3 + import-meta-resolve: 4.2.0 + transitivePeerDependencies: + - supports-color + + import-from@4.0.0: {} + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} + indent-string@5.0.0: {} + + index-to-position@1.2.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -10530,6 +13364,11 @@ snapshots: hasown: 2.0.4 side-channel: 1.1.0 + into-stream@7.0.0: + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + iota-array@1.0.0: {} ipaddr.js@1.9.1: {} @@ -10628,10 +13467,16 @@ snapshots: is-obj@1.0.1: {} + is-obj@2.0.0: {} + is-path-inside@3.0.3: {} + is-plain-obj@1.1.0: {} + is-plain-obj@3.0.0: {} + is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} is-regex@1.2.1: @@ -10653,6 +13498,10 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -10664,12 +13513,20 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.21 is-typedarray@1.0.0: {} + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -10693,6 +13550,22 @@ snapshots: isexe@2.0.0: {} + issue-parser@6.0.0: + dependencies: + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 + + issue-parser@7.0.2: + dependencies: + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: @@ -10739,6 +13612,8 @@ snapshots: filelist: 1.0.6 picocolors: 1.1.1 + java-properties@1.0.2: {} + javascript-natural-sort@0.7.1: {} jest-changed-files@27.5.1: @@ -11224,14 +14099,22 @@ snapshots: json-buffer@3.0.1: {} + json-parse-better-errors@1.0.2: {} + json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: {} + + json-with-bigint@3.5.12: {} + json2mq@0.2.0: dependencies: string-convert: 0.2.1 @@ -11252,6 +14135,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonparse@1.3.1: {} + jsonpath@1.3.0: dependencies: esprima: 1.2.5 @@ -11326,6 +14211,15 @@ snapshots: lines-and-columns@1.2.4: {} + lines-and-columns@2.0.4: {} + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + loader-runner@4.3.2: {} loader-utils@2.0.4: @@ -11336,6 +14230,11 @@ snapshots: loader-utils@3.3.1: {} + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -11349,10 +14248,26 @@ snapshots: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.18.1: {} + + lodash.capitalize@4.2.1: {} + lodash.clonedeep@4.5.0: {} lodash.debounce@4.0.8: {} + lodash.escaperegexp@4.1.2: {} + + lodash.ismatch@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -11361,6 +14276,8 @@ snapshots: lodash.uniq@4.5.0: {} + lodash.uniqby@4.7.0: {} + lodash@4.18.1: {} loglevel@1.9.2: {} @@ -11373,6 +14290,8 @@ snapshots: dependencies: tslib: 2.8.1 + lru-cache@10.4.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -11397,6 +14316,22 @@ snapshots: dependencies: tmpl: 1.0.5 + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + marked-terminal@5.2.0(marked@5.1.2): + dependencies: + ansi-escapes: 6.2.1 + cardinal: 2.1.1 + chalk: 5.6.2 + cli-table3: 0.6.5 + marked: 5.1.2 + node-emoji: 1.11.0 + supports-hyperlinks: 2.3.0 + + marked@5.1.2: {} + math-intrinsics@1.1.0: {} mathjs@11.12.0: @@ -11419,6 +14354,22 @@ snapshots: dependencies: fs-monkey: 1.1.0 + meow@12.1.1: {} + + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -11442,8 +14393,12 @@ snapshots: mime@1.6.0: {} + mime@4.1.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + min-indent@1.0.1: {} mini-css-extract-plugin@2.10.2(webpack@5.107.2(postcss@8.5.25)): @@ -11462,8 +14417,18 @@ snapshots: dependencies: brace-expansion: 2.1.4 + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + minimist@1.2.8: {} + mjolnir.js@3.1.0: {} + + modify-values@1.0.1: {} + moment@2.30.1: {} ms@2.0.0: {} @@ -11504,11 +14469,17 @@ snapshots: neo-async@2.6.2: {} + nerf-dart@1.0.0: {} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.8.1 + node-emoji@1.11.0: + dependencies: + lodash: 4.18.1 + node-exports-info@1.6.0: dependencies: array.prototype.flatmap: 1.3.3 @@ -11522,14 +14493,51 @@ snapshots: node-releases@2.0.47: {} + node-releases@2.0.53: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.12 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.2 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-url@6.1.0: {} + normalize-url@8.1.1: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + npm@10.9.9: {} + + npm@9.9.4: {} + nth-check@2.0.1: dependencies: boolbase: 1.0.0 @@ -11622,6 +14630,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -11643,6 +14655,18 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-each-series@3.0.0: {} + + p-filter@4.1.0: + dependencies: + p-map: 7.0.6 + + p-is-promise@3.0.0: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -11651,6 +14675,14 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + p-locate@3.0.0: dependencies: p-limit: 2.3.0 @@ -11663,11 +14695,23 @@ snapshots: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@7.0.6: {} + + p-reduce@2.1.0: {} + + p-reduce@3.0.0: {} + p-retry@4.6.2: dependencies: '@types/retry': 0.12.0 retry: 0.13.1 + p-try@1.0.0: {} + p-try@2.2.0: {} pako@2.1.0: {} @@ -11683,6 +14727,11 @@ snapshots: parse-headers@2.0.6: {} + parse-json@4.0.0: + dependencies: + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.7 @@ -11690,6 +14739,22 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.7 + index-to-position: 1.2.0 + type-fest: 4.41.0 + + parse-ms@4.0.0: {} + parse-node-version@1.0.1: {} parse5@6.0.1: {} @@ -11705,16 +14770,22 @@ snapshots: path-exists@4.0.0: {} + path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-to-regexp@0.1.13: {} path-type@4.0.0: {} + path-type@6.0.0: {} + pbf@4.0.1: dependencies: resolve-protobuf-schema: 2.1.0 @@ -11729,6 +14800,8 @@ snapshots: pify@2.3.0: {} + pify@3.0.0: {} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 @@ -11737,6 +14810,11 @@ snapshots: pirates@4.0.7: {} + pkg-conf@2.1.0: + dependencies: + find-up: 2.1.0 + load-json-file: 4.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -11745,6 +14823,14 @@ snapshots: dependencies: find-up: 3.0.0 + playwright-core@1.62.1: {} + + playwright@1.62.1: + dependencies: + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 + possible-typed-array-names@1.1.0: {} postcss-attribute-case-insensitive@5.0.2(postcss@8.5.25): @@ -11785,7 +14871,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.25 @@ -11793,7 +14879,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -11924,7 +15010,7 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.5.25) postcss: 8.5.25 @@ -11944,7 +15030,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 cssnano-utils: 3.1.0(postcss@8.5.25) postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -12017,7 +15103,7 @@ snapshots: postcss-normalize-unicode@5.1.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -12080,8 +15166,8 @@ snapshots: '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.5.25) '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.5.25) '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.25) - autoprefixer: 10.5.0(postcss@8.5.25) - browserslist: 4.28.2 + autoprefixer: 10.5.4(postcss@8.5.25) + browserslist: 4.28.8 css-blank-pseudo: 3.0.3(postcss@8.5.25) css-has-pseudo: 3.0.4(postcss@8.5.25) css-prefers-color-scheme: 6.0.3(postcss@8.5.25) @@ -12124,7 +15210,7 @@ snapshots: postcss-reduce-initial@5.1.2(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 caniuse-api: 3.0.0 postcss: 8.5.25 @@ -12193,6 +15279,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} promise@8.3.0: @@ -12212,6 +15302,8 @@ snapshots: properties-file@4.0.0: {} + proto-list@1.2.4: {} + protocol-buffers-schema@3.6.1: {} proxy-addr@2.0.7: @@ -12238,6 +15330,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-lru@4.0.1: {} + quick-lru@6.1.2: {} quickselect@3.0.0: {} @@ -12595,6 +15689,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + react-app-polyfill@3.0.0: dependencies: core-js: 3.49.0 @@ -12608,7 +15709,7 @@ snapshots: dependencies: '@babel/code-frame': 7.29.7 address: 1.2.2 - browserslist: 4.28.2 + browserslist: 4.28.8 chalk: 4.1.2 cross-spawn: 7.0.6 detect-port-alt: 1.1.6 @@ -12664,6 +15765,25 @@ snapshots: react-refresh@0.11.0: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.30)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.30)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.30 + + react-remove-scroll@2.7.2(@types/react@18.3.30)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.30)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.30)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.30)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.30)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.30 + react-router-dom@6.30.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.23.3 @@ -12777,6 +15897,14 @@ snapshots: react: 18.3.1 react-is: 18.3.1 + react-style-singleton@2.2.3(@types/react@18.3.30)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.30 + react-test-renderer@18.3.1(react@18.3.1): dependencies: react: 18.3.1 @@ -12792,6 +15920,46 @@ snapshots: dependencies: pify: 2.3.0 + read-pkg-up@10.1.0: + dependencies: + find-up: 6.3.0 + read-pkg: 8.1.0 + type-fest: 4.41.0 + + read-pkg-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + read-pkg@8.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 7.1.1 + type-fest: 4.41.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -12821,6 +15989,10 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + redeyed@2.1.1: + dependencies: + esprima: 4.0.1 + reference-spec-reader@0.2.0: {} reflect.getprototypeof@1.0.10: @@ -12862,6 +16034,10 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.3 + regjsgen@0.8.0: {} regjsparser@0.13.1: @@ -13029,6 +16205,46 @@ snapshots: '@types/node-forge': 1.3.14 node-forge: 1.4.0 + semantic-release@21.1.2(typescript@4.9.5): + dependencies: + '@semantic-release/commit-analyzer': 10.0.4(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/error': 4.0.0 + '@semantic-release/github': 9.2.6(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/npm': 10.0.6(semantic-release@21.1.2(typescript@4.9.5)) + '@semantic-release/release-notes-generator': 11.0.7(semantic-release@21.1.2(typescript@4.9.5)) + aggregate-error: 5.0.0 + cosmiconfig: 8.3.6(typescript@4.9.5) + debug: 4.4.3 + env-ci: 9.1.1 + execa: 8.0.1 + figures: 5.0.0 + find-versions: 5.1.0 + get-stream: 6.0.1 + git-log-parser: 1.2.1 + hook-std: 3.0.0 + hosted-git-info: 7.0.2 + lodash-es: 4.18.1 + marked: 5.1.2 + marked-terminal: 5.2.0(marked@5.1.2) + micromatch: 4.0.8 + p-each-series: 3.0.0 + p-reduce: 3.0.0 + read-pkg-up: 10.1.0 + resolve-from: 5.0.0 + semver: 7.5.2 + semver-diff: 4.0.0 + signale: 1.4.0 + yargs: 17.7.3 + transitivePeerDependencies: + - supports-color + - typescript + + semver-diff@4.0.0: + dependencies: + semver: 7.5.2 + + semver-regex@4.0.5: {} + semver@7.5.2: dependencies: lru-cache: 6.0.0 @@ -13138,12 +16354,22 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + + signale@1.4.0: + dependencies: + chalk: 2.4.2 + figures: 2.0.0 + pkg-conf: 2.1.0 + sisteransi@1.0.5: {} slash@3.0.0: {} slash@4.0.0: {} + slash@5.1.0: {} + slugify@1.6.9: {} sockjs@0.3.24: @@ -13197,6 +16423,22 @@ snapshots: sourcemap-codec@1.4.8: {} + spawn-error-forwarder@1.0.0: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + spdy-transport@3.0.0: dependencies: debug: 4.4.3 @@ -13218,6 +16460,16 @@ snapshots: transitivePeerDependencies: - supports-color + split2@1.0.0: + dependencies: + through2: 2.0.5 + + split2@4.2.0: {} + + split@1.0.1: + dependencies: + through: 2.3.8 + sprintf-js@1.0.3: {} stable@0.1.8: {} @@ -13241,6 +16493,11 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-combiner2@1.1.1: + dependencies: + duplexer2: 0.1.4 + readable-stream: 2.3.8 + streamx@2.26.0: dependencies: events-universal: 1.0.1 @@ -13350,10 +16607,16 @@ snapshots: strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + + strip-final-newline@4.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} strip-outer@1.0.1: @@ -13366,7 +16629,7 @@ snapshots: stylehacks@5.1.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.8 postcss: 8.5.25 postcss-selector-parser: 6.1.2 @@ -13380,6 +16643,10 @@ snapshots: tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -13409,6 +16676,8 @@ snapshots: symbol-tree@3.2.4: {} + tailwind-merge@3.6.0: {} + tailwindcss@3.4.19: dependencies: '@alloc/quick-lru': 5.2.0 @@ -13461,6 +16730,8 @@ snapshots: temp-dir@2.0.0: {} + temp-dir@3.0.0: {} + tempy@0.6.0: dependencies: is-stream: 2.0.1 @@ -13468,6 +16739,13 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 + tempy@3.2.0: + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + terminal-link@2.1.1: dependencies: ansi-escapes: 4.3.2 @@ -13502,6 +16780,8 @@ snapshots: transitivePeerDependencies: - react-native-b4a + text-extensions@2.4.0: {} + text-table@0.2.0: {} thenify-all@1.6.0: @@ -13516,6 +16796,13 @@ snapshots: throttle-debounce@5.0.2: {} + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through@2.3.8: {} + thunky@1.1.0: {} tiny-emitter@2.1.0: {} @@ -13550,6 +16837,10 @@ snapshots: dependencies: punycode: 2.3.1 + traverse@0.6.8: {} + + trim-newlines@3.0.1: {} + trim-repeated@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -13600,12 +16891,23 @@ snapshots: type-fest@0.16.0: {} + type-fest@0.18.1: {} + type-fest@0.20.2: {} type-fest@0.21.3: {} - type-fest@4.41.0: - optional: true + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-fest@3.13.1: {} + + type-fest@4.41.0: {} type-is@1.6.18: dependencies: @@ -13653,6 +16955,9 @@ snapshots: typescript@4.9.5: {} + uglify-js@3.19.3: + optional: true + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -13662,6 +16967,8 @@ snapshots: underscore@1.13.8: {} + undici-types@7.24.6: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -13673,10 +16980,22 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + universal-user-agent@6.0.1: {} + + universal-user-agent@7.0.3: {} + universalify@0.1.2: {} universalify@0.2.0: {} @@ -13695,15 +17014,38 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.3.1(browserslist@4.28.8): + dependencies: + browserslist: 4.28.8 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 + url-join@5.0.0: {} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 + use-callback-ref@1.3.3(@types/react@18.3.30)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.30 + + use-sidecar@1.1.3(@types/react@18.3.30)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.30 + util-deprecate@1.0.2: {} utila@0.4.0: {} @@ -13722,6 +17064,11 @@ snapshots: convert-source-map: 1.9.0 source-map: 0.7.6 + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + vary@1.1.2: {} w3c-hr-time@1.0.2: @@ -13833,7 +17180,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.16.0 acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.2 + browserslist: 4.28.8 chrome-trace-event: 1.0.4 enhanced-resolve: 5.22.2 es-module-lexer: 2.1.0 @@ -13871,6 +17218,8 @@ snapshots: websocket-extensions@0.1.4: {} + wgsl_reflect@1.5.0: {} + whatwg-encoding@1.0.5: dependencies: iconv-lite: 0.4.24 @@ -13942,6 +17291,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + workbox-background-sync@6.6.0: dependencies: idb: 7.1.1 @@ -14092,6 +17443,8 @@ snapshots: xmlchars@2.2.0: {} + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -14102,6 +17455,8 @@ snapshots: yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -14112,10 +17467,24 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yn@3.1.1: {} yocto-queue@0.1.0: {} + yocto-queue@1.2.2: {} + + yoctocolors@2.2.0: {} + zarrita@0.7.3: dependencies: '@zarrita/storage': 0.2.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ead71e1..9c36530d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,10 @@ strictPeerDependencies: false allowBuilds: core-js: true core-js-pure: true + # For npm-published versions; git tarball URLs are added dynamically by CI dicom-microscopy-viewer: true + # Git-hosted tarball (update when dmv SHA changes in package.json) + 'dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc': true overrides: '@types/d3-dispatch': 3.0.6 diff --git a/public/config/e2e.js b/public/config/e2e.js new file mode 100644 index 00000000..90028826 --- /dev/null +++ b/public/config/e2e.js @@ -0,0 +1,25 @@ +/** Config for local verification / e2e runs against the public IDC proxy. */ +window.config = { + path: '/', + servers: [ + { + id: 'e2e', + url: 'https://proxy.imaging.datacommons.cancer.gov/current/viewer-only-no-downloads-see-tinyurl-dot-com-slash-3j3d9jyp/dicomWeb', + write: false, + retry: { + retries: 6, + factor: 2, + minTimeout: 1000, + maxTimeout: 30000, + randomize: true, + retryableStatusCodes: [429, 500, 502, 503, 504] + } + } + ], + disableWorklist: false, + disableAnnotationTools: true, + enableServerSelection: false, + mode: 'light', + preload: true, + annotations: [] +} diff --git a/scripts/serve-e2e.mjs b/scripts/serve-e2e.mjs new file mode 100644 index 00000000..75222398 --- /dev/null +++ b/scripts/serve-e2e.mjs @@ -0,0 +1,136 @@ +#!/usr/bin/env node +/** + * Tiny SPA static file server for e2e / visual-regression runs. + * + * Serves the CRA `build/` directory on 127.0.0.1:3977 and falls back to + * index.html for unknown paths (required for deep links like /studies/...). + * + * Kept dependency-free on purpose: the `serve` package currently crashes + * under path-to-regexp v8 (`pathToRegExp.compile is not a function`), and + * pulling in another static-server package just to host a directory is not + * worth the risk of similar peer-dep breakage. + */ +import { createServer } from 'node:http' +import { existsSync } from 'node:fs' +import { open } from 'node:fs/promises' +import { extname, join, relative, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const HOST = process.env.E2E_HOST ?? '127.0.0.1' +const PORT = Number(process.env.E2E_PORT ?? 3977) +const ROOT = resolve( + process.env.E2E_BUILD_DIR ?? + join(fileURLToPath(new URL('.', import.meta.url)), '..', 'build'), +) + +const MIME = { + '.html': 'text/html; charset=utf-8', + '.js': 'application/javascript; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon', + '.woff': 'font/woff', + '.woff2': 'font/woff2', + '.map': 'application/json', + '.txt': 'text/plain; charset=utf-8', + '.wasm': 'application/wasm', +} + +/** + * Resolve a request path under ROOT, rejecting anything that escapes it + * (including encoded `..` segments and absolute paths). + */ +function safeJoin(root, urlPath) { + const raw = (urlPath.split('?')[0] ?? '/').replace(/^\/+/, '') + let decoded + try { + decoded = decodeURIComponent(raw) + } catch { + return null + } + if (decoded.includes('\0')) { + return null + } + const candidate = resolve(root, decoded) + const rel = relative(root, candidate) + if (rel.startsWith('..') || rel.includes(`..${'/'}`) || rel.includes('..\\')) { + return null + } + return candidate +} + +/** + * Stream a regular file to the response. Returns true on success, false if the + * path is missing, not a file, or cannot be opened. Uses open()+fstat so we + * never call existsSync/statSync on a user-controlled path (Sonar S6549) and + * so directories are rejected cleanly (createReadStream on a dir can hang). + */ +async function trySendFile(res, filePath) { + let handle + try { + handle = await open(filePath, 'r') + const stats = await handle.stat() + if (!stats.isFile()) { + await handle.close() + handle = undefined + return false + } + const type = + MIME[extname(filePath).toLowerCase()] ?? 'application/octet-stream' + res.writeHead(200, { + 'Content-Type': type, + 'Cache-Control': 'no-store', + }) + // Stream owns the fd (autoClose); clear our handle so we don't double-close. + const stream = handle.createReadStream() + handle = undefined + stream.pipe(res) + return true + } catch { + if (handle != null) { + await handle.close().catch(() => undefined) + } + return false + } +} + +if (!existsSync(ROOT)) { + process.stderr.write(`[serve-e2e] build directory not found: ${ROOT}\n`) + process.stderr.write('Run `pnpm run build:e2e` first.\n') + process.exit(1) +} + +const SPA_INDEX = join(ROOT, 'index.html') + +const server = createServer((req, res) => { + void (async () => { + const urlPath = req.url ?? '/' + const filePath = safeJoin(ROOT, urlPath) + if (filePath == null) { + res.writeHead(400).end('Bad Request') + return + } + + if (await trySendFile(res, filePath)) { + return + } + + // SPA fallback for client-side routes like /studies/... + if (await trySendFile(res, SPA_INDEX)) { + return + } + + res.writeHead(404).end('Not Found') + })() +}) + +server.listen(PORT, HOST, () => { + process.stdout.write( + `[serve-e2e] serving ${ROOT} at http://${HOST}:${PORT}\n`, + ) +}) diff --git a/src/components/AnnotationGroupDisplaySettings.tsx b/src/components/AnnotationGroupDisplaySettings.tsx new file mode 100644 index 00000000..eee88f57 --- /dev/null +++ b/src/components/AnnotationGroupDisplaySettings.tsx @@ -0,0 +1,255 @@ +import type React from 'react' +import { FiSettings } from 'react-icons/fi' +import { Button } from './ui/button' +import { Input } from './ui/input' +import { Popover, PopoverContent, PopoverTrigger } from './ui/popover' +import { Separator } from './ui/separator' +import { Slider } from './ui/slider' +import { Switch } from './ui/switch' + +export interface MeasurementOption { + key: string + meaning: string + schemeDesignator: string + codeValue: string +} + +interface RowProps { + label: string + value: number + min: number + max: number + step: number + onChange: (value: number) => void +} + +/** Slider + number input pair, label above — one row of the settings form. */ +function SettingRow({ + label, + value, + min, + max, + step, + onChange, +}: RowProps): React.ReactElement { + return ( +
+ {label} +
+ onChange(next)} + /> + { + const next = event.target.valueAsNumber + if (!Number.isNaN(next)) { + onChange(Math.min(max, Math.max(min, next))) + } + }} + /> +
+
+ ) +} + +interface AnnotationGroupDisplaySettingsProps { + color?: number[] + onColorChange: (color: number[]) => void + opacity: number + onOpacityChange: (opacity: number) => void + isClosedGraphicType: boolean + filled: boolean + onFilledChange: (filled: boolean) => void + fillOpacity: number + onFillOpacityChange: (fillOpacity: number) => void + measurementOptions: MeasurementOption[] + selectedMeasurementKey?: string + onMeasurementChange: (option: MeasurementOption | undefined) => void + limitValues?: [number, number] + limitBounds: [number, number] + onLimitValuesChange: (values: [number, number]) => void + disabled?: boolean +} + +const COLOR_LABELS = ['Red', 'Green', 'Blue'] + +/** + * "Display Settings" popover trigger + panel for an annotation group: + * color, opacity, fill, measurement filtering. Built with Radix primitives + * + Tailwind (see components/ui/*) rather than antd — kept as its own + * component so it doesn't touch ColorSlider/OpacitySlider, which are still + * shared by Segments, Optical Paths, and Mappings. + */ +function AnnotationGroupDisplaySettings({ + color, + onColorChange, + opacity, + onOpacityChange, + isClosedGraphicType, + filled, + onFilledChange, + fillOpacity, + onFillOpacityChange, + measurementOptions, + selectedMeasurementKey, + onMeasurementChange, + limitValues, + limitBounds, + onLimitValuesChange, + disabled = false, +}: AnnotationGroupDisplaySettingsProps): React.ReactElement { + const [minBound, maxBound] = limitBounds + + return ( + + + + + +
+ + Display Settings + + + {color != null && color.length === 3 && ( +
+ + {COLOR_LABELS.map((label, index) => ( + { + const nextColor = [...color] + nextColor[index] = next + onColorChange(nextColor) + }} + /> + ))} +
+ )} + +
+ + +
+ + {isClosedGraphicType && ( +
+ +
+ Filled + +
+ {filled && ( + + )} +
+ )} + + {limitValues != null && ( +
+ +
+ { + const next = event.target.valueAsNumber + if (!Number.isNaN(next)) { + onLimitValuesChange([next, limitValues[1]]) + } + }} + /> + + onLimitValuesChange([next[0], next[1]]) + } + /> + { + const next = event.target.valueAsNumber + if (!Number.isNaN(next)) { + onLimitValuesChange([limitValues[0], next]) + } + }} + /> +
+
+ )} + + {measurementOptions.length > 0 && ( +
+ + Measurement + +
+ )} +
+
+
+ ) +} + +export default AnnotationGroupDisplaySettings diff --git a/src/components/AnnotationGroupItem.tsx b/src/components/AnnotationGroupItem.tsx index c9d58c9d..7b5e2a88 100644 --- a/src/components/AnnotationGroupItem.tsx +++ b/src/components/AnnotationGroupItem.tsx @@ -174,6 +174,10 @@ interface AnnotationGroupItemProps { fillOpacity?: number } }) => void + getMeasurementRange?: ( + annotationGroupUID: string, + measurement: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null } interface AnnotationGroupItemState { @@ -392,14 +396,20 @@ class AnnotationGroupItem extends React.Component< ? String(option[0].children[0]) : String(option[0].children), }) + const range = this.props.getMeasurementRange?.( + this.props.annotationGroup.uid, + measurement, + ) + const limitValues = range != null ? [range.min, range.max] : undefined this.props.onStyleChange({ uid: this.props.annotationGroup.uid, - styleOptions: { measurement }, + styleOptions: { measurement, limitValues }, }) this.setState((state) => ({ currentStyle: { ...state.currentStyle, measurement, + limitValues, }, })) } else { @@ -407,6 +417,8 @@ class AnnotationGroupItem extends React.Component< uid: this.props.annotationGroup.uid, styleOptions: { color: this.props.defaultStyle.color, + /** Explicitly clear so the viewer deactivates measurement filtering. */ + measurement: undefined, }, }) this.setState((state) => ({ @@ -513,18 +525,16 @@ class AnnotationGroupItem extends React.Component< windowSettings = ( <> Values of interest - - +
+
- - - - - - +
+
) } diff --git a/src/components/AnnotationGroupList.tsx b/src/components/AnnotationGroupList.tsx index 5d4d419e..6974e5ef 100644 --- a/src/components/AnnotationGroupList.tsx +++ b/src/components/AnnotationGroupList.tsx @@ -41,8 +41,13 @@ interface AnnotationGroupListProps { measurement?: dcmjs.sr.coding.CodedConcept fill?: boolean fillOpacity?: number + limitValues?: number[] } }) => void + getMeasurementRange?: ( + annotationGroupUID: string, + measurement: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null } /** @@ -87,6 +92,7 @@ class AnnotationGroupList extends React.Component< defaultStyle={this.props.defaultAnnotationGroupStyles[uid]} onVisibilityChange={this.props.onAnnotationGroupVisibilityChange} onStyleChange={this.props.onAnnotationGroupStyleChange} + getMeasurementRange={this.props.getMeasurementRange} /> ), } diff --git a/src/components/AnnotationGroupLoadIndicator.tsx b/src/components/AnnotationGroupLoadIndicator.tsx new file mode 100644 index 00000000..45ff70ed --- /dev/null +++ b/src/components/AnnotationGroupLoadIndicator.tsx @@ -0,0 +1,174 @@ +import { CheckCircleOutlined, LoadingOutlined } from '@ant-design/icons' +import { Card, Space, Spin } from 'antd' +import type React from 'react' +import { useEffect, useState } from 'react' +import { + type AnnotationGroupLoadState, + formatElapsedMs, +} from '../utils/annotationGroupLoadStatus' + +function phaseLabel(state: AnnotationGroupLoadState): string { + switch (state.phase) { + case 'index': + return 'Fetching annotation index…' + case 'data': { + if ( + state.totalBytes != null && + state.totalBytes > 0 && + state.loadedBytes != null + ) { + const percent = Math.min( + 100, + Math.round((state.loadedBytes / state.totalBytes) * 100), + ) + return `Retrieving annotation data… ${percent}%` + } + return 'Retrieving annotation data…' + } + case 'decoding': + return 'Decoding & rendering…' + case 'done': + return 'Loaded' + case 'error': + return 'Failed to load' + default: + return '' + } +} + +const wrapStyle: React.CSSProperties = { + position: 'absolute', + left: '50%', + bottom: 12, + transform: 'translateX(-50%)', + zIndex: 10, + pointerEvents: 'none', + maxWidth: 300, +} + +interface AnnotationGroupLoadIndicatorProps { + states: AnnotationGroupLoadState[] +} + +/** Maximum number of individual entries to show before collapsing. */ +const MAX_VISIBLE_ENTRIES = 3 + +/** + * Floating card (bottom-left of the viewport) reporting bulk annotation + * group hydrate progress: fetching the graphic index, retrieving coordinate + * data (with byte progress when the server reports a length), and decoding + * & rendering. A group's row lingers briefly with a checkmark after it + * finishes, then the caller removes it. + * + * When more than MAX_VISIBLE_ENTRIES groups are loading, displays a summary + * to prevent the card from growing excessively tall. + */ +const AnnotationGroupLoadIndicator: React.FC< + AnnotationGroupLoadIndicatorProps +> = ({ states }) => { + const [nowMs, setNowMs] = useState(() => Date.now()) + const activeStates = states.filter( + (state) => state.phase !== 'done' && state.phase !== 'error', + ) + const settledStates = states.filter( + (state) => state.phase === 'done' || state.phase === 'error', + ) + const isActive = activeStates.length > 0 + + useEffect(() => { + if (!isActive) { + return undefined + } + const id = window.setInterval(() => { + setNowMs(Date.now()) + }, 200) + return () => { + window.clearInterval(id) + } + }, [isActive]) + + if (states.length === 0) { + return null + } + + /** + * Determine which entries to show individually vs as a summary. + * Prioritize active (loading) entries, then fill remaining slots with settled. + */ + const shouldCollapse = states.length > MAX_VISIBLE_ENTRIES + let visibleStates: AnnotationGroupLoadState[] + let hiddenActiveCount = 0 + let hiddenSettledCount = 0 + + if (shouldCollapse) { + const visibleActive = activeStates.slice(0, MAX_VISIBLE_ENTRIES) + const remainingSlots = MAX_VISIBLE_ENTRIES - visibleActive.length + const visibleSettled = settledStates.slice(0, remainingSlots) + visibleStates = [...visibleActive, ...visibleSettled] + hiddenActiveCount = Math.max(0, activeStates.length - visibleActive.length) + hiddenSettledCount = Math.max( + 0, + settledStates.length - visibleSettled.length, + ) + } else { + visibleStates = states + } + + return ( +
+ + + {visibleStates.map((state) => { + const isSettled = state.phase === 'done' || state.phase === 'error' + const elapsed = (state.finishedAtMs ?? nowMs) - state.startedAtMs + return ( + + {isSettled ? ( + + ) : ( + } size="small" /> + )} +
+
{state.label}
+
{phaseLabel(state)}
+
+ {formatElapsedMs(elapsed)} +
+
+
+ ) + })} + {(hiddenActiveCount > 0 || hiddenSettledCount > 0) && ( +
+ {hiddenActiveCount > 0 && ( + +{hiddenActiveCount} more loading + )} + {hiddenActiveCount > 0 && hiddenSettledCount > 0 && ', '} + {hiddenSettledCount > 0 && ( + {hiddenSettledCount} completed + )} +
+ )} +
+
+
+ ) +} + +export default AnnotationGroupLoadIndicator diff --git a/src/components/ColorSlider.tsx b/src/components/ColorSlider.tsx index 72b303ba..f62f3c06 100644 --- a/src/components/ColorSlider.tsx +++ b/src/components/ColorSlider.tsx @@ -29,33 +29,35 @@ const ColorSlider: React.FC = ({ color, onChange }) => { const colorLabels = ['Red', 'Green', 'Blue'] return ( - <> +
{colorLabels.map((colorLabel, index) => ( - - {colorLabel} - - - - - - - +
+
{colorLabel}
+ + + + + + + + +
))} - +
) } diff --git a/src/components/OpacitySlider.tsx b/src/components/OpacitySlider.tsx index ddb56b6e..7241a699 100644 --- a/src/components/OpacitySlider.tsx +++ b/src/components/OpacitySlider.tsx @@ -13,30 +13,32 @@ const OpacitySlider: React.FC = ({ label = 'Opacity', }) => { return ( - - {label} - - - - - - - +
+
{label}
+ + + + + + + + +
) } diff --git a/src/components/SlideViewer.tsx b/src/components/SlideViewer.tsx index a95b4b87..52a0d256 100644 --- a/src/components/SlideViewer.tsx +++ b/src/components/SlideViewer.tsx @@ -4,7 +4,6 @@ import { Descriptions, Divider, Drawer, - InputNumber, Layout, Menu, message, @@ -47,6 +46,10 @@ import type { AnnotationCategoryAndType, AnnotationSettings, } from '../types/annotations' +import { + removeAnnotationGroupLoadState, + upsertAnnotationGroupLoadState, +} from '../utils/annotationGroupLoadStatus' import { CustomError, errorTypes } from '../utils/CustomError' import { clampOverviewMapInViewport, @@ -62,6 +65,7 @@ import { withRouter } from '../utils/router' import { getSegmentationType, getSegmentColor } from '../utils/segmentColors' import { findContentItemsByName } from '../utils/sr' import AnnotationGroupList from './AnnotationGroupList' +import AnnotationGroupLoadIndicator from './AnnotationGroupLoadIndicator' import AnnotationList from './AnnotationList' import Btn from './Button' import Equipment from './Equipment' @@ -124,6 +128,9 @@ class SlideViewer extends React.Component { private readonly labelViewportRef: React.RefObject + /** Auto-dismiss timers for settled (done/error) annotation group load rows. */ + private readonly annotationGroupLoadDoneTimers: { [uid: string]: number } = {} + private stopOverviewMapClamp: (() => void) | undefined private volumeViewer: dmv.viewer.VolumeImageViewer @@ -243,7 +250,6 @@ class SlideViewer extends React.Component { clients: this.props.clients, slide: this.props.slide, preload: this.props.preload, - clusteringPixelSizeThreshold: undefined, // Auto (zoom-based) by default }) this.volumeViewer = volumeViewer this.labelViewer = labelViewer @@ -298,14 +304,13 @@ class SlideViewer extends React.Component { pixelDataStatistics: {}, selectedPresentationStateUID: this.props.selectedPresentationStateUID, loadingFrames: new Set(), + annotationGroupLoadStatus: [], isICCProfilesEnabled: true, isPaletteDisplayGammaCorrectionEnabled: volumeViewer.getPaletteDisplayGammaCorrectionEnabled(), isSegmentationInterpolationEnabled: false, isParametricMapInterpolationEnabled: true, customizedSegmentColors: {}, - clusteringPixelSizeThreshold: null, // null means auto (zoom-based) - isClusteringEnabled: true, // Clustering enabled by default isSettingsDrawerOpen: false, } @@ -406,9 +411,6 @@ class SlideViewer extends React.Component { clients: this.props.clients, slide: this.props.slide, preload: this.props.preload, - clusteringPixelSizeThreshold: this.state.isClusteringEnabled - ? (this.state.clusteringPixelSizeThreshold ?? undefined) - : undefined, }) this.volumeViewer = volumeViewer this.labelViewer = labelViewer @@ -430,6 +432,7 @@ class SlideViewer extends React.Component { const [offset, size] = this.volumeViewer.boundingBox + this.clearAllAnnotationGroupLoadDoneTimers() this.setState({ visibleRoiUIDs: new Set(), visibleSegmentUIDs: new Set(), @@ -439,6 +442,7 @@ class SlideViewer extends React.Component { activeOpticalPathIdentifiers, presentationStates: [], loadingFrames: new Set(), + annotationGroupLoadStatus: [], selectedSeriesInstanceUID: undefined, validXCoordinateRange: [offset[0], offset[0] + size[0]], validYCoordinateRange: [offset[1], offset[1] + size[1]], @@ -2019,6 +2023,13 @@ class SlideViewer extends React.Component { } } + handleMouseLeaveViewport = (): void => { + this.lastHoveredRoiSignature = null + this.setState({ + isHoveredRoiTooltipVisible: false, + }) + } + getUpdatedSelectedRois = ( newSelectedRoiUid?: string, ): { selectedRoiUIDs: Set; selectedRoi?: dmv.roi.ROI } => { @@ -2201,12 +2212,104 @@ class SlideViewer extends React.Component { }) } + /** Resolves a human-readable label for the floating load-progress card. */ + getAnnotationGroupLabel = (uid: string): string => { + try { + const metadata = this.volumeViewer.getAnnotationGroupMetadata(uid) + const item = metadata?.AnnotationGroupSequence?.find( + (sequenceItem) => sequenceItem.AnnotationGroupUID === uid, + ) + if ( + item?.AnnotationGroupLabel != null && + item.AnnotationGroupLabel !== '' + ) { + return item.AnnotationGroupLabel + } + } catch { + /** Group not registered yet; fall through to the UID-based label. */ + } + return `Group …${uid.slice(-8)}` + } + + /** Marks a group's load row done/error, then removes it after it lingers. */ + markAnnotationGroupLoadSettled = ( + uid: string, + phase: 'done' | 'error', + ): void => { + this.setState((state) => ({ + annotationGroupLoadStatus: upsertAnnotationGroupLoadState( + state.annotationGroupLoadStatus, + uid, + { phase, finishedAtMs: Date.now() }, + ), + })) + if (this.annotationGroupLoadDoneTimers[uid] != null) { + window.clearTimeout(this.annotationGroupLoadDoneTimers[uid]) + } + this.annotationGroupLoadDoneTimers[uid] = window.setTimeout( + () => { + this.setState((state) => ({ + annotationGroupLoadStatus: removeAnnotationGroupLoadState( + state.annotationGroupLoadStatus, + uid, + ), + })) + // skipcq: JS-0320 + delete this.annotationGroupLoadDoneTimers[uid] + }, + phase === 'error' ? 4000 : 1500, + ) + } + + clearAllAnnotationGroupLoadDoneTimers = (): void => { + for (const uid of Object.keys(this.annotationGroupLoadDoneTimers)) { + window.clearTimeout(this.annotationGroupLoadDoneTimers[uid]) + // skipcq: JS-0320 + delete this.annotationGroupLoadDoneTimers[uid] + } + } + onLoadingStarted = (_event: CustomEventInit): void => { this.setState({ isLoading: true }) } - onLoadingEnded = (_event: CustomEventInit): void => { + onLoadingEnded = (event: CustomEventInit): void => { this.setState({ isLoading: false }) + const annotationGroupUID: string | undefined = + event.detail?.payload?.annotationGroupUID + if (annotationGroupUID !== undefined) { + this.markAnnotationGroupLoadSettled(annotationGroupUID, 'done') + } + } + + onAnnotationGroupLoadingProgress = (event: CustomEventInit): void => { + const payload: { + annotationGroupUID: string + phase: 'index' | 'data' | 'decoding' + loadedBytes?: number + totalBytes?: number | null + } = event.detail.payload + if ( + this.annotationGroupLoadDoneTimers[payload.annotationGroupUID] != null + ) { + window.clearTimeout( + this.annotationGroupLoadDoneTimers[payload.annotationGroupUID], + ) + // skipcq: JS-0320 + delete this.annotationGroupLoadDoneTimers[payload.annotationGroupUID] + } + this.setState((state) => ({ + annotationGroupLoadStatus: upsertAnnotationGroupLoadState( + state.annotationGroupLoadStatus, + payload.annotationGroupUID, + { + phase: payload.phase, + label: this.getAnnotationGroupLabel(payload.annotationGroupUID), + loadedBytes: payload.loadedBytes, + totalBytes: payload.totalBytes, + }, + ), + })) } onFrameLoadingStarted = (event: CustomEventInit): void => { @@ -2237,6 +2340,11 @@ class SlideViewer extends React.Component { NotificationMiddlewareContext.SLIM, new CustomError(errorTypes.VISUALIZATION, message), ) + const annotationGroupUID: string | undefined = + event.detail?.payload?.annotationGroupUID + if (annotationGroupUID !== undefined) { + this.markAnnotationGroupLoadSettled(annotationGroupUID, 'error') + } } onFrameLoadingEnded = (event: CustomEventInit): void => { @@ -2365,6 +2473,10 @@ class SlideViewer extends React.Component { 'dicommicroscopyviewer_loading_ended', this.onLoadingEnded, ) + document.body.removeEventListener( + 'dicommicroscopyviewer_annotation_group_loading_progress', + this.onAnnotationGroupLoadingProgress, + ) document.body.removeEventListener( 'dicommicroscopyviewer_frame_loading_started', this.onFrameLoadingStarted, @@ -2458,6 +2570,7 @@ class SlideViewer extends React.Component { this.labelViewer.cleanup() } this.handlePointerMoveDebounced.cancel() + this.clearAllAnnotationGroupLoadDoneTimers() window.removeEventListener('beforeunload', this.componentCleanup) } @@ -2498,6 +2611,10 @@ class SlideViewer extends React.Component { 'dicommicroscopyviewer_loading_ended', this.onLoadingEnded, ) + document.body.addEventListener( + 'dicommicroscopyviewer_annotation_group_loading_progress', + this.onAnnotationGroupLoadingProgress, + ) document.body.addEventListener( 'dicommicroscopyviewer_loading_error', this.onLoadingError, @@ -2999,6 +3116,29 @@ class SlideViewer extends React.Component { /** * Handle change of annotation group style. */ + getAnnotationGroupMeasurementRange = ( + annotationGroupUID: string, + measurement: dcmjs.sr.coding.CodedConcept, + ): { min: number; max: number } | null => { + const viewer = this.volumeViewer as dmv.viewer.VolumeImageViewer & { + getAnnotationGroupMeasurementRange?: ( + uid: string, + measurement?: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null + } + if (typeof viewer.getAnnotationGroupMeasurementRange !== 'function') { + return null + } + try { + return viewer.getAnnotationGroupMeasurementRange( + annotationGroupUID, + measurement, + ) + } catch { + return null + } + } + handleAnnotationGroupStyleChange = ({ uid, styleOptions, @@ -3007,14 +3147,39 @@ class SlideViewer extends React.Component { styleOptions: { opacity?: number color?: number[] - measurement?: dcmjs.sr.coding.CodedConcept fill?: boolean fillOpacity?: number + measurement?: dcmjs.sr.coding.CodedConcept + limitValues?: number[] } }): void => { logger.log(`change style of annotation group ${uid}`) try { - this.volumeViewer.setAnnotationGroupStyle(uid, styleOptions) + const viewer = this.volumeViewer as dmv.viewer.VolumeImageViewer & { + getAnnotationGroupMeasurementRange?: ( + uid: string, + measurement?: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null + } + let nextStyle = { ...styleOptions } + if ( + styleOptions.measurement != null && + styleOptions.limitValues == null && + typeof viewer.getAnnotationGroupMeasurementRange === 'function' + ) { + /** May be null until the viewer has fetched measurement values. */ + const range = viewer.getAnnotationGroupMeasurementRange( + uid, + styleOptions.measurement, + ) + if (range != null) { + nextStyle = { + ...nextStyle, + limitValues: [range.min, range.max], + } + } + } + viewer.setAnnotationGroupStyle(uid, nextStyle) } catch (error) { // eslint-disable-next-line @typescript-eslint/no-floating-promises NotificationMiddleware.onError( @@ -3738,71 +3903,6 @@ class SlideViewer extends React.Component { ).toggleParametricMapInterpolation() } - /** - * Handler that toggles clustering on/off. - */ - handleClusteringToggle = (checked: boolean): void => { - /** Ensure checked is a boolean */ - const newValue = Boolean(checked) - - /** Use functional setState to ensure we have the latest state */ - this.setState((prevState) => { - /** Don't update if the value hasn't actually changed */ - if (prevState.isClusteringEnabled === newValue) { - return null - } - - /** When turning ON with Auto (null/undefined), use viewer default so clustering is enabled; undefined means "clustering off" in the viewer */ - const threshold = newValue - ? (prevState.clusteringPixelSizeThreshold ?? 0.001) - : undefined - - /** - * Update viewer options immediately with the new state - * Check if viewer exists and has the method before calling - */ - if ( - this.volumeViewer !== null && - this.volumeViewer !== undefined && - typeof ( - this.volumeViewer as unknown as { - setAnnotationOptions?(opts: object): void - } - ).setAnnotationOptions === 'function' - ) { - try { - ;( - this.volumeViewer as unknown as { - setAnnotationOptions(opts: object): void - } - ).setAnnotationOptions({ - clusteringPixelSizeThreshold: threshold, - }) - } catch (error) { - console.error('Failed to update annotation options:', error) - } - } - - return { isClusteringEnabled: newValue } - }) - } - - /** - * Handler that updates the global clustering pixel size threshold. - */ - handleClusteringPixelSizeThresholdChange = (value: number | null): void => { - this.setState({ clusteringPixelSizeThreshold: value }) - if (this.state.isClusteringEnabled) { - ;( - this.volumeViewer as unknown as { - setAnnotationOptions?(opts: object): void - } - ).setAnnotationOptions?.({ - clusteringPixelSizeThreshold: value ?? undefined, - }) - } - } - formatAnnotation = (annotation: AnnotationCategoryAndType): void => { const roi = this.volumeViewer.getROI(annotation.uid) const key = getRoiKey(roi) as string @@ -4343,6 +4443,8 @@ class SlideViewer extends React.Component { [annotationUID: string]: { opacity: number color: number[] + filled?: boolean + fillOpacity?: number } } = {} annotationGroups.forEach((annotationGroup) => { @@ -4427,6 +4529,7 @@ class SlideViewer extends React.Component { onAnnotationGroupStyleChange={ this.handleAnnotationGroupStyleChange } + getMeasurementRange={this.getAnnotationGroupMeasurementRange} /> )} @@ -4764,51 +4867,6 @@ class SlideViewer extends React.Component { ) const segmentationItems: React.ReactNode[] = [] - segmentationItems.push( -
- Clustering - -
, - ) - segmentationItems.push( -
-
- Clustering Pixel Size Threshold (mm) -
- -
- When pixel size ≤ threshold, clustering is disabled. Leave empty for - zoom-based detection. -
-
, - ) if ( menus.segmentationInterpolationMenu !== null && menus.segmentationInterpolationMenu !== undefined @@ -4934,6 +4992,12 @@ class SlideViewer extends React.Component { toolbarHeight={toolbarHeight} cursor={cursor} volumeViewportRef={this.volumeViewportRef} + loadIndicator={ + + } + onMouseLeaveViewport={this.handleMouseLeaveViewport} > + /** Overlaid on top of the viewport (e.g. a floating load-progress card). */ + loadIndicator?: React.ReactNode + /** Called when the mouse leaves the viewport area. */ + onMouseLeaveViewport?: () => void children: React.ReactNode } @@ -19,6 +23,8 @@ const SlideViewerContent: React.FC = ({ toolbar, cursor, volumeViewportRef, + loadIndicator, + onMouseLeaveViewport, children, }) => { return ( @@ -39,10 +45,20 @@ const SlideViewerContent: React.FC = ({ minHeight: 0, overflow: 'hidden', position: 'relative', - cursor, }} - ref={volumeViewportRef} - /> + > + {/* biome-ignore lint/a11y/noStaticElementInteractions: onMouseLeave is passive (hides tooltip), not interactive */} +
+ {loadIndicator} +
{children} diff --git a/src/components/SlideViewer/types.ts b/src/components/SlideViewer/types.ts index d460fcff..fd4f34a8 100644 --- a/src/components/SlideViewer/types.ts +++ b/src/components/SlideViewer/types.ts @@ -5,6 +5,7 @@ import type * as dmv from 'dicom-microscopy-viewer' import type DicomWebManager from '../../DicomWebManager' import type { Slide } from '../../data/slides' import type { AnnotationSettings } from '../../types/annotations' +import type { AnnotationGroupLoadState } from '../../utils/annotationGroupLoadStatus' import type { RouteComponentProps } from '../../utils/router' /** @@ -121,12 +122,11 @@ export interface SlideViewerState { } } loadingFrames: Set + annotationGroupLoadStatus: AnnotationGroupLoadState[] isICCProfilesEnabled: boolean isPaletteDisplayGammaCorrectionEnabled: boolean isSegmentationInterpolationEnabled: boolean isParametricMapInterpolationEnabled: boolean customizedSegmentColors: { [segmentUID: string]: number[] } - clusteringPixelSizeThreshold: number | null - isClusteringEnabled: boolean isSettingsDrawerOpen: boolean } diff --git a/src/components/SlideViewer/utils/viewerUtils.ts b/src/components/SlideViewer/utils/viewerUtils.ts index 077cba39..7e0480a7 100644 --- a/src/components/SlideViewer/utils/viewerUtils.ts +++ b/src/components/SlideViewer/utils/viewerUtils.ts @@ -20,12 +20,10 @@ export const constructViewers = ({ clients, slide, preload, - clusteringPixelSizeThreshold, }: { clients: { [key: string]: dwc.api.DICOMwebClient } slide: Slide preload?: boolean - clusteringPixelSizeThreshold?: number }): { volumeViewer: dmv.viewer.VolumeImageViewer labelViewer?: dmv.viewer.LabelImageViewer @@ -48,10 +46,6 @@ export const constructViewers = ({ */ useTileGridResolutions: false, preload, - annotationOptions: - clusteringPixelSizeThreshold !== undefined - ? { clusteringPixelSizeThreshold } - : undefined, errorInterceptor: (error: CustomError) => { NotificationMiddleware.onError(NotificationMiddlewareContext.DMV, error) }, diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 00000000..ca2813b8 --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,42 @@ +import { cva, type VariantProps } from 'class-variance-authority' +import { type ButtonHTMLAttributes, forwardRef } from 'react' +import { cn } from '../../lib/utils' + +/** Rounded corners to match Ant Design buttons used elsewhere in the app. */ +const buttonVariants = cva( + 'dmv-ui inline-flex items-center justify-center gap-1.5 whitespace-nowrap text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-[#007ea3]', + { + variants: { + variant: { + primary: 'bg-[#007ea3] text-white hover:bg-[#00688a]', + ghost: 'bg-transparent text-neutral-600 hover:bg-neutral-100', + }, + size: { + icon: 'h-8 w-8 rounded-full', + sm: 'h-7 px-2 text-xs rounded', + }, + }, + defaultVariants: { + variant: 'primary', + size: 'icon', + }, + }, +) + +interface ButtonProps + extends ButtonHTMLAttributes, + VariantProps {} + +const Button = forwardRef( + ({ className, variant, size, type = 'button', ...props }, ref) => ( +