From 55ba23be6a4ab6b1ac7e377d85bdb023572ec4c6 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Wed, 14 Feb 2024 22:53:42 -0500 Subject: [PATCH 1/4] ENH: Add wasm configuration Build javascript, typescript, cli, packages, documentation via ITK-Wasm. A few tests added for the CLI, javascript, typescript to ensure they run. Other testing is left to the module. CI for build/test of everything and build / deploy of the documentation to GitHub Pages. --- .github/workflows/documentation.yml | 101 + .github/workflows/wasm.yml | 36 + .gitignore | 3 + CMakeLists.txt | 10 +- environment.yml | 10 + .../itkMorphologicalContourInterpolator.hxx | 4 + package.json | 45 + pnpm-lock.yaml | 3045 +++++++++++++++++ pnpm-workspace.yaml | 2 + test/CMakeLists.txt | 4 + wasm/CMakeLists.txt | 26 + wasm/morphological-contour-interpolation.cxx | 126 + .../README.md | 26 + .../pyproject.toml | 60 + .../test/__init__.py | 0 .../test/common.py | 6 + ...est_morphological_contour_interpolation.py | 17 + .../data/input/64816L_amygdala_int.nii.gz | Bin 0 -> 49666 bytes wasm/typescript/package.json | 54 + wasm/typescript/test/node/common.js | 7 + ...orphological-contour-interpolation-test.js | 22 + 21 files changed, 3603 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/documentation.yml create mode 100644 .github/workflows/wasm.yml create mode 100644 environment.yml create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 wasm/CMakeLists.txt create mode 100644 wasm/morphological-contour-interpolation.cxx create mode 100644 wasm/python/itkwasm-morphological-contour-interpolation-wasi/README.md create mode 100644 wasm/python/itkwasm-morphological-contour-interpolation-wasi/pyproject.toml create mode 100644 wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/__init__.py create mode 100644 wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/common.py create mode 100644 wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/test_morphological_contour_interpolation.py create mode 100644 wasm/test/data/input/64816L_amygdala_int.nii.gz create mode 100644 wasm/typescript/package.json create mode 100644 wasm/typescript/test/node/common.js create mode 100644 wasm/typescript/test/node/morphological-contour-interpolation-test.js diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 0000000..fc39f0c --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,101 @@ +name: Documentation + +on: + push: + branches: + - master + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build-wasm-documentation: + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v4 + + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + + - uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install + uses: pnpm/action-setup@v2 + with: + version: 8 + run_install: true + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Build + run: | + pnpm build + + - name: Build package typescript documentation + run: | + mkdir -p docs/ts/docs + mkdir -p docs//ts/app + + sed "s% basePath:.*% basePath: '/ITKMorphologicalContourInterpolation/ts/docs',%" wasm/typescript/index.html > docs/ts/docs/index.html + cp wasm/typescript/README.md docs/ts/docs/ + mkdir -p docs/ts/docs/test/browser/demo-app + cp wasm/typescript/test/browser/demo-app/logo.svg docs/ts/docs/test/browser/demo-app/ + + pushd wasm/typescript + rm -rf demo-app node_modules/.vite + export VITE_BASE_URL="/ITKMorphologicalContourInterpolation/ts/app/" + pnpm build + popd + rsync -a wasm/typescript/demo-app/ docs/ts/app/ + + - name: Build package python documentation + run: | + mkdir -p docs/py/docs + mkdir -p docs/py/app + + export SPHINX_BASE_URL="/ITKMorphologicalContourInterpolation/py/docs/" + pushd wasm/python/itkwasm-morphological-contour-interpolation/docs + pip install -r requirements.txt + make html + popd + rsync -a wasm/python/itkwasm-morphological-contour-interpolation/docs/_build/html/ docs/py/docs/ + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs + retention-days: 7 + + deploy-gh-pages: + needs: build-wasm-documentation + runs-on: ubuntu-22.04 + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + contents: read + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + # with: + # preview: true <-> currently not available to the public diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml new file mode 100644 index 0000000..88c76ee --- /dev/null +++ b/.github/workflows/wasm.yml @@ -0,0 +1,36 @@ +name: WebAssembly + +on: [push,pull_request] + +jobs: + build-wasm: + name: "Build WebAssembly" + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v4 + + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + + - uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install + uses: pnpm/action-setup@v2 + with: + version: 8 + run_install: true + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Build + run: | + pnpm build + + - name: Test + run: | + pnpm test diff --git a/.gitignore b/.gitignore index b8bd026..71af3d1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,6 @@ *.exe *.out *.app + +# wasm build +node_modules/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 79e9e51..5ffac74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,11 @@ if(CMAKE_CXX_STANDARD EQUAL "11" ) endif() if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 14) # Supported values are ``14``, ``17``, and ``20``. + if (WASI OR EMSCRIPTEN) + set(CMAKE_CXX_STANDARD 20) # Supported values are ``14``, ``17``, and ``20``. + else() + set(CMAKE_CXX_STANDARD 17) # Supported values are ``14``, ``17``, and ``20``. + endif() endif() if(NOT CMAKE_CXX_STANDARD_REQUIRED) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -20,6 +24,10 @@ if(NOT ITK_SOURCE_DIR) find_package(ITK 4.9 REQUIRED) list(APPEND CMAKE_MODULE_PATH ${ITK_CMAKE_DIR}) include(ITKModuleExternal) + if(WASI OR EMSCRIPTEN) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + add_subdirectory(wasm) + endif() else() set(ITK_DIR ${CMAKE_BINARY_DIR}) itk_module_impl() diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..0087e11 --- /dev/null +++ b/environment.yml @@ -0,0 +1,10 @@ +name: morphological-contour-interpolation +channels: + - conda-forge +dependencies: + - pytest + - python=3.11 + - pip + - pip: + - hatch + - itkwasm-image-io diff --git a/include/itkMorphologicalContourInterpolator.hxx b/include/itkMorphologicalContourInterpolator.hxx index 15137fc..ba9b998 100644 --- a/include/itkMorphologicalContourInterpolator.hxx +++ b/include/itkMorphologicalContourInterpolator.hxx @@ -713,13 +713,17 @@ MorphologicalContourInterpolator< TImage >::Interpolate1to1( int axis, TImage* o } } +#if !defined(__wasi__) && !defined(__EMSCRIPTEN__) static std::mutex mutexLock; +#endif if ( withinReq ) // else we should not write it { seqIt.GoToBegin(); // writing through one RLEImage iterator invalidates all the others // so this whole writing loop needs to be serialized +#if !defined(__wasi__) && !defined(__EMSCRIPTEN__) std::lock_guard< std::mutex > mutexHolder( mutexLock ); +#endif ImageRegionIterator< TImage > outIt( out, outRegion ); while ( !outIt.IsAtEnd() ) { diff --git a/package.json b/package.json new file mode 100644 index 0000000..af04390 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "@itk-wasm/morphological-contour-interpolation-build", + "version": "1.0.0", + "description": "npm scripts to generate itk-wasm artifacts.", + "private": true, + "type": "module", + "itk-wasm": { + "typescript-package-name": "@itk-wasm/morphological-contour-interpolation", + "typescript-output-dir": "wasm/typescript", + "python-package-name": "itkwasm-morphological-contour-interpolation", + "python-output-dir": "wasm/python", + "package-description": "Morphology-based approach for interslice interpolation of anatomical slices from volumetric images.", + "repository": "https://github.com/KitwareMedical/ITKMorphologicalContourInterpolation" + }, + "scripts": { + "build": "pnpm build:gen:typescript && pnpm -r build && pnpm build:gen:python", + "build:emscripten": "itk-wasm pnpm-script build:emscripten", + "build:emscripten:debug": "itk-wasm pnpm-script build:emscripten:debug", + "build:wasi": "itk-wasm pnpm-script build:wasi", + "build:wasi:debug": "itk-wasm pnpm-script build:wasi:debug", + "build:python:wasi": "itk-wasm pnpm-script build:python:wasi", + "bindgen:typescript": "itk-wasm pnpm-script bindgen:typescript", + "bindgen:python": "itk-wasm pnpm-script bindgen:python", + "build:gen:typescript": "itk-wasm pnpm-script build:gen:typescript", + "build:gen:python": "itk-wasm pnpm-script build:gen:python", + "build:micromamba": "itk-wasm pnpm-script build:micromamba", + "build:python:versionSync": "itk-wasm pnpm-script build:python:versionSync", + "publish:python": "itk-wasm pnpm-script publish:python", + "test": "pnpm test:data:download && pnpm -r test && pnpm test:python", + "test:data:download": "echo \"not needed\"", + "test:data:pack": "dam pack test/data test/data.tar.gz", + "test:python:wasi": "itk-wasm pnpm-script test:python:wasi", + "test:python:emscripten": "itk-wasm pnpm-script test:python:emscripten", + "test:python:dispatch": "itk-wasm pnpm-script test:python:dispatch", + "test:python": "itk-wasm pnpm-script test:python", + "test:wasi": "itk-wasm pnpm-script test:wasi -- -V", + "clean": "git clean -fdx -e node_modules" + }, + "license": "Apache-2.0", + "devDependencies": { + "@itk-wasm/dam": "^1.1.0", + "@thewtex/setup-micromamba": "^1.9.7", + "itk-wasm": "^1.0.0-b.166" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c9dea20 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3045 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@itk-wasm/dam': + specifier: ^1.1.0 + version: 1.1.1 + '@thewtex/setup-micromamba': + specifier: ^1.9.7 + version: 1.9.7 + itk-wasm: + specifier: ^1.0.0-b.166 + version: 1.0.0-b.166 + + wasm/typescript: + dependencies: + itk-wasm: + specifier: 1.0.0-b.165 + version: 1.0.0-b.165 + devDependencies: + '@itk-wasm/image-io': + specifier: ^1.1.0 + version: 1.1.0 + '@itk-wasm/mesh-io': + specifier: ^1.1.0 + version: 1.1.0 + '@shoelace-style/shoelace': + specifier: ^2.12.0 + version: 2.13.1(@types/react@18.2.55) + '@types/node': + specifier: ^20.2.5 + version: 20.11.17 + ava: + specifier: ^6.1.1 + version: 6.1.1 + esbuild: + specifier: ^0.19.8 + version: 0.19.12 + shx: + specifier: ^0.3.4 + version: 0.3.4 + typescript: + specifier: ^5.3.2 + version: 5.3.3 + vite: + specifier: ^4.5.0 + version: 4.5.2(@types/node@20.11.17) + vite-plugin-static-copy: + specifier: ^0.17.0 + version: 0.17.1(vite@4.5.2) + +packages: + + /@actions/cache@3.2.4: + resolution: {integrity: sha512-RuHnwfcDagtX+37s0ZWy7clbOfnZ7AlDJQ7k/9rzt2W4Gnwde3fa/qjSjVuz4vLcLIpc7fUob27CMrqiWZytYA==} + dependencies: + '@actions/core': 1.10.1 + '@actions/exec': 1.1.1 + '@actions/glob': 0.1.2 + '@actions/http-client': 2.2.0 + '@actions/io': 1.1.3 + '@azure/abort-controller': 1.1.0 + '@azure/ms-rest-js': 2.7.0 + '@azure/storage-blob': 12.17.0 + semver: 6.3.1 + uuid: 3.4.0 + transitivePeerDependencies: + - encoding + dev: true + + /@actions/core@1.10.1: + resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} + dependencies: + '@actions/http-client': 2.2.0 + uuid: 8.3.2 + dev: true + + /@actions/exec@1.1.1: + resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} + dependencies: + '@actions/io': 1.1.3 + dev: true + + /@actions/glob@0.1.2: + resolution: {integrity: sha512-SclLR7Ia5sEqjkJTPs7Sd86maMDw43p769YxBOxvPvEWuPEhpAnBsQfENOpXjFYMmhCqd127bmf+YdvJqVqR4A==} + dependencies: + '@actions/core': 1.10.1 + minimatch: 3.1.2 + dev: true + + /@actions/http-client@2.2.0: + resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==} + dependencies: + tunnel: 0.0.6 + undici: 5.28.3 + dev: true + + /@actions/io@1.1.3: + resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} + dev: true + + /@actions/tool-cache@2.0.1: + resolution: {integrity: sha512-iPU+mNwrbA8jodY8eyo/0S/QqCKDajiR8OxWTnSk/SnYg0sj8Hp4QcUEVC1YFpHWXtrfbQrE13Jz4k4HXJQKcA==} + dependencies: + '@actions/core': 1.10.1 + '@actions/exec': 1.1.1 + '@actions/http-client': 2.2.0 + '@actions/io': 1.1.3 + semver: 6.3.1 + uuid: 3.4.0 + dev: true + + /@azure/abort-controller@1.1.0: + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@azure/abort-controller@2.0.0: + resolution: {integrity: sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@azure/core-auth@1.6.0: + resolution: {integrity: sha512-3X9wzaaGgRaBCwhLQZDtFp5uLIXCPrGbwJNWPPugvL4xbIGgScv77YzzxToKGLAKvG9amDoofMoP+9hsH1vs1w==} + engines: {node: '>=18.0.0'} + dependencies: + '@azure/abort-controller': 2.0.0 + '@azure/core-util': 1.7.0 + tslib: 2.6.2 + dev: true + + /@azure/core-http@3.0.4: + resolution: {integrity: sha512-Fok9VVhMdxAFOtqiiAtg74fL0UJkt0z3D+ouUUxcRLzZNBioPRAMJFVxiWoJljYpXsRi4GDQHzQHDc9AiYaIUQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.6.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/core-util': 1.7.0 + '@azure/logger': 1.0.4 + '@types/node-fetch': 2.6.11 + '@types/tunnel': 0.0.3 + form-data: 4.0.0 + node-fetch: 2.7.0 + process: 0.11.10 + tslib: 2.6.2 + tunnel: 0.0.6 + uuid: 8.3.2 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + dev: true + + /@azure/core-lro@2.6.0: + resolution: {integrity: sha512-PyRNcaIOfMgoUC01/24NoG+k8O81VrKxYARnDlo+Q2xji0/0/j2nIt8BwQh294pb1c5QnXTDPbNR4KzoDKXEoQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@azure/abort-controller': 2.0.0 + '@azure/core-util': 1.7.0 + '@azure/logger': 1.0.4 + tslib: 2.6.2 + dev: true + + /@azure/core-paging@1.5.0: + resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@azure/core-tracing@1.0.0-preview.13: + resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@opentelemetry/api': 1.7.0 + tslib: 2.6.2 + dev: true + + /@azure/core-util@1.7.0: + resolution: {integrity: sha512-Zq2i3QO6k9DA8vnm29mYM4G8IE9u1mhF1GUabVEqPNX8Lj833gdxQ2NAFxt2BZsfAL+e9cT8SyVN7dFVJ/Hf0g==} + engines: {node: '>=18.0.0'} + dependencies: + '@azure/abort-controller': 2.0.0 + tslib: 2.6.2 + dev: true + + /@azure/logger@1.0.4: + resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@azure/ms-rest-js@2.7.0: + resolution: {integrity: sha512-ngbzWbqF+NmztDOpLBVDxYM+XLcUj7nKhxGbSU9WtIsXfRB//cf2ZbAG5HkOrhU9/wd/ORRB6lM/d69RKVjiyA==} + dependencies: + '@azure/core-auth': 1.6.0 + abort-controller: 3.0.0 + form-data: 2.5.1 + node-fetch: 2.7.0 + tslib: 1.14.1 + tunnel: 0.0.6 + uuid: 8.3.2 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + dev: true + + /@azure/storage-blob@12.17.0: + resolution: {integrity: sha512-sM4vpsCpcCApagRW5UIjQNlNylo02my2opgp0Emi8x888hZUvJ3dN69Oq20cEGXkMUWnoCrBaB0zyS3yeB87sQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-http': 3.0.4 + '@azure/core-lro': 2.6.0 + '@azure/core-paging': 1.5.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/logger': 1.0.4 + events: 3.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + dev: true + + /@ctrl/tinycolor@4.0.3: + resolution: {integrity: sha512-e9nEVehVJwkymQpkGhdSNzLT2Lr9UTTby+JePq4Z2SxBbOQjY7pLgSouAaXvfaGQVSAaY0U4eJdwfSDmCbItcw==} + engines: {node: '>=14'} + dev: true + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + dev: true + + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: true + + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: true + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: true + + /@ipld/car@5.2.6: + resolution: {integrity: sha512-ZiIYan7UFLLQsR90GpKOrZ0t6/6owrevJI7dCG8McNj0zUO4vGzsPumpKRBP4pdBgek4oXt4TbFOwxqTPEh5mA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-cbor': 9.1.0 + cborg: 4.0.9 + multiformats: 13.0.1 + varint: 6.0.0 + + /@ipld/dag-cbor@9.1.0: + resolution: {integrity: sha512-7pMKjBaapEh+1Nk/1umPPhQGT6znb5E71lke2ekxlcuVZLLrPPdDSy0UAMwWgj3a28cjir/ZJ6CQH2DEs3DUOQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 4.0.9 + multiformats: 13.0.1 + + /@ipld/dag-json@10.1.7: + resolution: {integrity: sha512-ipraTPMA40sZAtUYwFvjHeQjReDJXWI8V3lrOeyedKxMb9rOOCS0B7eodRoWM3RIS2qMqtnu1oZr8kP+QJEN0Q==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 4.0.9 + multiformats: 13.0.1 + + /@ipld/dag-pb@4.0.8: + resolution: {integrity: sha512-693AqMY2jvhe+w4jSwjnDrbhxIu39gm1H4f6/KD5gG+6VFMM6EXV7vq85BvEf8CRsnA0+auWfA29/S8gbWI0Ew==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 13.0.1 + + /@ipld/unixfs@3.0.0: + resolution: {integrity: sha512-Tj3/BPOlnemcZQ2ETIZAO8hqAs9KNzWyX5J9+JCL9jDwvYwjxeYjqJ3v+9DusNvTBmJhZnGVP6ijUHrsuOLp+g==} + dependencies: + '@ipld/dag-pb': 4.0.8 + '@multiformats/murmur3': 2.1.8 + '@perma/map': 1.0.3 + actor: 2.3.1 + multiformats: 13.0.1 + protobufjs: 7.2.6 + rabin-rs: 2.1.0 + + /@itk-wasm/dam@1.1.1: + resolution: {integrity: sha512-7+9L3lrLMKF4y6B6qjs8GqfbpxT0waOJUM14NdMNEA6M+BoBS8fdHREhQHo2s7QMA5O7I+Jv7m+dyqlisGnbdQ==} + hasBin: true + dependencies: + axios: 1.6.7 + commander: 10.0.1 + decompress: 4.2.1 + files-from-path: 1.0.4 + ipfs-car: 1.2.0 + tar: 6.2.0 + transitivePeerDependencies: + - debug + + /@itk-wasm/image-io@1.1.0: + resolution: {integrity: sha512-2uAeBC5F0U/N6FaOLe0MVoOA2h3hizwTBuyZIwaVYoEzCav5a2ZDoCneC9FEpPR6G4VtVvzTlF/G6Eo4d8ofuA==} + dependencies: + axios: 1.6.7 + itk-wasm: 1.0.0-b.166 + mime-types: 2.1.35 + transitivePeerDependencies: + - debug + dev: true + + /@itk-wasm/mesh-io@1.1.0: + resolution: {integrity: sha512-zB+bgbvkWjUmCqjTnw4CSfPfEJr4QaiO/XdDse+0t8GjCcdjqplDIyudCABbzsLjQ+vVZ1t4RsRLnuZJ90+j5Q==} + dependencies: + itk-wasm: 1.0.0-b.166 + mime-types: 2.1.35 + transitivePeerDependencies: + - debug + dev: true + + /@lit-labs/ssr-dom-shim@1.2.0: + resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} + dev: true + + /@lit/react@1.0.3(@types/react@18.2.55): + resolution: {integrity: sha512-RGoPMrAPbFjQFXFbfmYdotw000DyChehTim+d562HRXvFGw//KxouI8jNOcc3Kw/1uqUA1SJqXFtKKxK0NUrww==} + peerDependencies: + '@types/react': 17 || 18 + dependencies: + '@types/react': 18.2.55 + dev: true + + /@lit/reactive-element@2.0.4: + resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.0 + dev: true + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.0 + tar: 6.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@multiformats/blake2@1.0.13: + resolution: {integrity: sha512-T1Kzya0wjj85CaVeRSpJ858EnSvW1pw94GSitxYf84VsNdv5XYbJ6QG8y26Ft1bVALzrUCmqkQrR53QHSyu6RA==} + dependencies: + blakejs: 1.2.1 + multiformats: 9.9.0 + + /@multiformats/murmur3@1.1.3: + resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} + dependencies: + multiformats: 9.9.0 + murmurhash3js-revisited: 3.0.0 + + /@multiformats/murmur3@2.1.8: + resolution: {integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 13.0.1 + murmurhash3js-revisited: 3.0.0 + + /@multiformats/sha3@2.0.17: + resolution: {integrity: sha512-7ik6pk178qLO2cpNucgf48UnAOBMkq/2H92DP4SprZOJqM9zqbVaKS7XyYW6UvhRsDJ3wi921fYv1ihTtQHLtA==} + dependencies: + js-sha3: 0.8.0 + multiformats: 9.9.0 + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@opentelemetry/api@1.7.0: + resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} + engines: {node: '>=8.0.0'} + dev: true + + /@perma/map@1.0.3: + resolution: {integrity: sha512-Bf5njk0fnJGTFE2ETntq0N1oJ6YdCPIpTDn3R3KYZJQdeYSOCNL7mBrFlGnbqav8YQhJA/p81pvHINX9vAtHkQ==} + dependencies: + '@multiformats/murmur3': 2.1.8 + murmurhash3js-revisited: 3.0.0 + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@shoelace-style/animations@1.1.0: + resolution: {integrity: sha512-Be+cahtZyI2dPKRm8EZSx3YJQ+jLvEcn3xzRP7tM4tqBnvd/eW/64Xh0iOf0t2w5P8iJKfdBbpVNE9naCaOf2g==} + dev: true + + /@shoelace-style/localize@3.1.2: + resolution: {integrity: sha512-Hf45HeO+vdQblabpyZOTxJ4ZeZsmIUYXXPmoYrrR4OJ5OKxL+bhMz5mK8JXgl7HsoEowfz7+e248UGi861de9Q==} + dev: true + + /@shoelace-style/shoelace@2.13.1(@types/react@18.2.55): + resolution: {integrity: sha512-QMMvq7xgKzZR5+HEgZvv82V1yDKxucsW3XTbF+Tl5ckkzyXlKtKdY1k0eK9EnWPK482JXjoKeeiBJnrx+h6i4Q==} + engines: {node: '>=14.17.0'} + requiresBuild: true + dependencies: + '@ctrl/tinycolor': 4.0.3 + '@floating-ui/dom': 1.6.3 + '@lit/react': 1.0.3(@types/react@18.2.55) + '@shoelace-style/animations': 1.1.0 + '@shoelace-style/localize': 3.1.2 + composed-offset-position: 0.0.4 + lit: 3.1.2 + qr-creator: 1.0.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@sindresorhus/merge-streams@2.2.1: + resolution: {integrity: sha512-255V7MMIKw6aQ43Wbqp9HZ+VHn6acddERTLiiLnlcPLU9PdTq9Aijl12oklAgUEblLWye+vHLzmqBx6f2TGcZw==} + engines: {node: '>=18'} + dev: true + + /@thewtex/setup-micromamba@1.9.7: + resolution: {integrity: sha512-aP+gLE3dWIidtjhvLwJPb4E/AxmCFMnJd7J3Vdsj9T0hjsPrgTreAnbLod8oetwN2ohrJ5LxKCmtGa0b+lDqbw==} + hasBin: true + dependencies: + '@actions/cache': 3.2.4 + '@actions/core': 1.10.1 + '@actions/exec': 1.1.1 + '@actions/io': 1.1.3 + '@actions/tool-cache': 2.0.1 + fp-ts: 2.16.2 + js-yaml: 4.1.0 + untildify: 5.0.0 + which: 4.0.0 + zod: 3.22.4 + transitivePeerDependencies: + - encoding + dev: true + + /@thewtex/zstddec@0.2.0: + resolution: {integrity: sha512-lIS+smrfa48WGlDVQSQSm0jBnwVp5XmfGJWU9q0J0fRFY9ohzK4s27Zg2SFMb1NWMp9RiANAdK+/q86EBGWR1Q==} + + /@types/emscripten@1.39.10: + resolution: {integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==} + + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + dependencies: + '@types/node': 20.11.17 + form-data: 4.0.0 + dev: true + + /@types/node@20.11.17: + resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + dependencies: + undici-types: 5.26.5 + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + dev: true + + /@types/react@18.2.55: + resolution: {integrity: sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + dev: true + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + dev: true + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: true + + /@types/tunnel@0.0.3: + resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} + dependencies: + '@types/node': 20.11.17 + dev: true + + /@vercel/nft@0.26.4: + resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.11.3 + acorn-import-attributes: 1.9.2(acorn@8.11.3) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + node-gyp-build: 4.8.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@web3-storage/car-block-validator@1.2.0: + resolution: {integrity: sha512-KKQ/M5WtpH/JlkX+bQYKzdG4azmSF495T7vpewje2xh7MBh1d94/BLblxCcLM/larWvXDxOkbAyTTdlECAAuUw==} + dependencies: + '@multiformats/blake2': 1.0.13 + '@multiformats/murmur3': 1.1.3 + '@multiformats/sha3': 2.0.17 + multiformats: 9.9.0 + uint8arrays: 3.1.1 + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + + /acorn-import-attributes@1.9.2(acorn@8.11.3): + resolution: {integrity: sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /actor@2.3.1: + resolution: {integrity: sha512-ST/3wnvcP2tKDXnum7nLCLXm+/rsf8vPocXH2Fre6D8FQwNkGDd4JEitBlXj007VQJfiGYRQvXqwOBZVi+JtRg==} + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true + + /arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} + dev: true + + /arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + dev: true + + /async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /ava@6.1.1: + resolution: {integrity: sha512-A+DG0Ag0e5zvt262Ze0pG5QH7EBmhn+DB9uK7WkUtJVAtGjZFeKTpUOKx339DMGn53+FB24pCJC5klX2WU4VOw==} + engines: {node: ^18.18 || ^20.8 || ^21} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + dependencies: + '@vercel/nft': 0.26.4 + acorn: 8.11.3 + acorn-walk: 8.3.2 + ansi-styles: 6.2.1 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.1.0 + cbor: 9.0.2 + chalk: 5.3.0 + chunkd: 2.0.1 + ci-info: 4.0.0 + ci-parallel-vars: 1.0.1 + cli-truncate: 4.0.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.3.4 + emittery: 1.0.3 + figures: 6.0.1 + globby: 14.0.1 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + memoize: 10.0.0 + ms: 2.1.3 + p-map: 7.0.1 + package-config: 5.0.0 + picomatch: 3.0.1 + plur: 5.1.0 + pretty-ms: 9.0.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.0 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 5.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: true + + /bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + /blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + /buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + /buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /callsites@4.1.0: + resolution: {integrity: sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==} + engines: {node: '>=12.20'} + dev: true + + /cbor@9.0.2: + resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} + engines: {node: '>=16'} + dependencies: + nofilter: 3.1.0 + dev: true + + /cborg@4.0.9: + resolution: {integrity: sha512-xAuZbCDUOZxCe/ZJuIrnlG1Bk1R0qhwCXdnPYxVmqBSqm9M3BeE3G6Qoj5Zq+8epas36bT3vjiInDTJ6BVH6Rg==} + hasBin: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + /chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + dev: true + + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: true + + /ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + dev: true + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + convert-to-spaces: 2.0.1 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comlink@4.4.1: + resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==} + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /composed-offset-position@0.0.4: + resolution: {integrity: sha512-vMlvu1RuNegVE0YsCDSV/X4X10j56mq7PCIyOKK74FxkXzGLwhOUmdkJLSdOBOMwWycobGUMgft2lp+YgTe8hw==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.6.0 + well-known-symbols: 2.0.0 + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true + + /currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + dependencies: + array-find-index: 1.0.2 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + + /decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + + /decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + + /decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + + /decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: true + + /emittery@1.0.3: + resolution: {integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==} + engines: {node: '>=14.16'} + dev: true + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + + /figures@6.0.1: + resolution: {integrity: sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==} + engines: {node: '>=18'} + dependencies: + is-unicode-supported: 2.0.0 + dev: true + + /file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + /file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + /file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: true + + /files-from-path@1.0.4: + resolution: {integrity: sha512-sMNIVdpRh1uCSIaat3qnM3E6aA1C5FVn5/B16z8sN3gIMjZPkxtVCorkEL07xTcCIxVwTXzjU1Ota7Wif6RfQQ==} + engines: {node: '>=18'} + dependencies: + graceful-fs: 4.2.11 + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + dev: true + + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fp-ts@2.16.2: + resolution: {integrity: sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==} + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true + + /get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /globby@14.0.1: + resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 2.2.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /hamt-sharding@3.0.6: + resolution: {integrity: sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==} + dependencies: + sparse-array: 1.3.2 + uint8arrays: 5.0.2 + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} + dev: true + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /interface-blockstore@5.2.10: + resolution: {integrity: sha512-9K48hTvBCGsKVD3pF4ILgDcf+W2P/gq0oxLcsHGB6E6W6nDutYkzR+7k7bCs9REHrBEfKzcVDEKieiuNM9WRZg==} + dependencies: + interface-store: 5.1.8 + multiformats: 13.0.1 + + /interface-store@5.1.8: + resolution: {integrity: sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w==} + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /ipfs-car@1.2.0: + resolution: {integrity: sha512-A++1UesxqwfNv14NmFxr4MHi+vD9rR6SWr87MU9o0315Mzqys48pEefL8rlCAA9cw2qKYeT/ZPYVtqIMAr6U1Q==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@ipld/car': 5.2.6 + '@ipld/dag-cbor': 9.1.0 + '@ipld/dag-json': 10.1.7 + '@ipld/dag-pb': 4.0.8 + '@ipld/unixfs': 3.0.0 + '@web3-storage/car-block-validator': 1.2.0 + files-from-path: 1.0.4 + ipfs-unixfs-exporter: 13.5.0 + multiformats: 13.0.1 + sade: 1.8.1 + varint: 6.0.0 + + /ipfs-unixfs-exporter@13.5.0: + resolution: {integrity: sha512-s1eWXzoyhQFNEAB1p+QE3adjhW+lBdgpORmmjiCLiruHs5z7T5zsAgRVcWpM8LWYhq2flRtJHObb7Hg73J+oLQ==} + dependencies: + '@ipld/dag-cbor': 9.1.0 + '@ipld/dag-json': 10.1.7 + '@ipld/dag-pb': 4.0.8 + '@multiformats/murmur3': 2.1.8 + err-code: 3.0.1 + hamt-sharding: 3.0.6 + interface-blockstore: 5.2.10 + ipfs-unixfs: 11.1.3 + it-filter: 3.0.4 + it-last: 3.0.4 + it-map: 3.0.5 + it-parallel: 3.0.6 + it-pipe: 3.0.1 + it-pushable: 3.2.3 + multiformats: 13.0.1 + p-queue: 8.0.1 + progress-events: 1.0.0 + + /ipfs-unixfs@11.1.3: + resolution: {integrity: sha512-sy6Koojwm/EcM8yvDlycRYA89C8wIcLcGTMMpqnCPUtqTCdl+JxsuPNCBgAu7tmO8Nipm7Tv7f0g/erxTGKKRA==} + dependencies: + err-code: 3.0.1 + protons-runtime: 5.4.0 + uint8arraylist: 2.4.8 + + /irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.1 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + /is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + + /it-filter@3.0.4: + resolution: {integrity: sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==} + dependencies: + it-peekable: 3.0.3 + + /it-last@3.0.4: + resolution: {integrity: sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==} + + /it-map@3.0.5: + resolution: {integrity: sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==} + dependencies: + it-peekable: 3.0.3 + + /it-merge@3.0.3: + resolution: {integrity: sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==} + dependencies: + it-pushable: 3.2.3 + + /it-parallel@3.0.6: + resolution: {integrity: sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==} + dependencies: + p-defer: 4.0.0 + + /it-peekable@3.0.3: + resolution: {integrity: sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==} + + /it-pipe@3.0.1: + resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + it-merge: 3.0.3 + it-pushable: 3.2.3 + it-stream-types: 2.0.1 + + /it-pushable@3.2.3: + resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} + dependencies: + p-defer: 4.0.0 + + /it-stream-types@2.0.1: + resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + + /itk-wasm@1.0.0-b.165: + resolution: {integrity: sha512-Rq0+AL2BuRqcFh9r3h69pB3nt84tw/gTxnI6GjIOYw5Bfah9qO+C8hRJpD8aWNBa5o3wNHRAMVlp0pt/L4K8gg==} + hasBin: true + dependencies: + '@itk-wasm/dam': 1.1.1 + '@thewtex/zstddec': 0.2.0 + '@types/emscripten': 1.39.10 + axios: 1.6.7 + comlink: 4.4.1 + commander: 11.1.0 + fs-extra: 11.2.0 + glob: 8.1.0 + markdown-table: 3.0.3 + mime-types: 2.1.35 + wasm-feature-detect: 1.6.1 + transitivePeerDependencies: + - debug + dev: false + + /itk-wasm@1.0.0-b.166: + resolution: {integrity: sha512-BZZvgUyTT+4DpiLkS7Hahbt+CpR63ckTgyE8li3d6gg3ljqBXfHDavWLiuUIaTA7RXuPUnpIl23jB9z6v77ymA==} + hasBin: true + dependencies: + '@itk-wasm/dam': 1.1.1 + '@thewtex/zstddec': 0.2.0 + '@types/emscripten': 1.39.10 + axios: 1.6.7 + comlink: 4.4.1 + commander: 11.1.0 + fs-extra: 11.2.0 + glob: 8.1.0 + markdown-table: 3.0.3 + mime-types: 2.1.35 + wasm-feature-detect: 1.6.1 + transitivePeerDependencies: + - debug + dev: true + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + /lit-element@4.0.4: + resolution: {integrity: sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.0 + '@lit/reactive-element': 2.0.4 + lit-html: 3.1.2 + dev: true + + /lit-html@3.1.2: + resolution: {integrity: sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==} + dependencies: + '@types/trusted-types': 2.0.7 + dev: true + + /lit@3.1.2: + resolution: {integrity: sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==} + dependencies: + '@lit/reactive-element': 2.0.4 + lit-element: 4.0.4 + lit-html: 3.1.2 + dev: true + + /load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + /matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /memoize@10.0.0: + resolution: {integrity: sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==} + engines: {node: '>=18'} + dependencies: + mimic-function: 5.0.0 + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mimic-function@5.0.0: + resolution: {integrity: sha512-RBfQ+9X9DpXdEoK7Bu+KeEU6vFhumEIiXKWECPzRBmDserEq4uR2b/VCm0LwpMSosoq2k+Zuxj/GzOr0Fn6h/g==} + engines: {node: '>=18'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multiformats@13.0.1: + resolution: {integrity: sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA==} + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + /murmurhash3js-revisited@3.0.0: + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + dev: true + + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /p-defer@4.0.0: + resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==} + engines: {node: '>=12'} + + /p-map@7.0.1: + resolution: {integrity: sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==} + engines: {node: '>=18'} + dev: true + + /p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + engines: {node: '>=18'} + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.2 + + /p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + + /package-config@5.0.0: + resolution: {integrity: sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==} + engines: {node: '>=18'} + dependencies: + find-up-simple: 1.0.0 + load-json-file: 7.0.1 + dev: true + + /parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + dev: true + + /pify@2.3.0: + 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'} + dependencies: + pinkie: 2.0.4 + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + /plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + irregular-plurals: 3.5.0 + dev: true + + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /pretty-ms@9.0.0: + resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} + engines: {node: '>=18'} + dependencies: + parse-ms: 4.0.0 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /progress-events@1.0.0: + resolution: {integrity: sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + + /protobufjs@7.2.6: + resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.11.17 + long: 5.2.3 + + /protons-runtime@5.4.0: + resolution: {integrity: sha512-XfA++W/WlQOSyjUyuF5lgYBfXZUEMP01Oh1C2dSwZAlF2e/ZrMRPfWonXj6BGM+o8Xciv7w0tsRMKYwYEuQvaw==} + dependencies: + uint8-varint: 2.0.4 + uint8arraylist: 2.4.8 + uint8arrays: 5.0.2 + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /qr-creator@1.0.0: + resolution: {integrity: sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rabin-rs@2.1.0: + resolution: {integrity: sha512-5y72gAXPzIBsAMHcpxZP8eMDuDT98qMP1BqSDHRbHkJJXEgWIN1lA47LxUqzsK6jknOJtgfkQr9v+7qMlFDm6g==} + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.8 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: true + + /seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + dependencies: + commander: 2.20.3 + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.13.1 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /shx@0.3.4: + resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} + engines: {node: '>=6'} + hasBin: true + dependencies: + minimist: 1.2.8 + shelljs: 0.8.5 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sparse-array@1.3.2: + resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + dependencies: + is-natural-number: 4.0.1 + + /supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + indent-string: 5.0.0 + js-yaml: 3.14.1 + serialize-error: 7.0.1 + strip-ansi: 7.1.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: true + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uint8-varint@2.0.4: + resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} + dependencies: + uint8arraylist: 2.4.8 + uint8arrays: 5.0.2 + + /uint8arraylist@2.4.8: + resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + dependencies: + uint8arrays: 5.0.2 + + /uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + dependencies: + multiformats: 9.9.0 + + /uint8arrays@5.0.2: + resolution: {integrity: sha512-S0GaeR+orZt7LaqzTRs4ZP8QqzAauJ+0d4xvP2lJTA99jIkKsE2FgDs4tGF/K/z5O9I/2W5Yvrh7IuqNeYH+0Q==} + dependencies: + multiformats: 13.0.1 + + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + dev: true + + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + /untildify@5.0.0: + resolution: {integrity: sha512-bOgQLUnd2G5rhzaTvh1VCI9Fo6bC5cLTpH17T5aFfamyXFYDbbdzN6IXdeoc3jBS7T9hNTmJtYUzJCJ2Xlc9gA==} + engines: {node: '>=16'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + + /vite-plugin-static-copy@0.17.1(vite@4.5.2): + resolution: {integrity: sha512-9h3iaVs0bqnqZOM5YHJXGHqdC5VAVlTZ2ARYsuNpzhEJUHmFqXY7dAK4ZFpjEQ4WLFKcaN8yWbczr81n01U4sQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + chokidar: 3.6.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + picocolors: 1.0.0 + vite: 4.5.2(@types/node@20.11.17) + dev: true + + /vite@4.5.2(@types/node@20.11.17): + resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.11.17 + esbuild: 0.18.20 + postcss: 8.4.35 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /wasm-feature-detect@1.6.1: + resolution: {integrity: sha512-R1i9ED8UlLu/foILNB1ck9XS63vdtqU/tP1MCugVekETp/ySCrBZRk5I/zI67cI1wlQYeSonNm1PLjDHZDNg6g==} + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 3.1.1 + dev: true + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + dev: true + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: true + + /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'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + 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 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..9aef6d7 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'wasm/typescript' diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 39721cd..1d16ade 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,3 +1,7 @@ +if (WASI OR EMSCRIPTEN) + # Avoid RLEImage dependency for wasm builds + return() +endif() itk_module_test() set( MorphologicalContourInterpolationTests diff --git a/wasm/CMakeLists.txt b/wasm/CMakeLists.txt new file mode 100644 index 0000000..2253ac1 --- /dev/null +++ b/wasm/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.16) +project(morphological-contour-interpolation) + +set(CMAKE_CXX_STANDARD 20) + +set(io_components) +if (NOT EMSCRIPTEN) + set(io_components ITKIONIFTI) +endif() +find_package(ITK REQUIRED + COMPONENTS + WebAssemblyInterface + MorphologicalContourInterpolation + ${io_components} + ) +include(${ITK_USE_FILE}) + +add_executable(morphological-contour-interpolation morphological-contour-interpolation.cxx) +target_link_libraries(morphological-contour-interpolation PUBLIC ${ITK_LIBRARIES}) + +enable_testing() + +add_test(NAME morphological-contour-interpolation COMMAND morphological-contour-interpolation + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/64816L_amygdala_int.nii.gz + ${CMAKE_CURRENT_BINARY_DIR}/64816L_amygdala_int.nii.gz + ) \ No newline at end of file diff --git a/wasm/morphological-contour-interpolation.cxx b/wasm/morphological-contour-interpolation.cxx new file mode 100644 index 0000000..12af55c --- /dev/null +++ b/wasm/morphological-contour-interpolation.cxx @@ -0,0 +1,126 @@ +/*========================================================================= + + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkPipeline.h" +#include "itkInputImage.h" +#include "itkOutputImage.h" +#include "itkSupportInputImageTypes.h" + +#include "itkMorphologicalContourInterpolator.h" + +template +int MorphologicalContourInterpolation(itk::wasm::Pipeline &pipeline, const TImage *inputImage) +{ + using ImageType = TImage; + + pipeline.get_option("input-image")->required()->type_name("INPUT_IMAGE"); + + using OutputImageType = itk::wasm::OutputImage; + OutputImageType outputImage; + pipeline.add_option("output-image", outputImage, "The output image")->required()->type_name("OUTPUT_IMAGE"); + + typename ImageType::IndexValueType label = 0; + pipeline.add_option("-l,--label", label, "The label to interpolate. Interpolates all labels if set to 0 (default)."); + + int axis = -1; + pipeline.add_option("-a,--axis", axis, "Interpolate only along this axis. Interpolates along all axes if set to -1 (default)."); + + bool noHeuristicAlignment {false}; + pipeline.add_flag("--no-heuristic-alignment", noHeuristicAlignment, "Heuristic alignment of regions for interpolation is faster than optimal alignment."); + + bool noUseDistanceTransform {false}; + pipeline.add_flag("--no-use-distance-transform", noUseDistanceTransform, "Using distance transform instead of repeated dilations to calculate the median contour is slightly faster, but produces lower quality interpolations."); + + bool useCustomSlicePositions {false}; + pipeline.add_flag("--use-custom-slice-positions", useCustomSlicePositions, "Use custom slice positions (not slice auto-detection)."); + + bool noUseExtrapolation {false}; + pipeline.add_flag("--no-use-extrapolation", noUseExtrapolation, "Perform extrapolation for branch extremities. Branch extremities are defined as regions having no overlap with any region in the next slice. Extrapolation helps generate smooth surface closings."); + + bool useBallStructuringElement; + pipeline.add_flag("--use-ball-structuring-element", useBallStructuringElement, "Use ball instead of default cross structuring element for repeated dilations."); + + int labeledSliceIndicesAxis = -1; + pipeline.add_option("--labeled-slice-indices-axis", labeledSliceIndicesAxis, "Axis along which the labeled slice indices are defined. Default is -1 (that is, auto-detection)."); + + int labeledSliceIndicesLabel = 1; + pipeline.add_option("--labeled-slice-indices-label", labeledSliceIndicesLabel, "Label of the slice indices. Default is 1."); + + std::vector labeledSliceIndices; + pipeline.add_option("--labeled-slice-indices", labeledSliceIndices, "List of labeled slice indices. Default is empty."); + + ITK_WASM_PARSE(pipeline); + + using InterpolatorType = itk::MorphologicalContourInterpolator; + auto interpolator = InterpolatorType::New(); + interpolator->SetInput(inputImage); + + interpolator->SetLabel(label); + interpolator->SetAxis(axis); + interpolator->SetHeuristicAlignment(!noHeuristicAlignment); + interpolator->SetUseDistanceTransform(!noUseDistanceTransform); + interpolator->SetUseCustomSlicePositions(useCustomSlicePositions); + interpolator->SetUseExtrapolation(!noUseExtrapolation); + interpolator->SetUseBallStructuringElement(!useBallStructuringElement); + if (labeledSliceIndicesAxis != -1 && !labeledSliceIndices.empty()) + { + interpolator->SetLabeledSliceIndices(labeledSliceIndicesAxis, labeledSliceIndicesLabel, labeledSliceIndices); + } + + ITK_WASM_CATCH_EXCEPTION(pipeline, interpolator->UpdateLargestPossibleRegion()); + + typename ImageType::ConstPointer output = interpolator->GetOutput(); + outputImage.Set(output); + + return EXIT_SUCCESS; +} + +template +class PipelineFunctor +{ +public: + int operator()(itk::wasm::Pipeline &pipeline) + { + using ImageType = TImage; + + using InputImageType = itk::wasm::InputImage; + InputImageType inputImage; + pipeline.add_option("input-image", inputImage, "The input image"); + + ITK_WASM_PRE_PARSE(pipeline); + + typename ImageType::ConstPointer image = inputImage.Get(); + return MorphologicalContourInterpolation(pipeline, image); + } +}; + +int main(int argc, char *argv[]) +{ + itk::wasm::Pipeline pipeline("morphological-contour-interpolation", "Interpolates contours between slices.", argc, argv); + + return itk::wasm::SupportInputImageTypes::Dimensions<3U>("input-image", pipeline); +} diff --git a/wasm/python/itkwasm-morphological-contour-interpolation-wasi/README.md b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/README.md new file mode 100644 index 0000000..18615b2 --- /dev/null +++ b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/README.md @@ -0,0 +1,26 @@ +# itkwasm-morphological-contour-interpolation-wasi + +[![PyPI version](https://badge.fury.io/py/itkwasm-morphological-contour-interpolation-wasi.svg)](https://badge.fury.io/py/itkwasm-morphological-contour-interpolation-wasi) + +Morphology-based approach for interslice interpolation of anatomical slices from volumetric images. WASI implementation. + +This package provides the WASI WebAssembly implementation. It is usually not called directly. Please use [`itkwasm-morphological-contour-interpolation`](https://pypi.org/project/itkwasm-morphological-contour-interpolation/) instead. + + +## Installation + +```sh +pip install itkwasm-morphological-contour-interpolation-wasi +``` + +## Development + +```sh +pip install pytest itkwasm-image-io +pip install -e . +pytest + +# or +pip install hatch +hatch run test +``` diff --git a/wasm/python/itkwasm-morphological-contour-interpolation-wasi/pyproject.toml b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/pyproject.toml new file mode 100644 index 0000000..24fc9bc --- /dev/null +++ b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + +[project] +name = "itkwasm-morphological-contour-interpolation-wasi" +readme = "README.md" +license = "Apache-2.0" +dynamic = ["version"] +description = "Morphology-based approach for interslice interpolation of anatomical slices from volumetric images." +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: C++", + "Environment :: WebAssembly", + "Environment :: WebAssembly :: Emscripten", + "Environment :: WebAssembly :: WASI", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +keywords = [ + "itkwasm", + "webassembly", + "wasi", +] + +requires-python = ">=3.8" +dependencies = [ + "itkwasm >= 1.0.b145", + "importlib_resources", +] + +[tool.hatch.version] +path = "itkwasm_morphological_contour_interpolation_wasi/_version.py" + +[tool.hatch.envs.default] +dependencies = [ + "pytest", + "itkwasm-image-io", +] + +[project.urls] +Home = "https://github.com/KitwareMedical/ITKMorphologicalContourInterpolation" +Source = "https://github.com/KitwareMedical/ITKMorphologicalContourInterpolation" + +[tool.hatch.envs.default.scripts] +test = "pytest" + + +[tool.hatch.build] +exclude = [ + "/examples", +] diff --git a/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/__init__.py b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/common.py b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/common.py new file mode 100644 index 0000000..3a182e6 --- /dev/null +++ b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/common.py @@ -0,0 +1,6 @@ +from pathlib import Path + +test_input_path = Path(__file__).parent / ".." / ".." / ".." / "test" / "data" / "input" +test_baseline_path = Path(__file__).parent / ".." / ".." / ".." / "test" / "data" / "baseline" +test_output_path = Path(__file__).parent / ".." / ".." / ".." / "test" / "data" / "output" / "python" +test_output_path.mkdir(parents=True, exist_ok=True) \ No newline at end of file diff --git a/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/test_morphological_contour_interpolation.py b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/test_morphological_contour_interpolation.py new file mode 100644 index 0000000..e68e802 --- /dev/null +++ b/wasm/python/itkwasm-morphological-contour-interpolation-wasi/test/test_morphological_contour_interpolation.py @@ -0,0 +1,17 @@ +from itkwasm_image_io import read_image, write_image + +from itkwasm_morphological_contour_interpolation_wasi import morphological_contour_interpolation + +from .common import test_input_path, test_output_path + +def test_morphological_contour_interpolation(): + test_input_file_path = test_input_path / '64816L_amygdala_int.nii.gz' + test_output_file_path = test_output_path / '64816L_amygdala_int.nii.gz' + + image = read_image(test_input_file_path) + interpolated = morphological_contour_interpolation(image) + write_image(interpolated, test_output_file_path) + + test_output_file_path = test_output_path / '64816L_amygdala_int_axis_1.nii.gz' + interpolated = morphological_contour_interpolation(image, axis=1) + write_image(interpolated, test_output_file_path) \ No newline at end of file diff --git a/wasm/test/data/input/64816L_amygdala_int.nii.gz b/wasm/test/data/input/64816L_amygdala_int.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..cedbaaabdcdf7e23f9b6e5b6001f7c6c5ea8d9e0 GIT binary patch literal 49666 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 literal 0 HcmV?d00001 diff --git a/wasm/typescript/package.json b/wasm/typescript/package.json new file mode 100644 index 0000000..bdf1c69 --- /dev/null +++ b/wasm/typescript/package.json @@ -0,0 +1,54 @@ +{ + "name": "@itk-wasm/morphological-contour-interpolation", + "version": "1.0.0", + "packageManager": "pnpm@8.11.0", + "description": "N-D morphology-based approach for interslice interpolation of anatomical slices from volumetric images.", + "type": "module", + "module": "./dist/index.js", + "types": "./dist/index-all.d.ts", + "exports": { + ".": { + "types": "./dist/index-all.d.ts", + "browser": "./dist/index.js", + "node": "./dist/index-node.js", + "default": "./dist/index-all.js" + } + }, + "scripts": { + "start": "pnpm copyShoelaceAssets && vite", + "test": "ava test/node/*test.js", + "build": "pnpm build:tsc && pnpm build:browser:workerEmbedded && pnpm build:browser:workerEmbeddedMin && pnpm build:demo", + "build:browser:workerEmbedded": "esbuild --loader:.worker.js=dataurl --bundle --format=esm --outfile=./dist/bundle/index-worker-embedded.js ./src/index-worker-embedded.ts", + "build:browser:workerEmbeddedMin": "esbuild --minify --loader:.worker.js=dataurl --bundle --format=esm --outfile=./dist/bundle/index-worker-embedded.min.js ./src/index-worker-embedded.min.ts", + "build:tsc": "tsc --pretty", + "copyShoelaceAssets": "shx mkdir -p test/browser/demo-app/public && shx cp -r node_modules/@shoelace-style/shoelace/dist/assets test/browser/demo-app/public/", + "build:demo": "pnpm copyShoelaceAssets && vite build" + }, + "keywords": [ + "itk", + "wasm", + "webassembly", + "wasi" + ], + "author": "", + "license": "Apache-2.0", + "dependencies": { + "itk-wasm": "1.0.0-b.165" + }, + "devDependencies": { + "@itk-wasm/image-io": "^1.1.0", + "@itk-wasm/mesh-io": "^1.1.0", + "@shoelace-style/shoelace": "^2.12.0", + "@types/node": "^20.2.5", + "ava": "^6.1.1", + "esbuild": "^0.19.8", + "shx": "^0.3.4", + "typescript": "^5.3.2", + "vite": "^4.5.0", + "vite-plugin-static-copy": "^0.17.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/KitwareMedical/ITKMorphologicalContourInterpolation" + } +} diff --git a/wasm/typescript/test/node/common.js b/wasm/typescript/test/node/common.js new file mode 100644 index 0000000..19b1d25 --- /dev/null +++ b/wasm/typescript/test/node/common.js @@ -0,0 +1,7 @@ +import path from 'path' +import fs from 'fs' + +export const testInputPath = path.resolve('..', 'test', 'data', 'input') +export const testBaselinePath = path.resolve('..', 'test', 'data', 'baseline') +export const testOutputPath = path.resolve('..', 'test', 'data', 'output', 'typescript') +fs.mkdirSync(testOutputPath, { recursive: true }) \ No newline at end of file diff --git a/wasm/typescript/test/node/morphological-contour-interpolation-test.js b/wasm/typescript/test/node/morphological-contour-interpolation-test.js new file mode 100644 index 0000000..0aa50b7 --- /dev/null +++ b/wasm/typescript/test/node/morphological-contour-interpolation-test.js @@ -0,0 +1,22 @@ +import test from 'ava' +import path from 'path' + +import { readImageNode, writeImageNode } from '@itk-wasm/image-io' + +import { morphologicalContourInterpolationNode } from '../../dist/index-node.js' +import { testInputPath, testOutputPath } from './common.js' + +test('Test morphologicalContourInterpolationNode', async t => { + const testInputFilePath = path.join(testInputPath, '64816L_amygdala_int.nii.gz') + let testOutputFilePath = path.join(testOutputPath, '64816L_amygdala_int.nii.gz') + + const image = await readImageNode(testInputFilePath) + const { outputImage } = await morphologicalContourInterpolationNode(image) + await writeImageNode(outputImage, testOutputFilePath) + + testOutputFilePath = path.join(testOutputPath, '64816L_amygdala_int_axis_1.nii.gz') + const { outputImage: outputImageAxis1 } = await morphologicalContourInterpolationNode(image, { axis: 1 }) + await writeImageNode(outputImageAxis1, testOutputFilePath) + + t.pass() +}) From 97645a616eab70f57c671c33ab6e5cd914ffe630 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 15 Feb 2024 11:33:38 -0500 Subject: [PATCH 2/4] STYLE: Apply clang-format to morphological-contour-interpolation.cxx To address CI check. --- .../itkMorphologicalContourInterpolator.hxx | 4 +- wasm/morphological-contour-interpolation.cxx | 115 +++++++++--------- 2 files changed, 59 insertions(+), 60 deletions(-) diff --git a/include/itkMorphologicalContourInterpolator.hxx b/include/itkMorphologicalContourInterpolator.hxx index ba9b998..87d28b3 100644 --- a/include/itkMorphologicalContourInterpolator.hxx +++ b/include/itkMorphologicalContourInterpolator.hxx @@ -713,7 +713,7 @@ MorphologicalContourInterpolator< TImage >::Interpolate1to1( int axis, TImage* o } } -#if !defined(__wasi__) && !defined(__EMSCRIPTEN__) +#if !defined( __wasi__ ) && !defined( __EMSCRIPTEN__ ) static std::mutex mutexLock; #endif if ( withinReq ) // else we should not write it @@ -721,7 +721,7 @@ MorphologicalContourInterpolator< TImage >::Interpolate1to1( int axis, TImage* o seqIt.GoToBegin(); // writing through one RLEImage iterator invalidates all the others // so this whole writing loop needs to be serialized -#if !defined(__wasi__) && !defined(__EMSCRIPTEN__) +#if !defined( __wasi__ ) && !defined( __EMSCRIPTEN__ ) std::lock_guard< std::mutex > mutexHolder( mutexLock ); #endif ImageRegionIterator< TImage > outIt( out, outRegion ); diff --git a/wasm/morphological-contour-interpolation.cxx b/wasm/morphological-contour-interpolation.cxx index 12af55c..7bcd198 100644 --- a/wasm/morphological-contour-interpolation.cxx +++ b/wasm/morphological-contour-interpolation.cxx @@ -16,111 +16,110 @@ * *=========================================================================*/ -#include "itkPipeline.h" #include "itkInputImage.h" #include "itkOutputImage.h" +#include "itkPipeline.h" #include "itkSupportInputImageTypes.h" #include "itkMorphologicalContourInterpolator.h" -template -int MorphologicalContourInterpolation(itk::wasm::Pipeline &pipeline, const TImage *inputImage) +template< typename TImage > +int +MorphologicalContourInterpolation( itk::wasm::Pipeline& pipeline, const TImage* inputImage ) { using ImageType = TImage; - pipeline.get_option("input-image")->required()->type_name("INPUT_IMAGE"); + pipeline.get_option( "input-image" )->required()->type_name( "INPUT_IMAGE" ); - using OutputImageType = itk::wasm::OutputImage; + using OutputImageType = itk::wasm::OutputImage< ImageType >; OutputImageType outputImage; - pipeline.add_option("output-image", outputImage, "The output image")->required()->type_name("OUTPUT_IMAGE"); + pipeline.add_option( "output-image", outputImage, "The output image" )->required()->type_name( "OUTPUT_IMAGE" ); typename ImageType::IndexValueType label = 0; - pipeline.add_option("-l,--label", label, "The label to interpolate. Interpolates all labels if set to 0 (default)."); + pipeline.add_option( "-l,--label", label, "The label to interpolate. Interpolates all labels if set to 0 (default)." ); int axis = -1; - pipeline.add_option("-a,--axis", axis, "Interpolate only along this axis. Interpolates along all axes if set to -1 (default)."); + pipeline.add_option( "-a,--axis", axis, "Interpolate only along this axis. Interpolates along all axes if set to -1 (default)." ); - bool noHeuristicAlignment {false}; - pipeline.add_flag("--no-heuristic-alignment", noHeuristicAlignment, "Heuristic alignment of regions for interpolation is faster than optimal alignment."); + bool noHeuristicAlignment{ false }; + pipeline.add_flag( "--no-heuristic-alignment", noHeuristicAlignment, "Heuristic alignment of regions for interpolation is faster than optimal alignment." ); - bool noUseDistanceTransform {false}; - pipeline.add_flag("--no-use-distance-transform", noUseDistanceTransform, "Using distance transform instead of repeated dilations to calculate the median contour is slightly faster, but produces lower quality interpolations."); + bool noUseDistanceTransform{ false }; + pipeline.add_flag( "--no-use-distance-transform", + noUseDistanceTransform, + "Using distance transform instead of repeated dilations to calculate the median contour is slightly faster, but produces lower quality interpolations." ); - bool useCustomSlicePositions {false}; - pipeline.add_flag("--use-custom-slice-positions", useCustomSlicePositions, "Use custom slice positions (not slice auto-detection)."); + bool useCustomSlicePositions{ false }; + pipeline.add_flag( "--use-custom-slice-positions", useCustomSlicePositions, "Use custom slice positions (not slice auto-detection)." ); - bool noUseExtrapolation {false}; - pipeline.add_flag("--no-use-extrapolation", noUseExtrapolation, "Perform extrapolation for branch extremities. Branch extremities are defined as regions having no overlap with any region in the next slice. Extrapolation helps generate smooth surface closings."); + bool noUseExtrapolation{ false }; + pipeline.add_flag( "--no-use-extrapolation", + noUseExtrapolation, + "Perform extrapolation for branch extremities. Branch extremities are defined as regions having no overlap with any region in the next slice. Extrapolation helps generate smooth " + "surface closings." ); bool useBallStructuringElement; - pipeline.add_flag("--use-ball-structuring-element", useBallStructuringElement, "Use ball instead of default cross structuring element for repeated dilations."); + pipeline.add_flag( "--use-ball-structuring-element", useBallStructuringElement, "Use ball instead of default cross structuring element for repeated dilations." ); int labeledSliceIndicesAxis = -1; - pipeline.add_option("--labeled-slice-indices-axis", labeledSliceIndicesAxis, "Axis along which the labeled slice indices are defined. Default is -1 (that is, auto-detection)."); + pipeline.add_option( "--labeled-slice-indices-axis", labeledSliceIndicesAxis, "Axis along which the labeled slice indices are defined. Default is -1 (that is, auto-detection)." ); int labeledSliceIndicesLabel = 1; - pipeline.add_option("--labeled-slice-indices-label", labeledSliceIndicesLabel, "Label of the slice indices. Default is 1."); + pipeline.add_option( "--labeled-slice-indices-label", labeledSliceIndicesLabel, "Label of the slice indices. Default is 1." ); - std::vector labeledSliceIndices; - pipeline.add_option("--labeled-slice-indices", labeledSliceIndices, "List of labeled slice indices. Default is empty."); + std::vector< typename ImageType::IndexValueType > labeledSliceIndices; + pipeline.add_option( "--labeled-slice-indices", labeledSliceIndices, "List of labeled slice indices. Default is empty." ); - ITK_WASM_PARSE(pipeline); + ITK_WASM_PARSE( pipeline ); - using InterpolatorType = itk::MorphologicalContourInterpolator; + using InterpolatorType = itk::MorphologicalContourInterpolator< ImageType >; auto interpolator = InterpolatorType::New(); - interpolator->SetInput(inputImage); - - interpolator->SetLabel(label); - interpolator->SetAxis(axis); - interpolator->SetHeuristicAlignment(!noHeuristicAlignment); - interpolator->SetUseDistanceTransform(!noUseDistanceTransform); - interpolator->SetUseCustomSlicePositions(useCustomSlicePositions); - interpolator->SetUseExtrapolation(!noUseExtrapolation); - interpolator->SetUseBallStructuringElement(!useBallStructuringElement); - if (labeledSliceIndicesAxis != -1 && !labeledSliceIndices.empty()) - { - interpolator->SetLabeledSliceIndices(labeledSliceIndicesAxis, labeledSliceIndicesLabel, labeledSliceIndices); - } - - ITK_WASM_CATCH_EXCEPTION(pipeline, interpolator->UpdateLargestPossibleRegion()); + interpolator->SetInput( inputImage ); + + interpolator->SetLabel( label ); + interpolator->SetAxis( axis ); + interpolator->SetHeuristicAlignment( !noHeuristicAlignment ); + interpolator->SetUseDistanceTransform( !noUseDistanceTransform ); + interpolator->SetUseCustomSlicePositions( useCustomSlicePositions ); + interpolator->SetUseExtrapolation( !noUseExtrapolation ); + interpolator->SetUseBallStructuringElement( !useBallStructuringElement ); + if ( labeledSliceIndicesAxis != -1 && !labeledSliceIndices.empty() ) + { + interpolator->SetLabeledSliceIndices( labeledSliceIndicesAxis, labeledSliceIndicesLabel, labeledSliceIndices ); + } + + ITK_WASM_CATCH_EXCEPTION( pipeline, interpolator->UpdateLargestPossibleRegion() ); typename ImageType::ConstPointer output = interpolator->GetOutput(); - outputImage.Set(output); + outputImage.Set( output ); return EXIT_SUCCESS; } -template +template< typename TImage > class PipelineFunctor { public: - int operator()(itk::wasm::Pipeline &pipeline) + int + operator()( itk::wasm::Pipeline& pipeline ) { using ImageType = TImage; - using InputImageType = itk::wasm::InputImage; + using InputImageType = itk::wasm::InputImage< ImageType >; InputImageType inputImage; - pipeline.add_option("input-image", inputImage, "The input image"); + pipeline.add_option( "input-image", inputImage, "The input image" ); - ITK_WASM_PRE_PARSE(pipeline); + ITK_WASM_PRE_PARSE( pipeline ); typename ImageType::ConstPointer image = inputImage.Get(); - return MorphologicalContourInterpolation(pipeline, image); + return MorphologicalContourInterpolation< ImageType >( pipeline, image ); } }; -int main(int argc, char *argv[]) +int +main( int argc, char* argv[] ) { - itk::wasm::Pipeline pipeline("morphological-contour-interpolation", "Interpolates contours between slices.", argc, argv); - - return itk::wasm::SupportInputImageTypes::Dimensions<3U>("input-image", pipeline); + itk::wasm::Pipeline pipeline( "morphological-contour-interpolation", "Interpolates contours between slices.", argc, argv ); + + return itk::wasm::SupportInputImageTypes< PipelineFunctor, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t >::Dimensions< 3U >( "input-image", pipeline ); } From 115755f512eb505bee9bd7fc86dec8ef5d33be91 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 15 Feb 2024 15:29:23 -0500 Subject: [PATCH 3/4] DOC: Convert README to markdown, add wasm links Demo app, python, javascript docs. Order language installation into from likely most used to least used. --- README.md | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..420e6e9 --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +# ITKMorphologicalContourInterpolation + +![Build, test, package](https://github.com/KitwareMedical/ITKMorphologicalContourInterpolation/workflows/Build,%20test,%20package/badge.svg) + +[![PyPI](https://img.shields.io/pypi/v/itk-morphologicalcontourinterpolation.svg)](https://pypi.python.org/pypi/itk-morphologicalcontourinterpolation) + +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/KitwareMedical/ITKMorphologicalContourInterpolation/blob/master/LICENSE) + +## Overview + +An [ITK](https://itk.org)-based implementation of morphological contour interpolation based off the paper: + +Albu AB1, Beugeling T, Laurendeau D. +"A morphology-based approach for interslice interpolation of anatomical slices from volumetric images." +IEEE Trans Biomed Eng. +2008 Aug;55(8):2022-38. +doi: 10.1109/TBME.2008.921158. + +👨‍💻 [`Live API Demo`] ✨ + +Documentation can be found in the [Insight Journal article](https://www.insight-journal.org/browse/publication/977): + +Zukić D., Vicory J., McCormick M., Wisse L., Gerig G., Yushkevich P., Aylward S. +"ND Morphological Contour Interpolation", +The Insight Journal. January-December, 2016. +https://hdl.handle.net/10380/3563 +https://insight-journal.org/browse/publication/977 + +- 🕮 [`Wasm Python Documentation`] 📚 +- 🕮 [`JavaScript Documentation`] 📚 + +## Installation + +### Python + +To install the wasm Python packages: + +```sh +pip install itkwasm-morphological-contour-interpolation +``` + +To install the native Python packages: + +```sh +python -m pip install --upgrade pip +python -m pip install itk-morphologicalcontourinterpolation +``` + +### JavaScript + +Install the JavaScript/TypeScript package: + +```sh +npm install @itk-wasm/morphological-contour-interpolation +``` + +### C++ + +Since ITK 4.11.0, this module is available in the ITK source tree as a remote module. To enable it, set: + +``` +Module_MorphologicalContourInterpolation:BOOL=ON +``` + +in ITK's CMake build configuration. + +## License + +This software is distributed under the Apache 2.0 license. Please see the *LICENSE* file for details. + +## Acknowledgements + +This work is supported by NIH grant R01 EB014346, "Continued development and maintenance of the ITK-SNAP 3D image segmentation software." + +[`Live API Demo`]: https://kitwaremedical.github.io/ITKMorphologicalContourInterpolation/ts/app/ +[`Wasm Python Documentation`]: https://kitwaremedical.github.io/ITKMorphologicalContourInterpolation/py/docs/ +[`JavaScript Documentation`]: https://kitwaremedical.github.io/ITKMorphologicalContourInterpolation/ts/docs/ \ No newline at end of file From c343d9073cde1d99b9f09974e0e9377ca022d2df Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Thu, 15 Feb 2024 16:01:36 -0500 Subject: [PATCH 4/4] DOC: Update javascript API and add app, docs links The previous docs generated had the wrong API. --- wasm/typescript/README.md | 132 +++++++++++++++++++++++++++++++++++ wasm/typescript/package.json | 2 +- 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 wasm/typescript/README.md diff --git a/wasm/typescript/README.md b/wasm/typescript/README.md new file mode 100644 index 0000000..9758ef1 --- /dev/null +++ b/wasm/typescript/README.md @@ -0,0 +1,132 @@ +# @itk-wasm/morphological-contour-interpolation + +- 👨‍💻 [`Live API Demo`](https://kitwaremedical.github.io/ITKMorphologicalContourInterpolation/ts/app/) ✨ +- 🕮 [`JavaScript Documentation`](https://kitwaremedical.github.io/ITKMorphologicalContourInterpolation/ts/docs/) 📚 + +[![npm version](https://badge.fury.io/js/@itk-wasm%2Fmorphological-contour-interpolation.svg)](https://www.npmjs.com/package/@itk-wasm/morphological-contour-interpolation) + +> Morphology-based approach for interslice interpolation of anatomical slices from volumetric images. + +## Installation + +```sh +npm install @itk-wasm/morphological-contour-interpolation +``` + +## Usage + +### Browser interface + +Import: + +```js +import { + morphologicalContourInterpolation, + setPipelinesBaseUrl, + getPipelinesBaseUrl, +} from "@itk-wasm/morphological-contour-interpolation" +``` + +#### morphologicalContourInterpolation + +*Interpolates contours between slices.* + +```ts +async function morphologicalContourInterpolation( + inputImage: Image, + options: MorphologicalContourInterpolationOptions = {} +) : Promise +``` + +| Parameter | Type | Description | +| :----------: | :-----: | :-------------- | +| `inputImage` | *Image* | The input image | + +**`MorphologicalContourInterpolationOptions` interface:** + +| Property | Type | Description | +| :-------------------------: | :-------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `label` | *number* | The label to interpolate. Interpolates all labels if set to 0 (default). | +| `axis` | *number* | Interpolate only along this axis. Interpolates along all axes if set to -1 (default). | +| `noHeuristicAlignment` | *boolean* | Heuristic alignment of regions for interpolation is faster than optimal alignment. | +| `noUseDistanceTransform` | *boolean* | Using distance transform instead of repeated dilations to calculate the median contour is slightly faster, but produces lower quality interpolations. | +| `useCustomSlicePositions` | *boolean* | Use custom slice positions (not slice auto-detection). | +| `noUseExtrapolation` | *boolean* | Perform extrapolation for branch extremities. Branch extremities are defined as regions having no overlap with any region in the next slice. Extrapolation helps generate smooth surface closings. | +| `useBallStructuringElement` | *boolean* | Use ball instead of default cross structuring element for repeated dilations. | +| `labeledSliceIndicesAxis` | *number* | Axis along which the labeled slice indices are defined. Default is -1 (that is, auto-detection). | +| `labeledSliceIndicesLabel` | *number* | Label of the slice indices. Default is 1. | +| `labeledSliceIndices` | *number[]* | List of labeled slice indices. Default is empty. | +| `webWorker` | *null or Worker or boolean* | WebWorker for computation. Set to null to create a new worker. Or, pass an existing worker. Or, set to `false` to run in the current thread / worker. | +| `noCopy` | *boolean* | When SharedArrayBuffer's are not available, do not copy inputs. | + +**`MorphologicalContourInterpolationResult` interface:** + +| Property | Type | Description | +| :-----------: | :------: | :------------------------------ | +| `outputImage` | *Image* | The output image | +| `webWorker` | *Worker* | WebWorker used for computation. | + +#### setPipelinesBaseUrl + +*Set base URL for WebAssembly assets when vendored.* + +```ts +function setPipelinesBaseUrl( + baseUrl: string | URL +) : void +``` + +#### getPipelinesBaseUrl + +*Get base URL for WebAssembly assets when vendored.* + +```ts +function getPipelinesBaseUrl() : string | URL +``` + + +### Node interface + +Import: + +```js +import { + morphologicalContourInterpolationNode, +} from "@itk-wasm/morphological-contour-interpolation" +``` + +#### morphologicalContourInterpolationNode + +*Interpolates contours between slices.* + +```ts +async function morphologicalContourInterpolationNode( + inputImage: Image, + options: MorphologicalContourInterpolationNodeOptions = {} +) : Promise +``` + +| Parameter | Type | Description | +| :----------: | :-----: | :-------------- | +| `inputImage` | *Image* | The input image | + +**`MorphologicalContourInterpolationNodeOptions` interface:** + +| Property | Type | Description | +| :-------------------------: | :--------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `label` | *number* | The label to interpolate. Interpolates all labels if set to 0 (default). | +| `axis` | *number* | Interpolate only along this axis. Interpolates along all axes if set to -1 (default). | +| `noHeuristicAlignment` | *boolean* | Heuristic alignment of regions for interpolation is faster than optimal alignment. | +| `noUseDistanceTransform` | *boolean* | Using distance transform instead of repeated dilations to calculate the median contour is slightly faster, but produces lower quality interpolations. | +| `useCustomSlicePositions` | *boolean* | Use custom slice positions (not slice auto-detection). | +| `noUseExtrapolation` | *boolean* | Perform extrapolation for branch extremities. Branch extremities are defined as regions having no overlap with any region in the next slice. Extrapolation helps generate smooth surface closings. | +| `useBallStructuringElement` | *boolean* | Use ball instead of default cross structuring element for repeated dilations. | +| `labeledSliceIndicesAxis` | *number* | Axis along which the labeled slice indices are defined. Default is -1 (that is, auto-detection). | +| `labeledSliceIndicesLabel` | *number* | Label of the slice indices. Default is 1. | +| `labeledSliceIndices` | *number[]* | List of labeled slice indices. Default is empty. | + +**`MorphologicalContourInterpolationNodeResult` interface:** + +| Property | Type | Description | +| :-----------: | :-----: | :--------------- | +| `outputImage` | *Image* | The output image | diff --git a/wasm/typescript/package.json b/wasm/typescript/package.json index bdf1c69..88df5fb 100644 --- a/wasm/typescript/package.json +++ b/wasm/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@itk-wasm/morphological-contour-interpolation", - "version": "1.0.0", + "version": "1.0.1", "packageManager": "pnpm@8.11.0", "description": "N-D morphology-based approach for interslice interpolation of anatomical slices from volumetric images.", "type": "module",